diff --git a/note_block_advanced.js b/note_block_advanced.js new file mode 100644 index 00000000..7900db96 --- /dev/null +++ b/note_block_advanced.js @@ -0,0 +1,628 @@ +audioContext = new AudioContext() + +//Derived from Alice's note_block.js - thanks! +//adv_note_block/note_block_advance/nba + +oscillatorDefaults = { + frequency: 440, + type: "sine", + endType: "none", + length: 1, + volume: 1, + delay: 0, +}; + +audioObject = {}; + +function oscillator(name="test",parameterObject=oscillatorDefaults){ //creates oscillator with gain node, has specifiable frequency and type, fades out over 1 second (hard-coded) + var defaultKeys = Object.keys(oscillatorDefaults); //readability variable + + for(i = 0; i < defaultKeys.length; i++) { + var key = defaultKeys[i]; //the indexed keyname + if(typeof(parameterObject[key]) === "undefined") { + parameterObject[key] = oscillatorDefaults[key]; + }; + }; + + var oscillatorNodeName = `${name}Oscillator`; + var gainNodeName = `${name}Gain`; + + audioObject[oscillatorNodeName] = audioContext.createOscillator() + audioObject[gainNodeName] = audioContext.createGain() + audioObject[gainNodeName].gain.value = parameterObject.volume; + audioObject[oscillatorNodeName].type = parameterObject.type + audioObject[oscillatorNodeName].connect(audioObject[gainNodeName]) + audioObject[oscillatorNodeName].frequency.value = parameterObject.frequency + audioObject[gainNodeName].connect(audioContext.destination) + audioObject[oscillatorNodeName].start(audioContext.currentTime + parameterObject.delay) + + //stopping handler + if(parameterObject.endType === "exponential") { //starts fading immediately + audioObject[gainNodeName].gain.exponentialRampToValueAtTime( + 0.00001, audioContext.currentTime + parameterObject.length + ); + } else if(parameterObject.endType === "linear") { //starts fading immediately + audioObject[gainNodeName].gain.linearRampToValueAtTime( + 0.00001, audioContext.currentTime + parameterObject.length + ); + } else { //waits to stop + audioObject[oscillatorNodeName].stop(audioContext.currentTime + parameterObject.delay + parameterObject.length); + }; +}; + +elements.c_note_block = { + color: "#eb4034", + name: "Note Block - C", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 261.63, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.cs_note_block = { + color: "#fc3903", + name: "Note Block - C Sharp", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 277.183, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.d_note_block = { + color: "#fc6203", + name: "Note Block - D", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 293.66, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.ef_note_block = { + color: "#fc9803", + name: "Note Block - E Flat", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 293.66, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + + +elements.e_note_block = { + color: "#fce303", + name: "Note Block - E", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 329.63, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.f_note_block = { + color: "#fce303", + name: "Note Block - F", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 349.228, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.fs_note_block = { + color: "#03fc3d", + name: "Note Block - F Sharp", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 369.99, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.g_note_block = { + color: "#03fcca", + name: "Note Block - G", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 391.995, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.gs_note_block = { + color: "#0394fc", + name: "Note Block - G Sharp", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 415.305, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.a_note_block = { + color: "#0f03fc", + name: "Note Block - A", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 440, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.bf_note_block = { + color: "#9803fc", + name: "Note Block - B Flat", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 466.164, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.b_note_block = { + color: "#fc03b5", + name: "Note Block - B", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 493.883, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; \ No newline at end of file