var AudioContext = window.AudioContext || window.webkitAudioContext;var audioContext = undefined;var theChuck = undefined;var theChuckAlmostReady = defer();var theChuckReady = defer();var filesToPreload = [];var whereIsChuck = whereIsChuck || "./js";var currentChuckID = 1; var chuckPrint = function( text ){ // override me!} // START taken from emscripten sourcevar readAsync = function( url, onload, onerror ){ var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function xhr_onload() { if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) // file URLs can return 0 { onload(xhr.response); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null);}; var asyncLoadFile = function( url, onload, onerror ) { readAsync(url, function(arrayBuffer) { onload(new Uint8Array(arrayBuffer)); }, function(event) { if (onerror) { onerror(); } else { throw 'Loading data file "' + url + '" failed.'; } });}// END taken from emscripten source var loadWasm = new Promise( function( resolve, reject ){ asyncLoadFile( whereIsChuck + '/webchuck.wasm', resolve, reject ); }); var preloadFilenames = async function( filenamesToPreload ){ var promises = []; for( var i = 0; i < filenamesToPreload.length; i++ ) { (function( filenameToPreload ) { promises.push( new Promise( function( resolve, reject ) { asyncLoadFile( filenameToPreload.serverFilename, function( byteArray ) { filesToPreload.push({ filename: filenameToPreload.virtualFilename, data: byteArray }); resolve(); }, function() { console.error( "Error fetching file:", filenameToPreload.serverFilename ); //reject( e ); resolve(); }); }) ); })( filenamesToPreload[i] ); } await Promise.all( promises );} var theWasm;var startAudioContext = async function(){ theWasm = await loadWasm; audioContext = new AudioContext({ //sampleRate: 48000 }); await audioContext.audioWorklet.addModule( whereIsChuck + '/webchuck.js');} var startChuck = async function() { if( audioContext === undefined ) { await startAudioContext(); var newID = currentChuckID; currentChuckID++; theChuck = await createAChuck( newID, theChuckReady ); theChuck.connect( audioContext.destination ); theChuckAlmostReady.resolve(); }}; var createAChuck = function( chuckID, initPromise ){ // important: "number of inputs / outputs" is like an aggregate source // most of the time, you only want one input source and one output // source, but each one has multiple channels var numInOutChannels = 2; var aChuck = new AudioWorkletNode( audioContext, 'chuck-node', { numberOfInputs: 1, numberOfOutputs: 1, outputChannelCount: [numInOutChannels], processorOptions: { chuckID: chuckID, srate: audioContext.sampleRate, preloadedFiles: filesToPreload, wasm: theWasm } } ); aChuck.chuckID = chuckID; (function( self ) { self.eventCallbacks = {}; self.deferredPromises = {}; self.eventCallbackCounter = 0; self.deferredPromiseCounter = 0; self.amReady = initPromise; self.onprocessorerror = function( e ) { console.log( e ); } // respond to messages self.port.onmessage = function( event ) { switch( event.data.type ) { case "initCallback": if( self.amReady ) { self.amReady.resolve(); } break; case "console print": chuckPrint( event.data.message ); break; case "eventCallback": if( event.data.callback in self.eventCallbacks ) { self.eventCallbacks[event.data.callback](); } break; case "intCallback": case "floatCallback": case "stringCallback": case "intArrayCallback": case "floatArrayCallback": if( event.data.callback in self.deferredPromises ) { self.deferredPromises[event.data.callback].resolve(event.data.result); delete self.deferredPromises[event.data.callback]; } break; case "newShredCallback": if( event.data.callback in self.deferredPromises ) { if( event.data.shred > 0 ) { self.deferredPromises[event.data.callback].resolve(event.data.shred); } else { self.deferredPromises[event.data.callback].reject("Running code failed"); } } break; case "replacedShredCallback": if( event.data.callback in self.deferredPromises ) { if( event.data.newShred > 0 ) { self.deferredPromises[event.data.callback].resolve({ newShred: event.data.newShred, oldShred: event.data.oldShred }); } else { self.deferredPromises[event.data.callback].reject("Replacing code failed"); } } break; case "removedShredCallback": if( event.data.callback in self.deferredPromises ) { if( event.data.shred > 0 ) { self.deferredPromises[event.data.callback].resolve(event.data.shred); } else { self.deferredPromises[event.data.callback].reject("Removing code failed"); } } break; default: break; } } self.nextDeferID = function() { var callbackID = self.deferredPromiseCounter++; self.deferredPromises[callbackID] = defer(); return callbackID; } // ================== Filesystem ===================== // self.createFile = function( directory, filename, data ) { self.port.postMessage( { type: 'loadFile', directory: directory, filename: filename, data: data } ); } // ================== Run / Compile ================== // self.runCode = function( code ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckCode", code: code, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runCodeWithReplacementDac = function( code, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckCodeWithReplacementDac", code: code, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFile = function( filename ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFile", filename: filename, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFileWithReplacementDac = function( filename, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFileWithReplacementDac", filename: filename, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFileWithArgs = function( filename, colon_separated_args ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFileWithArgsWithReplacementDac = function( filename, colon_separated_args, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceCode = function( code ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckCode", code: code, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceCodeWithReplacementDac = function( code, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckCodeWithReplacementDac", code: code, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFile = function( filename ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFile", filename: filename, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFileWithReplacementDac = function( filename, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFileWithReplacementDac", filename: filename, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFileWithArgs = function( filename, colon_separated_args ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFileWithArgsWithReplacementDac = function( filename, colon_separated_args, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.removeLastCode = function() { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "removeLastCode", callback: callbackID } ); return self.deferredPromises[callbackID]; } self.removeShred = function( shred ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "removeShred", shred: shred, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.isShredActive = function( shred ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "isShredActive", shred: shred, callback: callbackID } ); return self.deferredPromises[callbackID]; } // ================== Int, Float, String ============= // self.setInt = function( variable, value ) { self.port.postMessage( { type: 'setChuckInt', variable: variable, value: value } ); } self.getInt = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: 'getChuckInt', variable: variable, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.setFloat = function( variable, value ) { self.port.postMessage( { type: 'setChuckFloat', variable: variable, value: value } ); } self.getFloat = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: 'getChuckFloat', variable: variable, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.setString = function( variable, value ) { self.port.postMessage( { type: 'setChuckString', variable: variable, value: value } ); } self.getString = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: 'getChuckString', variable: variable, callback: callbackID } ); return self.deferredPromises[callbackID]; } // ================== Event =================== // self.signalEvent = function( variable ) { self.port.postMessage( { type: 'signalChuckEvent', variable: variable } ); } self.broadcastEvent = function( variable ) { self.port.postMessage( { type: 'broadcastChuckEvent', variable: variable } ); } self.listenForEventOnce = function( variable, callback ) { var callbackID = self.eventCallbackCounter++; self.eventCallbacks[callbackID] = callback; self.port.postMessage( { type: 'listenForChuckEventOnce', variable: variable, callback: callbackID } ); } self.startListeningForEvent = function( variable, callback ) { var callbackID = self.eventCallbackCounter++; self.eventCallbacks[callbackID] = callback; self.port.postMessage( { type: 'startListeningForChuckEvent', variable: variable, callback: callbackID } ); return callbackID; } self.stopListeningForEvent = function( variable, callbackID ) { self.port.postMessage( { type: 'stopListeningForChuckEvent', variable: variable, callback: callbackID } ); } // ================== Int[] =================== // self.setIntArray = function( variable, values ) { self.port.postMessage( { type: 'setGlobalIntArray', variable: variable, values: values } ); } self.getIntArray = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( {Lines 1–500 of 839. Load more
var AudioContext = window.AudioContext || window.webkitAudioContext; var audioContext = undefined; var theChuck = undefined; var theChuckAlmostReady = defer(); var theChuckReady = defer(); var filesToPreload = []; var whereIsChuck = whereIsChuck || "./js"; var currentChuckID = 1; var chuckPrint = function( text ) { // override me! } // START taken from emscripten source var readAsync = function( url, onload, onerror ) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function xhr_onload() { if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) // file URLs can return 0 { onload(xhr.response); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null); }; var asyncLoadFile = function( url, onload, onerror ) { readAsync(url, function(arrayBuffer) { onload(new Uint8Array(arrayBuffer)); }, function(event) { if (onerror) { onerror(); } else { throw 'Loading data file "' + url + '" failed.'; } }); } // END taken from emscripten source var loadWasm = new Promise( function( resolve, reject ) { asyncLoadFile( whereIsChuck + '/webchuck.wasm', resolve, reject ); }); var preloadFilenames = async function( filenamesToPreload ) { var promises = []; for( var i = 0; i < filenamesToPreload.length; i++ ) { (function( filenameToPreload ) { promises.push( new Promise( function( resolve, reject ) { asyncLoadFile( filenameToPreload.serverFilename, function( byteArray ) { filesToPreload.push({ filename: filenameToPreload.virtualFilename, data: byteArray }); resolve(); }, function() { console.error( "Error fetching file:", filenameToPreload.serverFilename ); //reject( e ); resolve(); }); }) ); })( filenamesToPreload[i] ); } await Promise.all( promises ); } var theWasm; var startAudioContext = async function() { theWasm = await loadWasm; audioContext = new AudioContext({ //sampleRate: 48000 }); await audioContext.audioWorklet.addModule( whereIsChuck + '/webchuck.js'); } var startChuck = async function() { if( audioContext === undefined ) { await startAudioContext(); var newID = currentChuckID; currentChuckID++; theChuck = await createAChuck( newID, theChuckReady ); theChuck.connect( audioContext.destination ); theChuckAlmostReady.resolve(); } }; var createAChuck = function( chuckID, initPromise ) { // important: "number of inputs / outputs" is like an aggregate source // most of the time, you only want one input source and one output // source, but each one has multiple channels var numInOutChannels = 2; var aChuck = new AudioWorkletNode( audioContext, 'chuck-node', { numberOfInputs: 1, numberOfOutputs: 1, outputChannelCount: [numInOutChannels], processorOptions: { chuckID: chuckID, srate: audioContext.sampleRate, preloadedFiles: filesToPreload, wasm: theWasm } } ); aChuck.chuckID = chuckID; (function( self ) { self.eventCallbacks = {}; self.deferredPromises = {}; self.eventCallbackCounter = 0; self.deferredPromiseCounter = 0; self.amReady = initPromise; self.onprocessorerror = function( e ) { console.log( e ); } // respond to messages self.port.onmessage = function( event ) { switch( event.data.type ) { case "initCallback": if( self.amReady ) { self.amReady.resolve(); } break; case "console print": chuckPrint( event.data.message ); break; case "eventCallback": if( event.data.callback in self.eventCallbacks ) { self.eventCallbacks[event.data.callback](); } break; case "intCallback": case "floatCallback": case "stringCallback": case "intArrayCallback": case "floatArrayCallback": if( event.data.callback in self.deferredPromises ) { self.deferredPromises[event.data.callback].resolve(event.data.result); delete self.deferredPromises[event.data.callback]; } break; case "newShredCallback": if( event.data.callback in self.deferredPromises ) { if( event.data.shred > 0 ) { self.deferredPromises[event.data.callback].resolve(event.data.shred); } else { self.deferredPromises[event.data.callback].reject("Running code failed"); } } break; case "replacedShredCallback": if( event.data.callback in self.deferredPromises ) { if( event.data.newShred > 0 ) { self.deferredPromises[event.data.callback].resolve({ newShred: event.data.newShred, oldShred: event.data.oldShred }); } else { self.deferredPromises[event.data.callback].reject("Replacing code failed"); } } break; case "removedShredCallback": if( event.data.callback in self.deferredPromises ) { if( event.data.shred > 0 ) { self.deferredPromises[event.data.callback].resolve(event.data.shred); } else { self.deferredPromises[event.data.callback].reject("Removing code failed"); } } break; default: break; } } self.nextDeferID = function() { var callbackID = self.deferredPromiseCounter++; self.deferredPromises[callbackID] = defer(); return callbackID; } // ================== Filesystem ===================== // self.createFile = function( directory, filename, data ) { self.port.postMessage( { type: 'loadFile', directory: directory, filename: filename, data: data } ); } // ================== Run / Compile ================== // self.runCode = function( code ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckCode", code: code, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runCodeWithReplacementDac = function( code, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckCodeWithReplacementDac", code: code, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFile = function( filename ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFile", filename: filename, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFileWithReplacementDac = function( filename, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFileWithReplacementDac", filename: filename, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFileWithArgs = function( filename, colon_separated_args ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.runFileWithArgsWithReplacementDac = function( filename, colon_separated_args, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "runChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceCode = function( code ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckCode", code: code, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceCodeWithReplacementDac = function( code, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckCodeWithReplacementDac", code: code, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFile = function( filename ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFile", filename: filename, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFileWithReplacementDac = function( filename, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFileWithReplacementDac", filename: filename, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFileWithArgs = function( filename, colon_separated_args ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.replaceFileWithArgsWithReplacementDac = function( filename, colon_separated_args, dac_name ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "replaceChuckFileWithArgs", filename: filename, colon_separated_args: colon_separated_args, dac_name: dac_name, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.removeLastCode = function() { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "removeLastCode", callback: callbackID } ); return self.deferredPromises[callbackID]; } self.removeShred = function( shred ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "removeShred", shred: shred, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.isShredActive = function( shred ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: "isShredActive", shred: shred, callback: callbackID } ); return self.deferredPromises[callbackID]; } // ================== Int, Float, String ============= // self.setInt = function( variable, value ) { self.port.postMessage( { type: 'setChuckInt', variable: variable, value: value } ); } self.getInt = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: 'getChuckInt', variable: variable, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.setFloat = function( variable, value ) { self.port.postMessage( { type: 'setChuckFloat', variable: variable, value: value } ); } self.getFloat = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: 'getChuckFloat', variable: variable, callback: callbackID } ); return self.deferredPromises[callbackID]; } self.setString = function( variable, value ) { self.port.postMessage( { type: 'setChuckString', variable: variable, value: value } ); } self.getString = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( { type: 'getChuckString', variable: variable, callback: callbackID } ); return self.deferredPromises[callbackID]; } // ================== Event =================== // self.signalEvent = function( variable ) { self.port.postMessage( { type: 'signalChuckEvent', variable: variable } ); } self.broadcastEvent = function( variable ) { self.port.postMessage( { type: 'broadcastChuckEvent', variable: variable } ); } self.listenForEventOnce = function( variable, callback ) { var callbackID = self.eventCallbackCounter++; self.eventCallbacks[callbackID] = callback; self.port.postMessage( { type: 'listenForChuckEventOnce', variable: variable, callback: callbackID } ); } self.startListeningForEvent = function( variable, callback ) { var callbackID = self.eventCallbackCounter++; self.eventCallbacks[callbackID] = callback; self.port.postMessage( { type: 'startListeningForChuckEvent', variable: variable, callback: callbackID } ); return callbackID; } self.stopListeningForEvent = function( variable, callbackID ) { self.port.postMessage( { type: 'stopListeningForChuckEvent', variable: variable, callback: callbackID } ); } // ================== Int[] =================== // self.setIntArray = function( variable, values ) { self.port.postMessage( { type: 'setGlobalIntArray', variable: variable, values: values } ); } self.getIntArray = function( variable ) { var callbackID = self.nextDeferID(); self.port.postMessage( {