[Q] Budding developer with a fleshed-out idea for a musical Android app - Android Q&A, Help & Troubleshooting

Hi everyone, I'm a longtime lurker on this forum, but this is the first second thread I've opened. I've just begun studying at the university level, majoring in mechatronics systems engineering and minoring in computing science. I've done a lot of research in the area of music theory, and I discovered peculiar arrangement of musical notes which I call a "pitch-correct harmonic note table" (Google it for a higher resolution than the attached image; I'm too new to post links).
The concept has been explored in the past (see Wikipedia's harmonic note table layout) and the interesting thing about it is that it visually reveals how notes and chords are related to each other. My version, unlike every other one I've found, preserves the proper pitch spelling. A C minor chord, for example, is properly notated as C-Eb-G, not C-D#-G.
The table by itself can prove useful for those learning theory and composition, but right now it's just a picture. Here's where Android application development comes in. I hope to turn this picture into an interactive chord-generating device. It'd be like a guitar, except anyone can pick it up and create music with it, as the chords are easy to play and the relationships are obvious.
The application's general flow would go something like this: First, select a key signature (which positions the purple ribbon), time signature and tempo. Hold down the root of the desired chord. Slide your finger up to select its major chord or down to select its minor chord, and release. Press the root again to play the chord or press a different note (like the seventh) to play an extended chord. The chord will loop until you perform that last step again for a different chord (selecting another chord by touching and sliding does not interrupt the looping).
However, here's where my inexperience with development hinders my progress with this application. I've only taken one programming course and it was in C. I'm taking the Java course now but we're only going as far as the command line. I'm therefore at a loss as to where to begin. I have the SDK and Eclipse all set up and I have some basic ideas for how I would go about coding the notes, like using the "fifths" and "augmented" axes to create a rectangular grid instead of trying to use the hexagonal grid that the table is currently in. I'm probably going to end up creating a playChord() method with parameters for root, quality, extension, and bass. I'm not sure whether to use Canvas or OpenGL; I'm not sure whether to use JetPlayer or MediaPlayer, .mid's or .mp3's or .ogg's, or generate the chords on the fly; I'm not even sure how I'm going to voice the chords (though my Casio keyboard might be able to help with that).
Most of those issues I can worry about later though. For now I'm going to focus on creating something like a soundboard except more refined. This is why I looked to XDA - to give me an initial push in the right direction so I can avoid coding myself into a corner and having to start over. If you can give me any tips or advice, I'll greatly appreciate it. =)

Bump? =)

Related

Help me organize an interface

I have a new Sprint Touch Pro 2 with 6.5 and 2.5, stock ROM. The Today screen works. However, as a smart phone, it really isn't usable as-is. There is a total of 9 quicklinks, and the start menu is a mess. If you move things in the start menu, you break the quicklinks, so best to leave things where they land. Whatever it is that works to organize the interface needs to show unread e-mails, voice mails, and texts on the home/today screen, and a link to contacts, not that lame people thing. I get around this with the stock interface by dropping people out of the slider and pointing one of the top quicklinks to contacts. When I click on a new text message from the slider, it's pretty clumsey if you ask me. I have to look around for delete all etc. Lots of mouse clicks. I've been looking around at the likely suspects and would value your input.
Edit:
1. SPB Mobile Shell 3.5: I installed it for the third time and worked with it. My impression is that it is more about personalization and special effects. My impression is the pieces are not logically woven together to create an environment. First there is the home tab, with exactly 3 home pages, one left, and one right. There are a collection widgets that I can put on them. Second, there is a launcher. The Launcher has some impressive graphics for launching things. However, is seems to represent their concept of organizing the Start Menu into folders. You can see them if you click on the Start Menu. To me, it was confusing. The third area is the Carousel. It is very nice idea for organizing things, but it's pretty much pre-defined. I won't be coming back here because it doesn't match my needs or organizing the many apps the way I want to. It's easy on memory, 42%.
2. I worked with iPhoneToday, today. It has things like voicemail, e-mail, texts, etc. on a bottom row which does not scroll, so the important stuff is always visible. It's perfect for organization. You can add home screens at will and even label then on the top. You can change programs and the tabs they use. You can point them at the .exes or the shortcuts in the Start menu. You change the icon spacing and even have them scale to get more on a line. It's the easiest on RAM coming in at 39%. From an appearance standpoint, they really try. True to it's name, it closely resembles the iPhone. (Rubic's Cube) It uses the same size square icons for everything from volume, battery, etc., to e-mail, texts, etc. It just puts a number on the cube. You look around a bit to find what you want. It would look pretty good to someone who hasn't seen Sense. There are not real docs. The basics your will figure out by simply guessing. The other types of formatting are not as straightforward as CHT. The best source I've found is the wiki http://iphonetoday.wikidot.com/the-menus and to ask questions on the thread: http://forum.xda-developers.com/showthread.php?t=633618 where people have been very responsive and helpful. Before I tried it, I just thought it was for iPhone wanabes. Not so. Unlike Sense and Mobile Shell, it is in fact a very well thought out environment when you're looking to use your phone as a single device to organize your world.
3. CHT 2.0: Sense by itself doesn't make any sense. Since people have been hammering me to try CHT, I've been following the CHT threads, 1.85 and 2.0. Normally, it makes sense to go with the newer one because that is where development would be, but my concern is the new 2.0 seems to have worn out the Cookie Monster, and he would be too worn out to support it. However, I decided to try 2.0 since the he wrote every line was gone through and made squeaky clean, and he did stick around long enough to wean the product.
Of the hundreds of posts I read, many say it's pretty resource intensive, and not so good for multi-taskers. (Like me) That makes sense, since it adds functionality to the an already pretty good size Sense UI, so that became my expectation. I started thinking that if it adds say 10%, it would make sense that things would get shaky, pretty quickly. Thus it made sense to test before and after adding CHT. The percent RAM usage came in at exactly 52%, and remained there even after using it for awhile. Since iPhoneToday can be run inside Sense, I'm doing that now. What doesn't make sense is it only requires an additional 2% of RAM.
As for multi-tasking, I'm running out of porkers to load and I'm at 72%. (See attached images) After these screen shots I added Oprah and iPhoneToday, which is a UI on top of a UI. After playing around, I was able to get it to 77%. That's more apps than a 5 person office runs at a time. It still loads things fast. Initially, I thought scrolling perhaps was degraded slightly, but later I did before and after and even that wasn't affected. Maybe I don't have to worry.
As for the CHT UI, I read the User's Manual. It's only 12 pages, and 1/3 has to do with installing it. It's simple enough to where if you read it once to understand the paradigm it uses, you won't need to refer to again. I plan to run iPhoneToday inside of Sense/CHT and organize both to see which I like the best.
Edit It was tough to choose between Cookies Home Tab 2.0, AKA CHT 2.0, and iPhoneToday. You can't lose with either because the struggle is to pick the best of the best, rather than pick your poison. iPhoneToday is light, fast, and smooth. It would win if I were a fan of the iPhone interface, but I'm not a fan of anything except functionality and efficiency. In the end I went with Cookies Home Tab 2.0 for these reasons.
- It allows me to use widgets, and place them wherever I need.
- It allows me to place quicklinks called FreeLinks anywhere
- It allows me to have levels (scroll up and down) as well as pages (scroll side to side)
- If it doesn't support what you want directly, you can indirectly. Example: Let's say you want QuickLinks on all of your pages, line the iPhone, but not on the home screen where you have your clock weather. Just make the upper rows on your home screen invisible. Lets say you want one row of QuickLinks to be the same on every page. Simply pin them.
- There is no practical limitation that I've found as to how you arrange things. I can't say that about anything else I've tried.
- Configuration is easier to understand. The book is only 12 pages, 1/3 is install, another 1/3 is common sense, and the other 1/3 tells doesn't lead you step by step, it gives you the concept of operation. Because of that, once you read it, you'll never have to refer back to the manual.
I may not have gotten any help from the thread this time around, but other threads and people here have helped me plenty. Apparently, it was my turn to give back.
Enjoy!
PS: I also played with ThrottleLauncher and the WP7 clone. It didn't make the cut because its organizational capabilities are far too limited for someone like me (IT Architect) who has lots of apps. It's more for people who's life revolves around a close group of friends, music, and social networking. This is not a problem with ThrottleLauncher itself, but rather the design of the WP7 architecture. The real phone has the same problem.

[APP][GAME][Peg Solitaire]

Another example of C++ Win32 minimalist programming from the 'stephj' stable. The whole lot fits in one 17Kb executable.
The peg version of 'solitaire' as usually played with a wooden board and marbles. To play, hop one counter over another into an empty square on the far side either horizontally or vertically, and remove the counter that has been jumped over. Click or tap the counter you wish to move, and if it can be moved, all possible target positions for it will be highlighted in dark grey. Click or tap one of these targets and it will hop over and remove the 'jumped over' counter.
The object is to end up with one solitary counter in the middle of the board. Easier said than done, so there is a useful 'Undo' function allowing you to back out the previous move, all the way back to the starting pattern if you wish. Try that with the real marble version! There are fourteen patterns from which to start, the default being the 'Classic' starting position. All are solvable, start with the Cross pattern if you are struggling!
Here's the clever stuff:- It will run on any ARM powered Pocket PC or Smartphone from 2003 onwards. (ARMv4 onwards, possibly even 2002, I haven't had chance to test it on this platform.) It will also handle any sized screen as it dynamically resizes to fit it. Portrait, landscape, square or HVGA. Who cares, bring it on! The HVGA compatability should help quell the increasingly vociferous HD Mini owners, who are not too keen when Apps look a mess on their devices.
A Smartphone has no touch screen, and as such the white dot appears as a cursor. Move it with the D-Pad to the counter you wish to move and press the centre button. Possible targets appear dark grey as above, move the cursor to the target, and press the centre button again to hop over.
The program is aware when you run out of possible moves and will tell you so. Land the last counter in the middle hole to successfully complete the puzzle.
On your device the card game Solitaire provided by Microsoft, is included as part of the standard OS. It exists as a .lnk to the real executable. This program is an .exe file of the same name but it identifies itself to Windows Mobile as PegSolitaire so that it will not conflict with the cards game, if they are running simultaneously.
It is possible to drop the executable into \Windows\Start Menu\Programs\Games and it will live next to the real MS Solitaire program link - See the StartMenu image. If on your device the card game is stored here as Solitaire.exe, rename the attached file to 'Peg Solitaire.exe' or whatever you want to call it.
Only the executable is required, as all the DLLs it uses are already on your device.
It used to have quite nice 3D rendered counters, but the trials and tribulations of getting it to run on as many different displays as possible, without it looking dreadful, was just not worth the hassle. Eventually I opted to drop the 3D stuff for the retro look, as seen below.
Happy puzzling!
Patterns bug.
If you were one of those who downloaded this before the date of this post, there is a bug in the shapes section of the menu.
The Circle, Double Arrow and Diamond patterns did not match the menu. They pointed to the next one of these three.
This problem has now been fixed and the app reloaded.
My apologies for the inconvenience.
CE version added.
This has now been ported over to run on ARM powered CE devices.
Do NOT run the CE version on your Windows Mobile phone or Smartphone, and likewise, do NOT run the phone version on a CE device.
If you do, the display looks awful. You have been warned.
Happy puzzling, stephj.
CE version added.
Doesn't work in Windows Embedded CE 6.0 Professional (800x480): Initial screen properly shown (looks great), but then no reaction to stylus.
I have run this on the 4.1 and 5.0 CE SDK emulators, and it works a treat. Unfortunately I do not have a real 'CE' device to test it on but I may be able to get access to one if required.
Remote debugging can prove to be a bit awkward but here goes......
First of all. - Nothing happens until you click or tap on a yellow counter that you can actually move, when the destination 'hole' is then illuminated in dark grey. Tap on this dark grey hole to jump the counter over.
Do the menus work when you tap on them?
What exactly are you trying to run this on? Make model etc.
The program responds to the WM_LEFTBUTTONDOWN message sent to the app by the operating system. This is usually the resonse to a mouse click or screen tap.
Second, run the attached, and what does it report. It returns the co-ordinates returned by the GetClientRect() function.
It should show "Main x x x x - Menu x x x x" with a black bar 20 pixels high across the bottom of the screen, where x represents a value returned.
Report those values or post a screen shot we will use that for starters.......
1) CE 5.0 inbetween is very outdated (but some devices still are based on it), since 2009 CE 6.0 dominates. CE 4.2 you probably only can find in a museum. Emulator with an CE 6.0 image is available from MS free of charge.
2) It shouldn't be of any interest what device (Make, Model) your 'PEG SOLITAIRE for CE 'is planned to be run on. You claimed it should "run on ARM powered CE devices". No restrictions made.
3) Menu seems to work, items are accessible.
4) Result of GetRect is: Main 0 0 454 800 Menu 0 0 24 800
BTW: I'm no longer interested in this game, in no case I'll become a beta-tester.
There is no such thing as a Standard SDK for CE 6.0 like there used to be with 4.2 and 5.0
http://blogs.msdn.com/b/ce_base/archive/2006/12/14/what-exactly-is-an-sdk.aspx
Looks like the OEM's have all gone their own way, anyway.
Under CE 6.0 if you don't have the SDK for the device, which is probably totally proprietary, and not public, then you can't test it in a debug environment, and hence find out what the OEM has changed on the device.
So the disclaimer is now, "Should run under CE 4/5, may or may not run under CE 6.0"
Looks like days of a generic application are over. It's hardly worth the effort.
Windows Embedded CE 6.0 image exists, also Windows Embedded CE 6 SDK exists
FYI
CE 6 image:
http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=76695&whichpage=2#963026
CE 6 sdk:
http://blogs.msdn.com/b/obloch/arch...sdk-not-installing-on-visual-studio-2008.aspx
Thanks for that.
Here's the WINCE_6.0.BIN image running in the device emulator.
Solitaire runs a treat.
I can confirm that both versions work - and both look great, running in full screen - on the CE 6 netbook (both 800x480 and 1024x600) as well as on a 7-inch Windows Embedded Compact 7 netbook.
Does not run on WinCE 3 (Windows Mobile 2002) - tested (and failed) on a QTEK 7070.
This game is very interesting. Do you like this puzzle?
tobbbie said:
Does not run on WinCE 3 (Windows Mobile 2002) - tested (and failed) on a QTEK 7070.
Click to expand...
Click to collapse
This program was originally written using Embedded C++ using the WM 2003 and CE 4.2 Standard SDKs.
I have reinstalled Embedded C++ 3.0 and the WM2002 SDK, and the WM2002 Smartphone emulator will not run it the code that works on WM2003.
There are some very subtle nuances between WM2003 and WM2002, which will have to be addressed before it will run properly. I'm on it, but it may take a few days.
This was not meant as a challenge - but if you want to pick that up I will recheck it. No hurry needed anyway - the device is in the museum drawer
Now updated to 1.6
PPC/Smartphone version now rebuilt under the WM2002 SDK. Runs on all versions from WM 2002 to WinMo 6.5.3
As mentioned there were a few oddities to be overcome in trying to retro the thing. Under WM2002 SystemParametersInfo() - used to detect the device platform - PocketPC or SmartPhone, fails with access denied, if it is called before the main window is created. Later versions of WM don't care.
Now runs on the WM2002 as well - tested on a Qtek 7070
I only wish there was a demo mode that brings the shapes to a solution - or something like a roll-back when you feel in a dead end situation.
Oh well - and something obvious: why not have an "Exit" Menu item?! This is missing in all your programs and useful for smartphone where you have no Window Close button.
The roll-back option already exists as the Undo option on the menu. You can roll it back to the original position if required, by the repeated use of it.
The use of a Program Exit option was discouraged by Microsoft in their original Window Mobile interface programming guide, as the programs were meant to sit in the background of the machine until reactivated.
In this case, this program only uses about 70+ Kb of memory when it is running, hardly a show stopping drain on the available resources.
But, if you want it, why not? Now included as 'Exit' on the main Solitaire menu. Program replaced in post #1.
stephj said:
The roll-back option already exists as the Undo option on the menu. You can roll it back to the original position if required, by the repeated use of it.
Click to expand...
Click to collapse
Oh well, you are right - did not notice this. One thought for usability: Can you assign this function to the "2" key - which is usually directly beneath the cursor/D-pad? This could much ease the navigation as it saves you from the "Menu-scroll-enter" sequence. For touchscreen devices a dedicated tap-field could help. I thought suggesting the "back" key for that, but this has a system wide purpose and should not be captured.
stephj said:
The use of a Program Exit option was discouraged by Microsoft in their original Window Mobile interface programming guide, as the programs were meant to sit in the background of the machine until reactivated.
In this case, this program only uses about 70+ Kb of memory when it is running, hardly a show stopping drain on the available resources.
But, if you want it, why not? Now included as 'Exit' on the main Solitaire menu. Program replaced in post #1.
Click to expand...
Click to collapse
I know and I never liked that. If the potential automatic close would also save the current state of any application it would be ok, but it seems that MS has not put THAT to their guidelines. Consequently I would still like to have control which programs run and which not. Other programs have even put that configurable (e.g. Oxios ToDo or Papyrus) but that is overkill I think.
As I use XBAR I can end any running program any time, but part of the menu is better. Thanks for this!
More thoughts for improvements:
show possible moves e.g. by overlaying arrows to the jumps, assigned to a key on smartphone (1 or 3, as 2 should be "Undo")
autosolve feature (animated - from any starting point or possibly with loadable solution paths from the standard start conditions)
coloring adapted to the active color scheme or selectable
skinnable board and pegs
It could be endless and I know that hardly anyone cares for such simple games in the age of animated 3D and Surround sound.
Some of this will be implemented, some of it won't.
Like 5x5 it is a dual platform program, the same executable runs on PocketPC/WinMo Professional and SmartPhone/WinMo Standard. Usually you would release two separate versions each built under the corresponding SDK. This single program looks at which platform it is running on, and behaves accordingly. This means it has to exist with somewhat of a split personality. Some code from one platform must not be run under the other, and vice versa.
Linking the '2' key to the 'Undo' option on Smartphone should be quite easy. Update... Done!
The D-PAD and enter is ignored under PocketPC/WinMo Pro. Under Smartphone, when a suitable counter is selected with enter, the target holes are displayed. I will make the D-PAD respond if it is moved toward a suitable target hole by 'jumping over' it immediately, thereby saving two extra depressions of the D-PAD.
The demo solution option from each pattern starting position could be added, I can quite easily lift some of the code out of 5x5 to do this, as it is a very similar setup. But first I have got to get the solutions! This may take some time........ I'll create a modified version of Solitaire to write out the Undo array if the solution is completed successfully. Once all patterns have been completed, build the data file to load as a program resource later.
Skinning: Looks good but it is a total pain in the butt. It used to have nice 3D rendered marbles and holes, but trying to get it to work and look good on lots of different sized displays turned into a nightmare. Eventually I opted for the vanilla option and dynamically scaled it to fit within 90% of the narrowest side of the display. The code figures this out, and centres the board, having raised it just enough to fit the messages across the bottom.
Colours from a pick list: I'll have a think about it.
"I'll be back"
stephj said:
Linking the '2' key to the 'Undo' option on Smartphone should be quite easy. Update... Done!
Click to expand...
Click to collapse
Thanks - that was fast!
stephj said:
... I will make the D-PAD respond if it is moved toward a suitable target hole by 'jumping over' it immediately, thereby saving two extra depressions of the D-PAD.
Click to expand...
Click to collapse
Will see how well that works. It still seems to rely on your selection to show possible options for the selection. What I was after is to show ALL possible moves of ALL items - probably only by pressing a special key. So you can decide which item to move.
stephj said:
The demo solution option from each pattern starting position could be added, I can quite easily lift some of the code out of 5x5 to do this, as it is a very similar setup. But first I have got to get the solutions! This may take some time........ I'll create a modified version of Solitaire to write out the Undo array if the solution is completed successfully. Once all patterns have been completed, build the data file to load as a program resource later.
Click to expand...
Click to collapse
No hurry - this is a true nice-to-have only. Hunting for solution patterns may be a tedious task. I wonder if there are generic algorithms to solve these (no?).
stephj said:
Skinning: Looks good but it is a total pain in the butt. It used to have nice 3D rendered marbles and holes, but trying to get it to work and look good on lots of different sized displays turned into a nightmare. Eventually I opted for the vanilla option and dynamically scaled it to fit within 90% of the narrowest side of the display. The code figures this out, and centres the board, having raised it just enough to fit the messages across the bottom.
Click to expand...
Click to collapse
Not needed to beautify on the programming level (3D rendering), but simple skinning? I mean just pick the unscaled (upper left) part of a delivered picture for the items to map. This could be board, marbles, holes and background. No sophisticated scaling or positioning. While scaling could be an easy option to supply similar look on all resolutions.
No hurry here either and also no problem if this is off your list.
stephj said:
Colours from a pick list: I'll have a think about it.
"I'll be back"
Click to expand...
Click to collapse
Thanks for your continued efforts, much appreciated.

[Q] Heavily modded interface

First post, but I did my research and couldn't find anything similar.
I'm wondering what the feasible limits are of editing Android. Here's the situation:
I'm thinking of buying the Sony Walkman Z, but would want to create a new interface to make it more music-centric. Would it be possible to create a rom/skin/theme which would act almost nothing like android, but still run android apps?
something like this:
homescreen is fairly normal, clock+link to internet.
swipe left launches music/video app(which I'd like to make custom too, just a pipe dream)
swipe right is list of selected apps (not anticipating having more than the 16 one page could display)
swipe up displays full list of apps (like normal)
shortcut keys work as normal.
don't really need notifications(no texts/calls, don't tweet) so top bar can go away. really that's it. minimalist so as to keep the music the main focus.
A: is it possible?
B: is the skill level required ridiculous high?
C: are there any developers out there willing to take on a challenge?
Thanks so much,
GrIdiot

How Do I Create A "Chess By Email" Style App?

I wasn't sure if I should post this in DevDB, so please move if I got it wrong (sorry).
Now, onto the nitty gritty.
I wish to create an Android app that allows 2 people to play a game via email, messenger, facebook, etc... The App should standalone from any other app.
I do not have the skills to program for AI, and I am going to have to seek permission from the holders of the rights to make this public, hence why I am being a little guarded about some of the details.
Basics - What It MUST Be Able To Do
Represent a "chess like" board. (It is actually larger than a chess board, and a different shape, but uses the same checker pattern).
Be able to add, move or remove playing pieces.
Ideal Minimum - What I Would Also Like It To Do.
Keep track of the number of each sides playing pieces in play/captured.
Keep track of whose turn it is.
Be able to highlight the spaces a piece can be moved to based on position and pieces around it.
Optional Extras - What I Would Also Like It To Do, But Can Live Without
Prevent illegal moves.
Prevent movement of the wrong side.
Automatically capture pieces.
Move by co-ordinates (i.e. A3-C6)
There are only 3 types of playing pieces, 2 ways of moving and 3 ways of capturing, so in that sense it is only slightly more complicated than draughts, and no where near as complicated as chess - and doesn't have any rules about having to move or block specific pieces (i.e. checking the king).
In it's most basic element it would just be a background image with freely movable sprites floating above it. Ideally they would "snap" to some sort of grid.

Some Android app designing help for a noobie

Hey guys, I will try to be concise.
I decided to do an Android app for my final degree project. I followed all the bucky's videos and I have been playing for a couple of weeks with some additional material (text to speech, external databases, creating my own server, php...). So I think I've got the basics.
Okay, here's the problem. I decided to make an app which, basically, includes 3 types of "exams". I will follow the users progression thanks to a learning algorithm and I will purpose different kind of activities according to his/her weak points. The exercises idea is pretty basic (because I want to make it really easy for anyone to afterwards add their own exercises). It will be an image with four options, and just one of them can be selected as the correct one. Each exam will be composed of 20 exercises, and each "individual screen" will have the following elements:
- The image (different for each question)
- The possible solutions (different for each question)
- A dropdown menu (The same for all questions)
- 2 arrows for going to the next and previous exercise (the same for all questions, except for the first and the last)
- Two rows, with 10 cells(squares) per row, as a navigating tool for the user ( so if the user clicks on the third cell, the third exercise of the exam will be displayed. I will probably change the colour of the cell if the user has already selected an option or not) (The same for all questions, except for the color probably)
The squeleton of the APP is more or less done. Users can register, login, my DB is working perfectly, the "selection screen" is done, with different ways of receiving help (text and audio). In other words, the next step is necessarily making the exercised themselves. I have enough time, but I really want to know which is the best way to proceed. I don't mind failing a couple of times (as long as I learn), but I would love to know your opinions.
Each exercise is a different fragment? I mean, all of them have the same structure, is there anyway to create a kind of "base" class for an exercise, as only the image and the options do change from one exercise to the other? The menu, the arrows and the navigation bar are the same.
Any opinions and ideas are totally welcome.
PS: Sorry for my terrible english, is not my mother language.

Categories

Resources