BIGGER
SOUNDS
Janet Kim
Name: Bigger Sounds
Wand Controls: Button 1 –
turn on/off theremin
Button
2 – turn on/off sequencer
Button
3 – grab/release sound object (e.g. a “note”)
This piece structures a virtual environment around the generation
of music and sound. Motivated by the
enjoyment and fulfillment obtained from creating and performing music, the
application allows the user to craft unique rhythms and melodies. In this piece it is the music that is
enhanced by the visuals, rather than the visuals being enhanced by sound and
score. Music visualization adds an
additional dimension to the experience of sound that is ordinarily “felt”
though the ear.
This application consists of three different parts. To create a musical environment, I
constructed three instruments that can be played in the virtual space. These instruments are a piano or keyboard, a
theremin, and a sequencer.
The theremin is
initially turned off. To turn the
theremin on, button 1 on the wand should be pressed. In general, button 1 will toggle the theremin on and off. When the theremin is on, it will turn a
bright greenish-yellow. When it is off,
it will be brown to indicate that it will not make any sound. The user must be close enough to the antenna
in order for the sound to be heard due to amplitude and frequency (i.e. if the
user is too far from the antenna, the pitch will be too high to be heard as
well as the loudness being too soft.)
As the user’s wand approaches the antenna, the pitch should
decrease. As the user’s wand moves
farther away from the antenna, the pitch should become higher.
Figure 1: Playing the
Theremin.
The second instrument in this virtual space is the
sequencer. The sequencer consists of
two nodes, a measure and note nodes.
The note nodes appear in the space as boxes of the same size, each with
a unique texture and sound. These are
the only “grabable” objects in the space.
The user can pick a box up with the wand by pressing the third button on
the wand. To release, the user can
press the third button again. When a
note is grabbed, it’s associated sound is played. In the space is a transparent dome that contains the theremin
antenna. This dome defines the confines
of the measure. To start the sequencer,
button 2 on the wand is pressed.
Figure 2: Positioning a note.
Now that the sequencer is on, circles on the ground appear after
every 8 beats to give the user an idea of timing and note positioning. When a note is grabbed and placed inside the
dome, it is played depending on its position with respect to the antenna if
the sequencer is turned on. When the
note is played, it also bounces. In the
dome are “faeries” that fly towards the note that is being played. If the sequencer is off, the faeries fly
around in random directions. The faery
color should change depending on where the faery is positioned in the dome –
through the entire spectrum. When the
faeries get to the dome wall, they will disappear and reappear randomly within
the dome.
Figure 3: Changing the tempo.
I also added a lever in the transparent dome space that allows
for real-time tempo control. The lever
has a continuum of settings that can range on or between the following:
·
“adagio” - slow
·
“andante” – moderately slow
·
“allegro” - fast
·
“:presto” – fast, rapid
When the user gets with in range of the lever with the wand, the
lever can be moved up and down a certain distance to change the tempo. Moving the lever up will accelerate the
tempo, while moving the lever down will decelerate the tempo. The performance of the lever and its effect
on the tempo of the notes played directly depends on the framerate of the
server it is running on. Since the
timing of the notes played is calculated with respect to real time and not
frames, the acceleration of the tempo may skip notes for slow frame rates. I’d like to get the exact calculations of
how many frames per second must be available to different tempos at some point.
Finally the third instrument is the piano. The piano is located in a different opaque
dome a short distance from the transparent dome. Walking up to the dome will slide the dome up for entrance and
back down again when the user has entered the dome. To exit to dome, the same basic rules apply (i.e. walk to the
dome, it will slide up allowing the user to pass under it, then will slide back
down when the user has exited the dome area).
The piano is at the center of this dome room. “Pushing” the wand down on
the keys plays the keys of the piano. I
also modified Kyoung Park’s fadeIn node so that an object will fade in when the
key is played, and out again when the key is depressed.
Figure 4: Playing the piano.
Figures 5 and 6: Application views below (5) and above(6).
Appendix
Primary Nodes
THEREMIN
Based
on a real theremin. Works by calculating the user’s wand
position to get pitch.
o
Strength –
how quickly the pitch changes with distance
o
Amplitude –
how loud the sound is
o
Play –
plays the theremin
o
Stop –
stops theremin sound
o
Toggle –
toggles theremin sound on and off
o
Volume –
the space in which the amplitude is at full level.
o
FalloffDistance –
how quickly amplitude fades from volume as user moves away from sound
Theremin
song ( falloffDistance(100), amplitude(0.5),
strength(5) )
{
object ant ( file(antenna.pfb), position(0
0 0) )
}
Wandtrigger trig ( when( button1, song.toggle ) )
NOTE
Couples
ygSound with Grabber.
·
Derived
from ygNode
o
Sound – sound node part of the note
o
Object – object node part of the note
o
Occur – how often per measure the sound will be played
o
Play – play the note
o
Stop – stop playing the note
note1
( object(grabb1), sound(boombox1), occur(2) )
MEASURE
Plays note nodes that are
children. Notes are played based on
their position “in” the measure (i.e. timing depends on each notes distance
from the center of the measure).
o
Center – center of the measure
o
Tempo – how fast to play measure
o
MaxTempo – maximum tempo – depends on framerate
o
MeasureLength – how long measure is
o
Color – change color of faeries wrt position
o
Toggle – toggle measure playing on and off
o
Start – begin playing the measure
o
Stop – stop playing the measure
o
Loop – loop the measure
o
FaeryCount – number of faeries
o
FaerySize – size of each faery
o
FaeryRange – where faeries are generate from
o
Speed – how fast the faeries move
o
Lever
– node that is the lever
o
LeverDisplace
– how much the lever will be displaced in one direction
o
LeverRange
– how close the wand needs to be to the lever to move it.
·
Example
Measure music ( center(), loop, tempo() measureLength(), faerySize(), faeryCount(),
faeryRange(), speed(), color )
{
Note note1 ( object( file(myObj.pfb) ),
sound( file(mysound.aiff) ), occur(2) )
Note note2 ( object(
file(myOtherObj.pfb)), sound( file(mysound2.wav) ), when(playing, b1.bounce) )
}
PIANO
A
simple piano node that plays tones in the frequencies of a scale or in evenly
calculated frequency intervals.
·
Example
Piano
Pianosaurus ( range(), keyRange(), keyStart(),
keyDisplace(), amplitude() )
{
object C ( file( obj1.pfb ), position(0
0 0) )
…..
object G ( file( obj2.pfb ),
position(10 0 0) )
object A ( file( obj3.pfb), position(0
10 0) )
object B ( file( obj4.pfb ),
position(-10 0 0) )
object C_octave ( file( obj5.pfb ),
position(0 –10 0) )
}
Secondary Nodes (i.e. nodes modified for my own evil
purposes)
BACKANDFORTH
Allows
children to be moved back and forth between two locations. The major change here from toAndFrom is that
if an object is moving “here” and gets a message to move “there” before it has
completed the movement, the object won’t jump to the starting position of
there. Instead it will move from
whatever location it is at to the there position. This works also when moving here and receiving a message to move
there.
·
Derived
from ygTransform
·
Based
on toAndFrom, probably written by Dave Pape
·
Messages
o
Startpos
– starting position of the object
o
Endpos
– ending position of the object
o
Duration
– how long it takes to move from one location to the other
o
Toggle
– toggles between here and there
o
Loop –
loops the movement
o
Stoploop
– stops looping the movement
o
Here –
moves the object to the start position
o
There –
moves the object to the end position
·
Example
backAndForth
moveDome ( startpos(), endpos(), duration()
)
{
object dome ( file( obj.pfb ), position( 0 0 0 ) )
}
FADEINOUT
This
node basically uses fadeIn to fade objects in and out. A few messages were added to allow the user
to fade both in and out. The main
difference with fadeInOut from fadeIn is that if an object is in the middle of
fading in and receives a message to fade out, it will not jump to its full
opacity. Instead it will fade out from
whatever alpha value it is at and vice versa.
I also added separate duration messages for fading in and fading out.
·
Derived
from ygNode
·
Based on
Kyoung Park’s fadeIn node
·
Messages:
o
Startalpha
– starting transparency
o
Endalpha
– ending transparency
o
FadeInDuration
– how long to fade object in
o
FadeOutDuration
– how long to fade the object out
o
Active
– enable fading
o
FadeIn
– fade the object in
o
FadeOut
– fade the object out
·
Example
fadeInOut
fadeC ( startalpha(1), endalpha(0), fadeInDuration(1), fadeOutDuration(3) )
{
object objC ( file( obj1.pfb ), position(0 0 0) )
}
Extra
All models and textures created by me except for:
Piano fade objects included in data/FADE_OBJS.h file – created
by Yalu Lin.
All sounds either generated by myself and my COMM 494 group or
found on the web at the following sites:
www.fortunecity.com/meltingpot/finland/830/categories.html
members.tripod.com/ushk/sounds/sounds.html
Special thanks to my COMM 494 group - Matt Wilson, Mindy Frakes
and Rob Aeschlimann for helping find sound samples.
Web version at: www.evl.uic.edu/jkim/biggerSounds.htm.