2022-10-29 00:51:11 -04:00
audioContext = new AudioContext ( )
//Derived from marcgg's music.js
oscillatorDefaults = {
frequency : 440 ,
type : "sine" ,
endType : "none" ,
2022-10-31 11:42:01 -04:00
length : 1 ,
volume : 1 ,
2022-10-31 12:20:19 -04:00
delay : 0 ,
2022-10-29 00:51:11 -04:00
} ;
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 ] ;
} ;
} ;
2022-10-31 12:20:19 -04:00
2022-10-29 00:51:11 -04:00
var oscillatorNodeName = ` ${ name } Oscillator ` ;
var gainNodeName = ` ${ name } Gain ` ;
audioObject [ oscillatorNodeName ] = audioContext . createOscillator ( )
audioObject [ gainNodeName ] = audioContext . createGain ( )
2022-10-31 11:42:01 -04:00
audioObject [ gainNodeName ] . gain . value = parameterObject . volume ;
2022-10-29 00:51:11 -04:00
audioObject [ oscillatorNodeName ] . type = parameterObject . type
audioObject [ oscillatorNodeName ] . connect ( audioObject [ gainNodeName ] )
audioObject [ oscillatorNodeName ] . frequency . value = parameterObject . frequency
audioObject [ gainNodeName ] . connect ( audioContext . destination )
2022-10-31 12:20:19 -04:00
audioObject [ oscillatorNodeName ] . start ( audioContext . currentTime + parameterObject . delay )
2022-10-29 00:51:11 -04:00
//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
2022-10-31 12:20:19 -04:00
audioObject [ oscillatorNodeName ] . stop ( audioContext . currentTime + parameterObject . delay + parameterObject . length ) ;
2022-10-29 00:51:11 -04:00
} ;
} ;
elements . note _block = {
color : "#ee33ee" ,
behavior : behaviors . WALL ,
2022-10-31 12:20:19 -04:00
state : "solid" ,
category : "machines" ,
2022-10-29 00:51:11 -04:00
density : 1200 ,
2022-10-31 12:20:19 -04:00
hardness : 0.2 ,
breakInto : [ "plastic" , "metal_scrap" , "metal_scrap" , "metal_scrap" ] ,
2022-10-29 00:51:11 -04:00
conduct : 1 ,
properties : {
frequency : 440 ,
type : "sine" ,
endType : "none" ,
length : 1 ,
2022-10-31 11:42:01 -04:00
volume : 1 ,
2022-10-31 12:20:19 -04:00
delay : 0 ,
2022-10-29 00:51:11 -04:00
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 ,
2022-10-31 11:42:01 -04:00
volume : pixel . volume ,
2022-10-31 12:20:19 -04:00
delay : pixel . delay ,
2022-10-29 00:51:11 -04:00
} ;
//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 -- ;
} ;
} ,
2022-10-31 11:42:01 -04:00
} ;
2022-10-31 12:20:19 -04:00
runAfterLoad ( function ( ) {
elements . note _block . movable = false ;
} ) ;
if ( runAfterAutogen ) {
runAfterAutogen ( function ( ) {
elements . note _block . movable = false ;
} ) ;
} ;