mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-29 10:59:55 +02:00
Merge pull request #1610 from PhilipRosedale/master
Example script drumSticks.js lets you play air drums
This commit is contained in:
commit
da9fccc9b2
1 changed files with 72 additions and 0 deletions
72
examples/drumStick.js
Normal file
72
examples/drumStick.js
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
//
|
||||||
|
// This example musical instrument script plays 'air drums' when you move your hands downward
|
||||||
|
//
|
||||||
|
|
||||||
|
function length(v) {
|
||||||
|
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function printVector(v) {
|
||||||
|
print(v.x + ", " + v.y + ", " + v.z + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function vMinus(a, b) {
|
||||||
|
var rval = { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// First, load two percussion sounds to be used on the sticks
|
||||||
|
|
||||||
|
var drum1 = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/MusicalInstruments/drums/snare.raw");
|
||||||
|
var drum2 = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/MusicalInstruments/drums/snare.raw");
|
||||||
|
|
||||||
|
// State Machine:
|
||||||
|
// 0 = not triggered
|
||||||
|
// 1 = triggered, waiting to stop to play sound
|
||||||
|
var state = new Array();
|
||||||
|
state[0] = 0;
|
||||||
|
state[1] = 0;
|
||||||
|
var strokeSpeed = new Array();
|
||||||
|
strokeSpeed[0] = 0.0;
|
||||||
|
strokeSpeed[1] = 0.0;
|
||||||
|
|
||||||
|
function checkSticks() {
|
||||||
|
for (var palm = 0; palm < 2; palm++) {
|
||||||
|
var palmVelocity = Controller.getSpatialControlVelocity(palm * 2 + 1);
|
||||||
|
var speed = length(palmVelocity);
|
||||||
|
|
||||||
|
const TRIGGER_SPEED = 0.30; // Lower this value to let you 'drum' more gently
|
||||||
|
const STOP_SPEED = 0.01; // Speed below which a sound will trigger
|
||||||
|
const GAIN = 0.5; // Loudness compared to stick velocity
|
||||||
|
const AVERAGING = 0.2; // How far back to sample trailing velocity
|
||||||
|
|
||||||
|
// Measure trailing average stroke speed to ultimately set volume
|
||||||
|
strokeSpeed[palm] = (1.0 - AVERAGING) * strokeSpeed[palm] + AVERAGING * (speed * GAIN);
|
||||||
|
|
||||||
|
if (state[palm] == 0) {
|
||||||
|
// Waiting for downward speed to indicate stroke
|
||||||
|
if ((palmVelocity.y < 0.0) && (strokeSpeed[palm] > TRIGGER_SPEED)) {
|
||||||
|
state[palm] = 1;
|
||||||
|
}
|
||||||
|
} else if (state[palm] == 1) {
|
||||||
|
// Waiting for change in velocity direction or slowing to trigger drum sound
|
||||||
|
if ((palmVelocity.y > 0.0) || (speed < STOP_SPEED)) {
|
||||||
|
state[palm] = 0;
|
||||||
|
var options = new AudioInjectionOptions();
|
||||||
|
options.position = Controller.getSpatialControlPosition(palm * 2 + 1);
|
||||||
|
if (strokeSpeed[palm] > 1.0) { strokeSpeed[palm] = 1.0; }
|
||||||
|
options.volume = strokeSpeed[palm];
|
||||||
|
|
||||||
|
if (palm == 0) {
|
||||||
|
Audio.playSound(drum1, options);
|
||||||
|
} else {
|
||||||
|
Audio.playSound(drum2, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect a call back that happens every frame
|
||||||
|
Agent.willSendVisualDataCallback.connect(checkSticks);
|
Loading…
Reference in a new issue