audioContext = new AudioContext()

//Derived from marcgg's music.js

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.note_block = {
	color: "#ee33ee",
	behavior: behaviors.WALL,
	state: "solid",
	category: "machines",
	density: 1200,
	hardness: 0.2,
	breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"],
	conduct: 1,
	properties: {
		frequency: 440,
		type: "sine",
		endType: "none",
		length: 1,
		volume: 1,
		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--;
		};
	},
};

runAfterLoad(function() {
	elements.note_block.movable = false;
});

if(runAfterAutogen) {
	runAfterAutogen(function() {
		elements.note_block.movable = false;
	});
};
