Sonic Orbit - v0.3.7
Copyright (C) 2011 Simon Kenny
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
Simon Kenny (digithree)
Sean Ryan, Michael Sherry, Gerrad Hatton, Brian Wallace, Sean Hatton, Adam Timothy
Touch screen - manipulate the spheres by dragging them.
- Drag spheres around the rings to change positions.
- Drag spheres from the four menu spheres at the bottom of the screen to add new ones.
- Drag spheres into empty space to throw a sphere away
L Trigger - Press to toggle sphere guide (so you can see possible positions for the spheres)
Hold left on D-pad and use touch
- Grab and throw(spin) a ring to change speed and/or direction
Hold left on D-pad and use touch
- Grab and throw a ring to nugde the spheres one space in that direction
Select - View game menu
What you need
To execute the build: either
* A Nintendo DS with some method of executing roms, e.g. an R4i cartridge
* An emulator. Check out http://www.ndsemulator.com/ for more info
To compile the code (on a Windows system):
* The Programmers Notebook - http://www.pnotepad.org/
* devKitArm (part of the devKitPro tool chain) - https://sourceforge.net/projects/devkitpro/
Additional tools used to develop for this project: as above and
* A tracker editor. Recommended is OpenMPT - http://openmpt.org/
* An image editor. Recommended is Photoshop - http://www.adobe.com/downloads/
Sonic Orbit is a musical toy made for the Nintendo DS console platform. The interface consists of three rotating concentric circles (orbits) made up of sound trigger balls (spheres). As each orbit rotates and the spheres trace a circle, when they pass the 12 o'clock point (was 3 o'clock in last release) of their orbit a sound is triggered. Spheres of the same colour trigger the same sound. In addition, a background track plays along with the triggered sounds, the tempo of which is synced to the speed of the orbits.
Thus music is made! The toy is basically a loop based sample sequencer with an original and intuitive visual representation. The user uses an intuitive touch screen interface to manipulate the spheres therefore manipulating the sounds that are sequenced.
What's new in this release
* Title screen with background music and "level" select
* Choice of 5 different tunes, each with a different time signature
- Normal Zone (4/4)
- Beat Crossing (Poly) : this is a poly rhythm based in 6/8 with a 4 over 3 feel
- Major Buzz (6/8)
- Orchestra (5/4)
- Fire Dance (7/8)
* Menu system tree:
- Loop Options
- Metronome On [enable metronome]
- " Off [disable metronome]
- Beat Sound On [sound on for sphere triggers]
- " Off [sound off for sphere triggers]
- Snap Spin To Tempo On [when spinning, ring waits for next division value]
- " Off [turn snap to off]
- Clear All Spheres [delete sphere data]
- Change Snap Division [change value to snap to tempo and mentronome feature]
- 4th Note
- 8th Note
- 16th Note
- 32nd Note
- Print Sprite Table
* Snap Spin to Tempo option - if this feature is enabled, when spinning a ring it will wait for the next specified note snap division (which can also be seen via a menu and can be heard/tested using the metronome). If it is disabled the ring will start its new spin the moment the touch is let go.
* Ring Spin - change direction and/or speed of ring rotation by holding down left on the D-pad and using touch.
* Ring nudge - nudge spheres on a ring, clockwise or anti-clockwise
* Pause/Start the loop for editing feature needs to be remade
* Save/Load feature
* Left handed support (flip controls)
* Slick animations (when waiting for ring spin to snap to tempo for example) and better "scene" transitions (i.e. using screen fades/wipes/etc.)
Known areas that need improvement
* When using ring spin, you have to spin in a straight line with your initial touch point on the right side of the orbit area. This is because I use a quick fix function to find the slope of the line made from inital touch to release touch position instead of an angle function (because I had problems getting the angle style to work.) Perhaps this whole system needs to be redesigned. [You can find the guts of the implimentation in the handleInput_main(...) function.]
* The ring spin feature is not perfect and perhaps a remodling is needed. My details notes on the current approach will be added soon so others can give me their opinion.
* In the documentation: the next release will explain some of the important systems I have hither-to left unmentioned, such as the songEvent system used in the "snap to tempo" and metronome feaures and facilitated by the IT tracker background tune.
I added a lot of new features in this release and I'm afriad a result of some of them is instability. I'm still working on fixing these but some of the ones myself and the testers have noticed are:
* Ring spin function sometimes cause one sphere sprite to stick at it's position when the spin starts while the sphere object still has the correct information , i.e. sphere object looses control of its assoiated sprite.
* Ring spin function sometimes crashes the game, leaving only the background tune playing while not responding to any key/touch input.
* Menu system touch reading is too quick/sensitive. (Tried using a spare timer to regulate this but found difficulty implimenting it.) If menu item in next menu is at the same position as the touch when changing menu that menu item is often selected accidentally.
* The more times you use the menu, the more the beat will lag slightly behand the background tune. This eventually becomes profound.
Considerations for future development
* The object system is not "objectified" enough. More of the code needs to done through methods and standard interfaces instead in large processing functions like handleInput_main(...). This will make future cross-platform ports possible and probably make the code more efficient anyway.
* Revision of side sphere menu regeneration (currently "hard-coded" in main loop, see main.cpp)
* Revision of main loop system.
* Adding triplet values for "snap to tempo" features. This would be useful especially for 3/4 or 6/8 time signatures which the system interprets as being solely in triplets.
Beyond that - future planning
Several ideas have been put to me but I welcome these people to use the "Open Discussion" forum on the sourceforge.net and make these ideas public and debatable. I believe there is potential for an interesting sequencer or game to develop from the basic idea I have described above.
The forum URL is https://sourceforge.net/projects/sonicorbit/forums/forum/1349493
* Unstable build, sometimes crashes (see known bug/errors for details)
* Added title screen with "level" select
* New modules:
- game.h - game specific data
* Significant code changes:
- changed arguements in function handleInput_main(...), return value and (most importantly) return value interpretation. The system is an over-complicated quick fix and needs to be revised though.
* Renamed "MathVector2D<T>" to "coord<T>"
* Fully implimented menu system
* New classes:
textScreen (in gfx.cpp/h) - output to text console
menu (in menu.cpp/h) - entire menu system (output to textScreen instance)
* New modules:
- menu.cpp/h - menu system
* Added menu system (class) but isn't integrated into engine yet (see menu.cpp & menu.h)
* Changed DS holding style back to normal way! Did this to have more access to buttons, i.e. L shoulder button and D pad.
* Changed DS holding style to book format
* Added features
- Play/Pause via Start button.
- Drag and drop/pick-up sphere placement via touch screen.
- Guide view via holding R button.
* Dynamic creation of sphere objects further expanded by implementing system of reusing sprites.
* Cleaned up code. Added new classes to encapsulate data with functions. Added many more comments so the code should be much easier to understand. Took out more unused code I inherited from sample/template code.
* Split code into separate header/cpp files to make it easier to understand and
* Developed custom palette copying over one template sphere image, instead of using
lots of images
* Added more comments to the code to make more readable, and took out lots of useless
commented-out code I had left in v0.2
v0.2 (was previously mis-versioned as v2)
* Demo release