Proposal

A 3D sound/music generator based on physical simulation of falling balls bouncing off of surfaces as they fall. This would be very much like Ball Droppings, but in 3D.
Also, I would want to make the sound reproduction better than the simple tones that ball droppings uses and the physical simulation be more correct. The system could have the following variables:
  1. Ball source
  2. Size of struck surface
  3. Shape of struck surface
  4. Velocity of ball when it hits surface
The variables could relate to parameters in the sound creation. For examle:
  1. Different ball sources could relate to different types of sound (such as piano, strings, horns, drums).
  2. The size of the surface could relate to the pitch of the sound.
  3. The shape of the surface could relate to the timbre of the sound (like a horn could be muted if it hit a disc and open if it hit a square, or a piano could sustain if it hit a disc, be normal if it hit a square, and be staccato if it hit a triangle).
  4. The velocity of the ball could relate to the volume of the sound.
Much like ball droppings, it would start with a single ball source dropping balls. The user would be able to create surfaces, move them around, rotate them, and scale them so that they intersect the flow of the balls. Also, the user would be able to introduce more ball sources. This could end up looking a little bit like a very simple Animusic video (like this one: http://www.animusic.com/popups/clip-pipe-wm.html), though obviously not nearly as elegant as this is a real time interactive system and those are automatically generated rendered animations.
The program would allow for the ability to save and load scenes, and maybe be able to generate a scene from a midi file, or music data file of some kind.
The sounds could either be generated via midi, or loaded from files. I have a lot of multisampled instrument sounds.

Goals

The goals that will be reached with this program include (roughly in order of implementation):
  1. Create a physical simulation of masses (balls) falling from an "emitter" or "ball source" and bouncing off of arbitrary planes in a physically accurate way.
  2. Play a sound of some kind as the balls strike the planes.
  3. Play sounds with the attributes given above.
  4. Allow the planes to be created, destroyed, and modified via user interaction.
    1. Multiple Views
    2. Single View (maybe)
  5. Plane modifications include:
    1. Translate (3D)
    2. Rotate (3D)
    3. Scale (2D)
    4. Change type (shape?)
  6. Allow the current configuration to be saved to a file and restored at a later time.
A possible optional feature includes generating a scene from a midi file or something similar.

Implementation Ideas

I figured I'd start with a 4 viewport system like the default layout in 3D Studio Max, that is, Top, Left, Front, and Prespective and let objects be created/modified with mouse interaction. I think that would give the most control. Translations would happen in the plane of the view, and rotations would be about the axis orthoginal to the view. The perspective view could move around in 3 space, but couldn't interact with the objects.
Alternativly, the whole thing could be in 1 view with an arcball thing to rotate the planes. I just don't relate very well to translating 2D mouse movements into 3D movements through space. I prefer 4 views.

I intend to implement the project by starting with a basic version and adding features. That way, if I run out of time, it'll still do what it's supposed to do, just with fewer features. (I'd rather have a program that has balls bouncing off of surfaces and making sounds but won't let you move the surfaces than a program that has surfaces that move around but don't make sound.) I plan to spend 15 or so days on the project, and divide them up into 3 equal sections:
  1. Static ball emitter(s) with static planes that deflect the balls in a physicall accurate way and make some sort of sound when the collide.
  2. Add the ability to modify the planes/ball emitter(s) and improve the sounds.
  3. Clean up the rough edges. Improve the sounds some more. Maybe add more sounds. Add UI features and documentation.
I hate poorly documented programs. See my prog0 for how I'd like for the documentation to be, and my prog1 and prog2 for how I don't want it to be :)