Adding sound
kbd.wrl
#VRML V2.0 utf8
#
# kbd.wrl
# Synthesizer keyboard
# by David R. Nadeau
#
# This world creates a 'playable' synthesizer keyboard. Each key on
# the keyboard has a sound and touch sensor associated with it.
# Touching a key triggers the touch sensor, which triggers the sound.
#
# Things to experiment with...
# Use a PROTO to create a piano key that plays a note of a given
# pitch, supplied as a PROTO argument. Make the sound file an
# argument as well.
#
# Use a Script to trigger sounds on **Mouse button down** not up.
# Huh, you say? Well, a TouchSensor generates a touch time event
# on mouse down, not up. Since means that sounds triggered by
# a TouchSensor seem to happen late... they happen when you release
# the mouse button, not when you press it. But, a TouchSensor
# sends a TRUE on it's isActive output on mouse down. So, you
# could route that into a Script node and grab the associated
# time stamp, then send THAT out as an event to start the sound.
# This will remove the lag and make sounds more responsive.
#
WorldInfo {
title "Synthesizer keyboard"
info [ "Copyright (c) 1997, David R. Nadeau" ]
}
Viewpoint {
position 0.875 1.5 1.5
orientation 1.0 0.0 0.0 -0.785
description "Entry view"
}
NavigationInfo {
type [ "EXAMINE", "ANY" ]
headlight FALSE
}
DirectionalLight {
direction 1.0 -2.0 -0.5
}
# Middle C (C4)
Transform {
children [
DEF WhiteKey Shape {
appearance Appearance {
material Material { diffuseColor 1.0 1.0 1.0 }
}
geometry Box { size 0.23 0.1 1.5 }
}
DEF C4 TouchSensor { }
Sound {
source DEF PitchC4 AudioClip {
url "tone1.wav"
pitch 1.0
}
maxFront 100.0
maxBack 100.0
}
]
}
# C# above middle C (Cs4)
Transform { translation 0.125 0.1 -0.375
children [
DEF BlackKey Shape {
appearance Appearance {
material Material {
diffuseColor 0.4 0.4 0.4
}
}
geometry Box { size 0.2 0.1 0.75 }
}
DEF Cs4 TouchSensor { }
Sound {
source DEF PitchCs4 AudioClip {
url "tone1.wav"
pitch 1.059
}
maxFront 100.0
maxBack 100.0
}
]
}
# D above middle C (D4)
Transform { translation 0.25 0.0 0.0
children [
USE WhiteKey,
DEF D4 TouchSensor { }
Sound {
source DEF PitchD4 AudioClip {
url "tone1.wav"
pitch 1.122
}
maxFront 100.0
maxBack 100.0
}
]
}
# D# above middle C (Ds4)
Transform { translation 0.375 0.1 -0.375
children [
USE BlackKey,
DEF Ds4 TouchSensor { }
Sound {
source DEF PitchDs4 AudioClip {
url "tone1.wav"
pitch 1.189
}
maxFront 100.0
maxBack 100.0
}
]
}
# E above middle C (E4)
Transform { translation 0.5 0.0 0.0
children [
USE WhiteKey,
DEF E4 TouchSensor { }
Sound {
source DEF PitchE4 AudioClip {
url "tone1.wav"
pitch 1.260
}
maxFront 100.0
maxBack 100.0
}
]
}
# F above middle C (F4)
Transform { translation 0.75 0.0 0.0
children [
USE WhiteKey,
DEF F4 TouchSensor { }
Sound {
source DEF PitchF4 AudioClip {
url "tone1.wav"
pitch 1.335
}
maxFront 100.0
maxBack 100.0
}
]
}
# F# above middle C (Fs4)
Transform { translation 0.875 0.1 -0.375
children [
USE BlackKey,
DEF Fs4 TouchSensor { }
Sound {
source DEF PitchFs4 AudioClip {
url "tone1.wav"
pitch 1.414
}
maxFront 100.0
maxBack 100.0
}
]
}
# G above middle C (G4)
Transform { translation 1.0 0.0 0.0
children [
USE WhiteKey,
DEF G4 TouchSensor { }
Sound {
source DEF PitchG4 AudioClip {
url "tone1.wav"
pitch 1.498
}
maxFront 100.0
maxBack 100.0
}
]
}
# G# above middle C (Gs4)
Transform { translation 1.125 0.1 -0.375
children [
USE BlackKey,
DEF Gs4 TouchSensor { }
Sound {
source DEF PitchGs4 AudioClip {
url "tone1.wav"
pitch 1.587
}
maxFront 100.0
maxBack 100.0
}
]
}
# A above middle C (A5)
Transform { translation 1.25 0.0 0.0
children [
USE WhiteKey,
DEF A5 TouchSensor { }
Sound {
source DEF PitchA5 AudioClip {
url "tone1.wav"
pitch 1.682
}
maxFront 100.0
maxBack 100.0
}
]
}
# A# above middle C (As5)
Transform { translation 1.375 0.1 -0.375
children [
USE BlackKey,
DEF As5 TouchSensor { }
Sound {
source DEF PitchAs5 AudioClip {
url "tone1.wav"
pitch 1.782
}
maxFront 100.0
maxBack 100.0
}
]
}
# B above middle C (B5)
Transform { translation 1.5 0.0 0.0
children [
USE WhiteKey,
DEF B5 TouchSensor { }
Sound {
source DEF PitchB5 AudioClip {
url "tone1.wav"
pitch 1.888
}
maxFront 100.0
maxBack 100.0
}
]
}
# C above middle C (C5)
Transform { translation 1.75 0.0 0.0
children [
USE WhiteKey,
DEF C5 TouchSensor { }
Sound {
source DEF PitchC5 AudioClip {
url "tone1.wav"
pitch 2.0
}
maxFront 100.0
maxBack 100.0
}
]
}
ROUTE C4.touchTime TO PitchC4.set_startTime
ROUTE Cs4.touchTime TO PitchCs4.set_startTime
ROUTE D4.touchTime TO PitchD4.set_startTime
ROUTE Ds4.touchTime TO PitchDs4.set_startTime
ROUTE E4.touchTime TO PitchE4.set_startTime
ROUTE F4.touchTime TO PitchF4.set_startTime
ROUTE Fs4.touchTime TO PitchFs4.set_startTime
ROUTE G4.touchTime TO PitchG4.set_startTime
ROUTE Gs4.touchTime TO PitchGs4.set_startTime
ROUTE A5.touchTime TO PitchA5.set_startTime
ROUTE As5.touchTime TO PitchAs5.set_startTime
ROUTE B5.touchTime TO PitchB5.set_startTime
ROUTE C5.touchTime TO PitchC5.set_startTime