UNPKG

wam-community

Version:

A collection of prebuilt Web Audio Modules ready for use

663 lines (594 loc) 59.9 kB
/* Code generated with Faust version 2.40.12 Compilation options: -lang wasm-ib -cn deathgate -es 1 -mcd 16 -single -ftz 2 */ function getJSONdeathgate() { return '{"name": "deathgate","filename": "deathgate.dsp","version": "2.40.12","compile_options": "-lang wasm-ib -cn deathgate -es 1 -mcd 16 -single -ftz 2","include_pathnames": ["/usr/local/share/faust","/usr/local/share/faust","/usr/share/faust",".","/tmp/sessions/5E862E608BD8F8DBD989B4A60E5B4C8BC4E28624/web/wap"],"size": 1084,"inputs": 2,"outputs": 2,"meta": [ { "analyzers_lib_name": "Faust Analyzer Library" },{ "analyzers_lib_version": "0.1" },{ "author": "Oleg Kapitonov" },{ "basics_lib_name": "Faust Basic Element Library" },{ "basics_lib_version": "0.6" },{ "compilation_options": "-single -scal -I libraries/ -I project/ -lang wasm" },{ "compile_options": "-lang wasm-ib -cn deathgate -es 1 -mcd 16 -single -ftz 2" },{ "filename": "deathgate.dsp" },{ "filters_lib_filterbank_author": "Julius O. Smith III" },{ "filters_lib_filterbank_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_filterbank_license": "MIT-style STK-4.3 license" },{ "filters_lib_fir_author": "Julius O. Smith III" },{ "filters_lib_fir_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_fir_license": "MIT-style STK-4.3 license" },{ "filters_lib_highpass_author": "Julius O. Smith III" },{ "filters_lib_highpass_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_highpass_plus_lowpass_author": "Julius O. Smith III" },{ "filters_lib_highpass_plus_lowpass_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_highpass_plus_lowpass_license": "MIT-style STK-4.3 license" },{ "filters_lib_iir_author": "Julius O. Smith III" },{ "filters_lib_iir_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_iir_license": "MIT-style STK-4.3 license" },{ "filters_lib_lowpass0_highpass1": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_lowpass0_highpass1_author": "Julius O. Smith III" },{ "filters_lib_lowpass_author": "Julius O. Smith III" },{ "filters_lib_lowpass_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_lowpass_license": "MIT-style STK-4.3 license" },{ "filters_lib_name": "Faust Filters Library" },{ "filters_lib_tf1_author": "Julius O. Smith III" },{ "filters_lib_tf1_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_tf1_license": "MIT-style STK-4.3 license" },{ "filters_lib_tf1s_author": "Julius O. Smith III" },{ "filters_lib_tf1s_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_tf1s_license": "MIT-style STK-4.3 license" },{ "filters_lib_tf2_author": "Julius O. Smith III" },{ "filters_lib_tf2_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_tf2_license": "MIT-style STK-4.3 license" },{ "filters_lib_tf2s_author": "Julius O. Smith III" },{ "filters_lib_tf2s_copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters_lib_tf2s_license": "MIT-style STK-4.3 license" },{ "filters_lib_version": "0.3" },{ "library_path0": "/libraries/stdfaust.lib" },{ "library_path1": "/libraries/filters.lib" },{ "library_path2": "/libraries/maths.lib" },{ "library_path3": "/libraries/platform.lib" },{ "library_path4": "/libraries/basics.lib" },{ "library_path5": "/libraries/analyzers.lib" },{ "library_path6": "/libraries/misceffects.lib" },{ "library_path7": "/libraries/signals.lib" },{ "license": "GPLv3" },{ "maths_lib_author": "GRAME" },{ "maths_lib_copyright": "GRAME" },{ "maths_lib_license": "LGPL with exception" },{ "maths_lib_name": "Faust Math Library" },{ "maths_lib_version": "2.5" },{ "misceffects_lib_name": "Misc Effects Library" },{ "misceffects_lib_version": "2.0" },{ "name": "deathgate" },{ "platform_lib_name": "Generic Platform Library" },{ "platform_lib_version": "0.2" },{ "signals_lib_name": "Faust Signal Routing Library" },{ "signals_lib_version": "0.1" },{ "version": "0.1b" }],"ui": [ {"type": "vgroup","label": "deathgate","items": [ {"type": "vslider","label": "DeadZone","shortname": "DeadZone","address": "/deathgate/DeadZone","index": 28,"meta": [{ "style": "knob" }],"init": -100,"min": -120,"max": 0,"step": 0.001},{"type": "vslider","label": "NoiseGate","shortname": "NoiseGate","address": "/deathgate/NoiseGate","index": 280,"meta": [{ "style": "knob" }],"init": -120,"min": -120,"max": 0,"step": 0.001}]}]}'; } function getBase64Codedeathgate() { return "AGFzbQEAAAAB24CAgAARYAJ/fwBgBH9/f38AYAF9AX1gAX8Bf2ABfwF/YAJ/fwF9YAF/AX9gAn9/AGABfwBgAn9/AGACf38AYAF/AGACf38Bf2ACf38Bf2ACfX0BfWADf399AGABfQF9AqWAgIAAAwNlbnYFX2V4cGYAAgNlbnYFX3Bvd2YADgNlbnYFX3RhbmYAEAOPgICAAA4AAQMEBQYHCAkKCwwNDwWMgICAAAEBhICAgADsh4CAAAe6gYCAAAwHY29tcHV0ZQAEDGdldE51bUlucHV0cwAFDWdldE51bU91dHB1dHMABg1nZXRQYXJhbVZhbHVlAAcNZ2V0U2FtcGxlUmF0ZQAIBGluaXQACQ1pbnN0YW5jZUNsZWFyAAoRaW5zdGFuY2VDb25zdGFudHMACwxpbnN0YW5jZUluaXQADBppbnN0YW5jZVJlc2V0VXNlckludGVyZmFjZQANDXNldFBhcmFtVmFsdWUAEAZtZW1vcnkCAAr48YCAAA6CgICAAAALwcCAgAACGn96fUEAIQRBACEFQQAhBkEAIQdDAAAAACEeQwAAAAAhH0MAAAAAISBBACEIQwAAAAAhIUMAAAAAISJDAAAAACEjQwAAAAAhJEMAAAAAISVDAAAAACEmQwAAAAAhJ0MAAAAAIShDAAAAACEpQwAAAAAhKkMAAAAAIStDAAAAACEsQwAAAAAhLUMAAAAAIS5DAAAAACEvQwAAAAAhMEMAAAAAITFDAAAAACEyQwAAAAAhM0EAIQlBACEKQQAhC0MAAAAAITRDAAAAACE1QwAAAAAhNkMAAAAAITdDAAAAACE4QwAAAAAhOUMAAAAAITpDAAAAACE7QwAAAAAhPEMAAAAAIT1DAAAAACE+QwAAAAAhP0MAAAAAIUBDAAAAACFBQwAAAAAhQkMAAAAAIUNDAAAAACFEQwAAAAAhRUMAAAAAIUZDAAAAACFHQwAAAAAhSEEAIQxBACENQQAhDkMAAAAAIUlDAAAAACFKQwAAAAAhS0MAAAAAIUxDAAAAACFNQwAAAAAhTkMAAAAAIU9DAAAAACFQQwAAAAAhUUMAAAAAIVJDAAAAACFTQwAAAAAhVEMAAAAAIVVDAAAAACFWQwAAAAAhV0MAAAAAIVhDAAAAACFZQwAAAAAhWkMAAAAAIVtBACEPQQAhEEEAIRFDAAAAACFcQwAAAAAhXUMAAAAAIV5DAAAAACFfQwAAAAAhYEMAAAAAIWFDAAAAACFiQwAAAAAhY0MAAAAAIWRDAAAAACFlQwAAAAAhZkMAAAAAIWdDAAAAACFoQwAAAAAhaUMAAAAAIWpDAAAAACFrQwAAAAAhbEEAIRJBACETQQAhFEMAAAAAIW1DAAAAACFuQwAAAAAhb0MAAAAAIXBDAAAAACFxQwAAAAAhckMAAAAAIXNDAAAAACF0QwAAAAAhdUMAAAAAIXZDAAAAACF3QwAAAAAheEMAAAAAIXlDAAAAACF6QwAAAAAhe0EAIRVBACEWQQAhF0MAAAAAIXxDAAAAACF9QwAAAAAhfkMAAAAAIX9DAAAAACGAAUMAAAAAIYEBQwAAAAAhggFDAAAAACGDAUMAAAAAIYQBQwAAAAAhhQFDAAAAACGGAUMAAAAAIYcBQwAAAAAhiAFBACEYQQAhGUEAIRpDAAAAACGJAUMAAAAAIYoBQwAAAAAhiwFDAAAAACGMAUMAAAAAIY0BQwAAAAAhjgFDAAAAACGPAUMAAAAAIZABQwAAAAAhkQFDAAAAACGSAUEAIRtBACEcQQAhHUMAAAAAIZMBQwAAAAAhlAFDAAAAACGVAUMAAAAAIZYBQwAAAAAhlwEgAkEAaigCACEEIAJBBGooAgAhBSADQQBqKAIAIQYgA0EEaigCACEHQwAAIEFDzcxMPUEAKgIclBABIR5DAACAvyAelCEfQwAAIEFDzcxMPUEAKgKYApQQASEgQQAhCANAAkAgBCAIaioCACAFIAhqKgIAkiEhQQAgITgCKEEAKgIkQQAqAiyUQQAqAjBBACoCNEEAKgI8lEEAKgIgICGUk5STISJBACAivEGAgID8B3EEfSAiBUMAAAAACzgCOCAeQQAqAjiXIB9BACoCOJaSISNBACAjOAJAQQAqAhhBACoCRJRBACoCSEEAKgJMQQAqAlSUQQAqAgwgI5STlJMhJEEAICS8QYCAgPwHcQR9ICQFQwAAAAALOAJQQQAqAlBBACoCEEEAKgJYQQAqAmiUQQAqAlxBACoCZJSSlJMhJUEAICW8QYCAgPwHcQR9ICUFQwAAAAALOAJgQQAqAoABQQAqAogBlCEmQQAqAhBBACoCFEEAKgJglEEAKgJsQQAqAmSUkkEAKgIUQQAqAmiUkpRBACoCcEEAKgJ4QQAqAowBlCAmkpSTISdBACAnvEGAgID8B3EEfSAnBUMAAAAACzgChAFBACoCoAFBACoCqAGUIShBACoCjAFBACoCcCAmQQAqAnhBACoChAGUkpSSQQAqApABQQAqApgBQQAqAqwBlCAokpSTISlBACApvEGAgID8B3EEfSApBUMAAAAACzgCpAFBACoCwAFBACoCyAGUISpBACoCrAFBACoCkAEgKEEAKgKYAUEAKgKkAZSSlJJBACoCsAFBACoCuAFBACoCzAGUICqSlJMhK0EAICu8QYCAgPwHcQR9ICsFQwAAAAALOALEAUEAKgLgAUEAKgLoAZQhLEEAKgLMAUEAKgKwASAqQQAqArgBQQAqAsQBlJKUkkEAKgLQAUEAKgLYAUEAKgLsAZQgLJKUkyEtQQAgLbxBgICA/AdxBH0gLQVDAAAAAAs4AuQBQQAqAoACQQAqAogClCEuQQAqAuwBQQAqAtABICxBACoC2AFBACoC5AGUkpSSQQAqAvABQQAqAvgBQQAqAowClCAukpSTIS9BACAvvEGAgID8B3EEfSAvBUMAAAAACzgChAJBACoCjAJBACoC8AEgLkEAKgL4AUEAKgKEApSSlJIhMEEAKgIIIDCLlEEAKgIEQQAqApQClJIhMUEAIDG8QYCAgPwHcQR9IDEFQwAAAAALOAKQAkEAKgKQAiEyIDK8QYCAgPwHcQR9IDIFQwAAAAALITMgMyAgXiEJQQAgCTYCnAJBACgCpAIgCUEAKAKgAkhsIQpBACgCrAJBf2ohC0EAIAogC0gEfyALBSAKCzYCqAIgCbJBACgCqAJBAEqyl4shNEEAKgLAAiA0XgR9QQAqArACBUEAKgIECyE1IDRDAACAPyA1k5QgNUEAKgK4ApSSITZBACA2vEGAgID8B3EEfSA2BUMAAAAACzgCtAJBACoCtAIhN0EAIDe8QYCAgPwHcQR9IDcFQwAAAAALOAK8AkMAAAAAQQAqAkhBACoCTEEAKgLQApQgI0EAKgJEkpOUkyE4QQAgOLxBgICA/AdxBH0gOAVDAAAAAAs4AswCQQAqAswCQQAqAhBBACoCWEEAKgLcApRBACoCXEEAKgLYApSSlJMhOUEAIDm8QYCAgPwHcQR9IDkFQwAAAAALOALUAkEAKgLcAkEAKgLUAkMAAABAQQAqAtgClJKSITpBACA6OALgAkEAKgIQQQAqAsgCIDqUQQAqAugCQQAqAuQClJKUQQAqAuwCQQAqAvQClJMhO0EAIDu8QYCAgPwHcQR9IDsFQwAAAAALOALwAkEAKgLwAkEAKgLEAkEAKgL4AkEAKgKEA5RBACoCgAFBACoCgAOUkpSTITxBACA8vEGAgID8B3EEfSA8BUMAAAAACzgC/AJBACoCoAFBACoCkAOUIT1BACoCxAJBACoCfEEAKgL8ApRBACoCiANBACoCgAOUkkEAKgJ8QQAqAoQDlJKUQQAqApABQQAqApgBQQAqApQDlCA9kpSTIT5BACA+vEGAgID8B3EEfSA+BUMAAAAACzgCjANBACoCwAFBACoCnAOUIT9BACoClANBACoCkAEgPUEAKgKYAUEAKgKMA5SSlJJBACoCsAFBACoCuAFBACoCoAOUID+SlJMhQEEAIEC8QYCAgPwHcQR9IEAFQwAAAAALOAKYA0EAKgLgAUEAKgKoA5QhQUEAKgKgA0EAKgKwASA/QQAqArgBQQAqApgDlJKUkkEAKgLQAUEAKgLYAUEAKgKsA5QgQZKUkyFCQQAgQrxBgICA/AdxBH0gQgVDAAAAAAs4AqQDQQAqAoACQQAqArQDlCFDQQAqAqwDQQAqAtABIEFBACoC2AFBACoCpAOUkpSSQQAqAvABQQAqAvgBQQAqArgDlCBDkpSTIURBACBEvEGAgID8B3EEfSBEBUMAAAAACzgCsANBACoCuANBACoC8AEgQ0EAKgL4AUEAKgKwA5SSlJIhRUEAKgIIIEWLlEEAKgIEQQAqAsADlJIhRkEAIEa8QYCAgPwHcQR9IEYFQwAAAAALOAK8A0EAKgK8AyFHIEe8QYCAgPwHcQR9IEcFQwAAAAALIUggSCAgXiEMQQAgDDYCxANBACgCpAIgDEEAKALIA0hsIQ1BACgC0ANBf2ohDkEAIA0gDkgEfyAOBSANCzYCzAMgDLJBACgCzANBAEqyl4shSUEAKgLgAyBJXgR9QQAqArACBUEAKgIECyFKIElDAACAPyBKk5QgSkEAKgLYA5SSIUtBACBLvEGAgID8B3EEfSBLBUMAAAAACzgC1ANBACoC1AMhTEEAIEy8QYCAgPwHcQR9IEwFQwAAAAALOALcA0MAAAAAQQAqAuwDQQAqAnRBACoC9AOUQQAqAhAgOkEAKgLkApKUk5STIU1BACBNvEGAgID8B3EEfSBNBUMAAAAACzgC8ANBACoC8ANBACoCxAJBACoC+AJBACoCgASUQQAqAoABQQAqAvwDlJKUkyFOQQAgTrxBgICA/AdxBH0gTgVDAAAAAAs4AvgDQQAqAoAEQQAqAvgDQwAAAEBBACoC/AOUkpIhT0EAIE84AoQEQQAqAsQCQQAqAugDIE+UQQAqAowEQQAqAogElJKUQQAqApAEQQAqApgElJMhUEEAIFC8QYCAgPwHcQR9IFAFQwAAAAALOAKUBEEAKgKUBEEAKgLkA0EAKgKcBEEAKgKoBJRBACoCoAFBACoCpASUkpSTIVFBACBRvEGAgID8B3EEfSBRBUMAAAAACzgCoARBACoCwAFBACoCtASUIVJBACoC5ANBACoCnAFBACoCoASUQQAqAqwEQQAqAqQElJJBACoCnAFBACoCqASUkpRBACoCsAFBACoCuAFBACoCuASUIFKSlJMhU0EAIFO8QYCAgPwHcQR9IFMFQwAAAAALOAKwBEEAKgLgAUEAKgLABJQhVEEAKgK4BEEAKgKwASBSQQAqArgBQQAqArAElJKUkkEAKgLQAUEAKgLYAUEAKgLEBJQgVJKUkyFVQQAgVbxBgICA/AdxBH0gVQVDAAAAAAs4ArwEQQAqAoACQQAqAswElCFWQQAqAsQEQQAqAtABIFRBACoC2AFBACoCvASUkpSSQQAqAvABQQAqAvgBQQAqAtAElCBWkpSTIVdBACBXvEGAgID8B3EEfSBXBUMAAAAACzgCyARBACoC0ARBACoC8AEgVkEAKgL4AUEAKgLIBJSSlJIhWEEAKgIIIFiLlEEAKgIEQQAqAtgElJIhWUEAIFm8QYCAgPwHcQR9IFkFQwAAAAALOALUBEEAKgLUBCFaIFq8QYCAgPwHcQR9IFoFQwAAAAALIVsgWyAgXiEPQQAgDzYC3ARBACgCpAIgD0EAKALgBEhsIRBBACgC6ARBf2ohEUEAIBAgEUgEfyARBSAQCzYC5AQgD7JBACgC5ARBAEqyl4shXEEAKgL4BCBcXgR9QQAqArACBUEAKgIECyFdIFxDAACAPyBdk5QgXUEAKgLwBJSSIV5BACBevEGAgID8B3EEfSBeBUMAAAAACzgC7ARBACoC7AQhX0EAIF+8QYCAgPwHcQR9IF8FQwAAAAALOAL0BEMAAAAAQQAqAoQFQQAqApQBQQAqAowFlEEAKgLEAiBPQQAqAogEkpSTlJMhYEEAIGC8QYCAgPwHcQR9IGAFQwAAAAALOAKIBUEAKgKIBUEAKgLkA0EAKgKcBEEAKgKYBZRBACoCoAFBACoClAWUkpSTIWFBACBhvEGAgID8B3EEfSBhBUMAAAAACzgCkAVBACoCmAVBACoCkAVDAAAAQEEAKgKUBZSSkiFiQQAgYjgCnAVBACoC5ANBACoCgAUgYpRBACoCpAVBACoCoAWUkpRBACoCqAVBACoCsAWUkyFjQQAgY7xBgICA/AdxBH0gYwVDAAAAAAs4AqwFQQAqAqwFQQAqAvwEQQAqArQFQQAqAsAFlEEAKgLAAUEAKgK8BZSSlJMhZEEAIGS8QYCAgPwHcQR9IGQFQwAAAAALOAK4BUEAKgLgAUEAKgLMBZQhZUEAKgL8BEEAKgK8AUEAKgK4BZRBACoCxAVBACoCvAWUkkEAKgK8AUEAKgLABZSSlEEAKgLQAUEAKgLYAUEAKgLQBZQgZZKUkyFmQQAgZrxBgICA/AdxBH0gZgVDAAAAAAs4AsgFQQAqAoACQQAqAtgFlCFnQQAqAtAFQQAqAtABIGVBACoC2AFBACoCyAWUkpSSQQAqAvABQQAqAvgBQQAqAtwFlCBnkpSTIWhBACBovEGAgID8B3EEfSBoBUMAAAAACzgC1AVBACoC3AVBACoC8AEgZ0EAKgL4AUEAKgLUBZSSlJIhaUEAKgIIIGmLlEEAKgIEQQAqAuQFlJIhakEAIGq8QYCAgPwHcQR9IGoFQwAAAAALOALgBUEAKgLgBSFrIGu8QYCAgPwHcQR9IGsFQwAAAAALIWwgbCAgXiESQQAgEjYC6AVBACgCpAIgEkEAKALsBUhsIRNBACgC9AVBf2ohFEEAIBMgFEgEfyAUBSATCzYC8AUgErJBACgC8AVBAEqyl4shbUEAKgKEBiBtXgR9QQAqArACBUEAKgIECyFuIG1DAACAPyBuk5QgbkEAKgL8BZSSIW9BACBvvEGAgID8B3EEfSBvBUMAAAAACzgC+AVBACoC+AUhcEEAIHC8QYCAgPwHcQR9IHAFQwAAAAALOAKABkMAAAAAQQAqApAGQQAqArQBQQAqApgGlEEAKgLkAyBiQQAqAqAFkpSTlJMhcUEAIHG8QYCAgPwHcQR9IHEFQwAAAAALOAKUBkEAKgKUBkEAKgL8BEEAKgK0BUEAKgKkBpRBACoCwAFBACoCoAaUkpSTIXJBACByvEGAgID8B3EEfSByBUMAAAAACzgCnAZBACoCpAZBACoCnAZDAAAAQEEAKgKgBpSSkiFzQQAgczgCqAZBACoC/ARBACoCjAYgc5RBACoCsAZBACoCrAaUkpRBACoCtAZBACoCvAaUkyF0QQAgdLxBgICA/AdxBH0gdAVDAAAAAAs4ArgGQQAqArgGQQAqAogGQQAqAsAGQQAqAswGlEEAKgLgAUEAKgLIBpSSlJMhdUEAIHW8QYCAgPwHcQR9IHUFQwAAAAALOALEBkEAKgKAAkEAKgLYBpQhdkEAKgKIBkEAKgLcAUEAKgLEBpRBACoC0AZBACoCyAaUkkEAKgLcAUEAKgLMBpSSlEEAKgLwAUEAKgL4AUEAKgLcBpQgdpKUkyF3QQAgd7xBgICA/AdxBH0gdwVDAAAAAAs4AtQGQQAqAtwGQQAqAvABIHZBACoC+AFBACoC1AaUkpSSIXhBACoCCCB4i5RBACoCBEEAKgLkBpSSIXlBACB5vEGAgID8B3EEfSB5BUMAAAAACzgC4AZBACoC4AYheiB6vEGAgID8B3EEfSB6BUMAAAAACyF7IHsgIF4hFUEAIBU2AugGQQAoAqQCIBVBACgC7AZIbCEWQQAoAvQGQX9qIRdBACAWIBdIBH8gFwUgFgs2AvAGIBWyQQAoAvAGQQBKspeLIXxBACoChAcgfF4EfUEAKgKwAgVBACoCBAshfSB8QwAAgD8gfZOUIH1BACoC/AaUkiF+QQAgfrxBgICA/AdxBH0gfgVDAAAAAAs4AvgGQQAqAvgGIX9BACB/vEGAgID8B3EEfSB/BUMAAAAACzgCgAdDAAAAAEEAKgKQB0EAKgLUAUEAKgKYB5RBACoC/AQgc0EAKgKsBpKUk5STIYABQQAggAG8QYCAgPwHcQR9IIABBUMAAAAACzgClAdBACoClAdBACoCiAZBACoCwAZBACoCpAeUQQAqAuABQQAqAqAHlJKUkyGBAUEAIIEBvEGAgID8B3EEfSCBAQVDAAAAAAs4ApwHQQAqAqQHQQAqApwHQwAAAEBBACoCoAeUkpIhggFBACCCATgCqAdBACoCiAZBACoCjAcgggGUQQAqArAHQQAqAqwHlJKUQQAqArQHQQAqArwHlJMhgwFBACCDAbxBgICA/AdxBH0ggwEFQwAAAAALOAK4B0EAKgK4B0EAKgKIB0EAKgLAB0EAKgLMB5RBACoCgAJBACoCyAeUkpSTIYQBQQAghAG8QYCAgPwHcQR9IIQBBUMAAAAACzgCxAdBACoC/AFBACoCxAeUQQAqAtAHQQAqAsgHlJJBACoC/AFBACoCzAeUkiGFAUEAKgIIQQAqAogHIIUBlIuUQQAqAgRBACoC2AeUkiGGAUEAIIYBvEGAgID8B3EEfSCGAQVDAAAAAAs4AtQHQQAqAtQHIYcBIIcBvEGAgID8B3EEfSCHAQVDAAAAAAshiAEgiAEgIF4hGEEAIBg2AtwHQQAoAqQCIBhBACgC4AdIbCEZQQAoAugHQX9qIRpBACAZIBpIBH8gGgUgGQs2AuQHIBiyQQAoAuQHQQBKspeLIYkBQQAqAvgHIIkBXgR9QQAqArACBUEAKgIECyGKASCJAUMAAIA/IIoBk5QgigFBACoC8AeUkiGLAUEAIIsBvEGAgID8B3EEfSCLAQVDAAAAAAs4AuwHQQAqAuwHIYwBQQAgjAG8QYCAgPwHcQR9IIwBBUMAAAAACzgC9AdDAAAAAEEAKgL8B0EAKgL0AUEAKgKECJRBACoCiAYgggFBACoCrAeSlJOUkyGNAUEAII0BvEGAgID8B3EEfSCNAQVDAAAAAAs4AoAIQQAqAoAIQQAqAogHQQAqAsAHQQAqApAIlEEAKgKAAkEAKgKMCJSSlJMhjgFBACCOAbxBgICA/AdxBH0gjgEFQwAAAAALOAKICEEAKgKQCEEAKgKICEMAAABAQQAqAowIlJKSIY8BQQAqAghBACoCiAcgjwGUi5RBACoCBEEAKgKYCJSSIZABQQAgkAG8QYCAgPwHcQR9IJABBUMAAAAACzgClAhBACoClAghkQEgkQG8QYCAgPwHcQR9IJEBBUMAAAAACyGSASCSASAgXiEbQQAgGzYCnAhBACgCpAIgG0EAKAKgCEhsIRxBACgCqAhBf2ohHUEAIBwgHUgEfyAdBSAcCzYCpAggG7JBACgCpAhBAEqyl4shkwFBACoCuAggkwFeBH1BACoCsAIFQQAqAgQLIZQBIJMBQwAAgD8glAGTlCCUAUEAKgKwCJSSIZUBQQAglQG8QYCAgPwHcQR9IJUBBUMAAAAACzgCrAhBACoCrAghlgFBACCWAbxBgICA/AdxBH0glgEFQwAAAAALOAK0CEEAKgK8AiAwlEEAKgLcAyBFlJJBACoC9AQgWJSSQQAqAoAGIGmUkkEAKgKAByB4lJJBACoCiAdBACoC9AcghQGUQQAqArQIII8BlJKUkiGXASAGIAhqIJcBOAIAIAcgCGoglwE4AgBBAEEAKgIoOAIsQQBBACoCODgCPEEAQQAqAkA4AkRBAEEAKgJQOAJUQQBBACoCZDgCaEEAQQAqAmA4AmRBAEEAKgKIATgCjAFBAEEAKgKEATgCiAFBAEEAKgKoATgCrAFBAEEAKgKkATgCqAFBAEEAKgLIATgCzAFBAEEAKgLEATgCyAFBAEEAKgLoATgC7AFBAEEAKgLkATgC6AFBAEEAKgKIAjgCjAJBAEEAKgKEAjgCiAJBAEEAKgKQAjgClAJBAEEAKAKcAjYCoAJBAEEAKAKoAjYCrAJBAEEAKgK0AjgCuAJBAEEAKgK8AjgCwAJBAEEAKgLMAjgC0AJBAEEAKgLYAjgC3AJBAEEAKgLUAjgC2AJBAEEAKgLgAjgC5AJBAEEAKgLwAjgC9AJBAEEAKgKAAzgChANBAEEAKgL8AjgCgANBAEEAKgKQAzgClANBAEEAKgKMAzgCkANBAEEAKgKcAzgCoANBAEEAKgKYAzgCnANBAEEAKgKoAzgCrANBAEEAKgKkAzgCqANBAEEAKgK0AzgCuANBAEEAKgKwAzgCtANBAEEAKgK8AzgCwANBAEEAKALEAzYCyANBAEEAKALMAzYC0ANBAEEAKgLUAzgC2ANBAEEAKgLcAzgC4ANBAEEAKgLwAzgC9ANBAEEAKgL8AzgCgARBAEEAKgL4AzgC/ANBAEEAKgKEBDgCiARBAEEAKgKUBDgCmARBAEEAKgKkBDgCqARBAEEAKgKgBDgCpARBAEEAKgK0BDgCuARBAEEAKgKwBDgCtARBAEEAKgLABDgCxARBAEEAKgK8BDgCwARBAEEAKgLMBDgC0ARBAEEAKgLIBDgCzARBAEEAKgLUBDgC2ARBAEEAKALcBDYC4ARBAEEAKALkBDYC6ARBAEEAKgLsBDgC8ARBAEEAKgL0BDgC+ARBAEEAKgKIBTgCjAVBAEEAKgKUBTgCmAVBAEEAKgKQBTgClAVBAEEAKgKcBTgCoAVBAEEAKgKsBTgCsAVBAEEAKgK8BTgC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MDg0LCJpbnB1dHMiOiAyLCJvdXRwdXRzIjogMiwibWV0YSI6IFsgeyAiYW5hbHl6ZXJzX2xpYl9uYW1lIjogIkZhdXN0IEFuYWx5emVyIExpYnJhcnkiIH0seyAiYW5hbHl6ZXJzX2xpYl92ZXJzaW9uIjogIjAuMSIgfSx7ICJhdXRob3IiOiAiT2xlZyBLYXBpdG9ub3YiIH0seyAiYmFzaWNzX2xpYl9uYW1lIjogIkZhdXN0IEJhc2ljIEVsZW1lbnQgTGlicmFyeSIgfSx7ICJiYXNpY3NfbGliX3ZlcnNpb24iOiAiMC42IiB9LHsgImNvbXBpbGF0aW9uX29wdGlvbnMiOiAiLXNpbmdsZSAtc2NhbCAtSSBsaWJyYXJpZXMvIC1JIHByb2plY3QvIC1sYW5nIHdhc20iIH0seyAiY29tcGlsZV9vcHRpb25zIjogIi1sYW5nIHdhc20taWIgLWNuIGRlYXRoZ2F0ZSAtZXMgMSAtbWNkIDE2IC1zaW5nbGUgLWZ0eiAyIiB9LHsgImZpbGVuYW1lIjogImRlYXRoZ2F0ZS5kc3AiIH0seyAiZmlsdGVyc19saWJfZmlsdGVyYmFua19hdXRob3IiOiAiSnVsaXVzIE8uIFNtaXRoIElJSSIgfSx7ICJmaWx0ZXJzX2xpYl9maWx0ZXJiYW5rX2NvcHlyaWdodCI6ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBieSBKdWxpdXMgTy4gU21pdGggSUlJIDxqb3NAY2NybWEuc3RhbmZvcmQuZWR1PiIgfSx7ICJmaWx0ZXJzX2xpYl9maWx0ZXJiYW5rX2xpY2Vuc2UiOiAiTUlULXN0eWxlIFNUSy00LjMgbGljZW5zZSIgfSx7ICJmaWx0ZXJzX2xpYl9maXJfYXV0aG9yIjogIkp1bGl1cyBPLiBTbWl0aCBJSUkiIH0seyAiZmlsdGVyc19saWJfZmlyX2NvcHlyaWdodCI6ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBieSBKdWxpdXMgTy4gU21pdGggSUlJIDxqb3NAY2NybWEuc3RhbmZvcmQuZWR1PiIgfSx7ICJmaWx0ZXJzX2xpYl9maXJfbGljZW5zZSI6ICJNSVQtc3R5bGUgU1RLLTQuMyBsaWNlbnNlIiB9LHsgImZpbHRlcnNfbGliX2hpZ2hwYXNzX2F1dGhvciI6ICJKdWxpdXMgTy4gU21pdGggSUlJIiB9LHsgImZpbHRlcnNfbGliX2hpZ2hwYXNzX2NvcHlyaWdodCI6ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBieSBKdWxpdXMgTy4gU21pdGggSUlJIDxqb3NAY2NybWEuc3RhbmZvcmQuZWR1PiIgfSx7ICJmaWx0ZXJzX2xpYl9oaWdocGFzc19wbHVzX2xvd3Bhc3NfYXV0aG9yIjogIkp1bGl1cyBPLiBTbWl0aCBJSUkiIH0seyAiZmlsdGVyc19saWJfaGlnaHBhc3NfcGx1c19sb3dwYXNzX2NvcHlyaWdodCI6ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBieSBKdWxpdXMgTy4gU21pdGggSUlJIDxqb3NAY2NybWEuc3RhbmZvcmQuZWR1PiIgfSx7ICJmaWx0ZXJzX2xpYl9oaWdocGFzc19wbHVzX2xvd3Bhc3NfbGljZW5zZSI6ICJNSVQtc3R5bGUgU1RLLTQuMyBsaWNlbnNlIiB9LHsgImZpbHRlcnNfbGliX2lpcl9hdXRob3IiOiAiSnVsaXVzIE8uIFNtaXRoIElJSSIgfSx7ICJmaWx0ZXJzX2xpYl9paXJfY29weXJpZ2h0IjogIkNvcHlyaWdodCAoQykgMjAwMy0yMDE5IGJ5IEp1bGl1cyBPLiBTbWl0aCBJSUkgPGpvc0BjY3JtYS5zdGFuZm9yZC5lZHU+IiB9LHsgImZpbHRlcnNfbGliX2lpcl9saWNlbnNlIjogIk1JVC1zdHlsZSBTVEstNC4zIGxpY2Vuc2UiIH0seyAiZmlsdGVyc19saWJfbG93cGFzczBfaGlnaHBhc3MxIjogIkNvcHlyaWdodCAoQykgMjAwMy0yMDE5IGJ5IEp1bGl1cyBPLiBTbWl0aCBJSUkgPGpvc0BjY3JtYS5zdGFuZm9yZC5lZHU+IiB9LHsgImZpbHRlcnNfbGliX2xvd3Bhc3MwX2hpZ2hwYXNzMV9hdXRob3IiOiAiSnVsaXVzIE8uIFNtaXRoIElJSSIgfSx7ICJmaWx0ZXJzX2xpYl9sb3dwYXNzX2F1dGhvciI6ICJKdWxpdXMgTy4gU21pdGggSUlJIiB9LHsgImZpbHRlcnNfbGliX2xvd3Bhc3NfY29weXJpZ2h0IjogIkNvcHlyaWdodCAoQykgMjAwMy0yMDE5IGJ5IEp1bGl1cyBPLiBTbWl0aCBJSUkgPGpvc0BjY3JtYS5zdGFuZm9yZC5lZHU+IiB9LHsgImZpbHRlcnNfbGliX2xvd3Bhc3NfbGljZW5zZSI6ICJNSVQtc3R5bGUgU1RLLTQuMyBsaWNlbnNlIiB9LHsgImZpbHRlcnNfbGliX25hbWUiOiAiRmF1c3QgRmlsdGVycyBMaWJyYXJ5IiB9LHsgImZpbHRlcnNfbGliX3RmMV9hdXRob3IiOiAiSnVsaXVzIE8uIFNtaXRoIElJSSIgfSx7ICJmaWx0ZXJzX2xpYl90ZjFfY29weXJpZ2h0IjogIkNvcHlyaWdodCAoQykgMjAwMy0yMDE5IGJ5IEp1bGl1cyBPLiBTbWl0aCBJSUkgPGpvc0BjY3JtYS5zdGFuZm9yZC5lZHU+IiB9LHsgImZpbHRlcnNfbGliX3RmMV9saWNlbnNlIjogIk1JVC1zdHlsZSBTVEstNC4zIGxpY2Vuc2UiIH0seyAiZmlsdGVyc19saWJfdGYxc19hdXRob3IiOiAiSnVsaXVzIE8uIFNtaXRoIElJSSIgfSx7ICJmaWx0ZXJzX2xpYl90ZjFzX2NvcHlyaWdodCI6ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBieSBKdWxpdXMgTy4gU21pdGggSUlJIDxqb3NAY2NybWEuc3RhbmZvcmQuZWR1PiIgfSx7ICJmaWx0ZXJzX2xpYl90ZjFzX2xpY2Vuc2UiOiAiTUlULXN0eWxlIFNUSy00LjMgbGljZW5zZSIgfSx7ICJmaWx0ZXJzX2xpYl90ZjJfYXV0aG9yIjogIkp1bGl1cyBPLiBTbWl0aCBJSUkiIH0seyAiZmlsdGVyc19saWJfdGYyX2NvcHlyaWdodCI6ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBieSBKdWxpdXMgTy4gU21pdGggSUlJIDxqb3NAY2NybWEuc3RhbmZvcmQuZWR1PiIgfSx7ICJmaWx0ZXJzX2xpYl90ZjJfbGljZW5zZSI6ICJNSVQtc3R5bGUgU1RLLTQuMyBsaWNlbnNlIiB9LHsgImZpbHRlcnNfbGliX3RmMnNfYXV0aG9yIjogIkp1bGl1cyBPLiBTbWl0aCBJSUkiIH0seyAiZmlsdGVyc19saWJfdGYyc19jb3B5cmlnaHQiOiAiQ29weXJpZ2h0IChDKSAyMDAzLTIwMTkgYnkgSnVsaXVzIE8uIFNtaXRoIElJSSA8am9zQGNjcm1hLnN0YW5mb3JkLmVkdT4iIH0seyAiZmlsdGVyc19saWJfdGYyc19saWNlbnNlIjogIk1JVC1zdHlsZSBTVEstNC4zIGxpY2Vuc2UiIH0seyAiZmlsdGVyc19saWJfdmVyc2lvbiI6ICIwLjMiIH0seyAibGlicmFyeV9wYXRoMCI6ICIvbGlicmFyaWVzL3N0ZGZhdXN0LmxpYiIgfSx7ICJsaWJyYXJ5X3BhdGgxIjogIi9saWJyYXJpZXMvZmlsdGVycy5saWIiIH0seyAibGlicmFyeV9wYXRoMiI6ICIvbGlicmFyaWVzL21hdGhzLmxpYiIgfSx7ICJsaWJyYXJ5X3BhdGgzIjogIi9saWJyYXJpZXMvcGxhdGZvcm0ubGliIiB9LHsgImxpYnJhcnlfcGF0aDQiOiAiL2xpYnJhcmllcy9iYXNpY3MubGliIiB9LHsgImxpYnJhcnlfcGF0aDUiOiAiL2xpYnJhcmllcy9hbmFseXplcnMubGliIiB9LHsgImxpYnJhcnlfcGF0aDYiOiAiL2xpYnJhcmllcy9taXNjZWZmZWN0cy5saWIiIH0seyAibGlicmFyeV9wYXRoNyI6ICIvbGlicmFyaWVzL3NpZ25hbHMubGliIiB9LHsgImxpY2Vuc2UiOiAiR1BMdjMiIH0seyAibWF0aHNfbGliX2F1dGhvciI6ICJHUkFNRSIgfSx7ICJtYXRoc19saWJfY29weXJpZ2h0IjogIkdSQU1FIiB9LHsgIm1hdGhzX2xpYl9saWNlbnNlIjogIkxHUEwgd2l0aCBleGNlcHRpb24iIH0seyAibWF0aHNfbGliX25hbWUiOiAiRmF1c3QgTWF0aCBMaWJyYXJ5IiB9LHsgIm1hdGhzX2xpYl92ZXJzaW9uIjogIjIuNSIgfSx7ICJtaXNjZWZmZWN0c19saWJfbmFtZSI6ICJNaXNjIEVmZmVjdHMgTGlicmFyeSIgfSx7ICJtaXNjZWZmZWN0c19saWJfdmVyc2lvbiI6ICIyLjAiIH0seyAibmFtZSI6ICJkZWF0aGdhdGUiIH0seyAicGxhdGZvcm1fbGliX25hbWUiOiAiR2VuZXJpYyBQbGF0Zm9ybSBMaWJyYXJ5IiB9LHsgInBsYXRmb3JtX2xpYl92ZXJzaW9uIjogIjAuMiIgfSx7ICJzaWduYWxzX2xpYl9uYW1lIjogIkZhdXN0IFNpZ25hbCBSb3V0aW5nIExpYnJhcnkiIH0seyAic2lnbmFsc19saWJfdmVyc2lvbiI6ICIwLjEiIH0seyAidmVyc2lvbiI6ICIwLjFiIiB9XSwidWkiOiBbIHsidHlwZSI6ICJ2Z3JvdXAiLCJsYWJlbCI6ICJkZWF0aGdhdGUiLCJpdGVtcyI6IFsgeyJ0eXBlIjogInZzbGlkZXIiLCJsYWJlbCI6ICJEZWFkWm9uZSIsInNob3J0bmFtZSI6ICJEZWFkWm9uZSIsImFkZHJlc3MiOiAiL2RlYXRoZ2F0ZS9EZWFkWm9uZSIsImluZGV4IjogMjgsIm1ldGEiOiBbeyAic3R5bGUiOiAia25vYiIgfV0sImluaXQiOiAtMTAwLCJtaW4iOiAtMTIwLCJtYXgiOiAwLCJzdGVwIjogMC4wMDF9LHsidHlwZSI6ICJ2c2xpZGVyIiwibGFiZWwiOiAiTm9pc2VHYXRlIiwic2hvcnRuYW1lIjogIk5vaXNlR2F0ZSIsImFkZHJlc3MiOiAiL2RlYXRoZ2F0ZS9Ob2lzZUdhdGUiLCJpbmRleCI6IDI4MCwibWV0YSI6IFt7ICJzdHlsZSI6ICJrbm9iIiB9XSwiaW5pdCI6IC0xMjAsIm1pbiI6IC0xMjAsIm1heCI6IDAsInN0ZXAiOiAwLjAwMX1dfV19"; } /* faust2wasm: GRAME 2017-2019 */ ("use strict"); if (typeof AudioWorkletNode === "undefined") { alert("AudioWorklet is not supported in this browser !"); } class deathgateNode extends AudioWorkletNode { constructor(context, baseURL, options) { super(context, "deathgate", options); this.baseURL = baseURL; this.json = options.processorOptions.json; this.json_object = JSON.parse(this.json); // JSON parsing functions this.parse_ui = function (ui, obj) { for (var i = 0; i < ui.length; i++) { this.parse_group(ui[i], obj); } }; this.parse_group = function (group, obj) { if (group.items) { this.parse_items(group.items, obj); } }; this.parse_items = function (items, obj) { for (var i = 0; i < items.length; i++) { this.parse_item(items[i], obj); } }; this.parse_item = function (item, obj) { if (item.type === "vgroup" || item.type === "hgroup" || item.type === "tgroup") { this.parse_items(item.items, obj); } else if (item.type === "hbargraph" || item.type === "vbargraph") { // Keep bargraph adresses obj.outputs_items.push(item.address); } else if ( item.type === "vslider" || item.type === "hslider" || item.type === "button" || item.type === "checkbox" || item.type === "nentry" ) { // Keep inputs adresses obj.inputs_items.push(item.address); obj.descriptor.push(item); // Decode MIDI if (item.meta !== undefined) { for (var i = 0; i < item.meta.length; i++) { if (item.meta[i].midi !== undefined) { if (item.meta[i].midi.trim() === "pitchwheel") { obj.fPitchwheelLabel.push({ path: item.address, min: parseFloat(item.min), max: parseFloat(item.max), }); } else if (item.meta[i].midi.trim().split(" ")[0] === "ctrl") { obj.fCtrlLabel[parseInt(item.meta[i].midi.trim().split(" ")[1])].push({ path: item.address, min: parseFloat(item.min), max: parseFloat(item.max), }); } } } } // Define setXXX/getXXX, replacing '/c' with 'C' everywhere in the string var set_name = "set" + item.address; var get_name = "get" + item.address; set_name = set_name.replace(/\/./g, (x) => { return x.substr(1, 1).toUpperCase(); }); get_name = get_name.replace(/\/./g, (x) => { return x.substr(1, 1).toUpperCase(); }); obj[set_name] = (val) => { obj.setParamValue(item.address, val); }; obj[get_name] = () => { return obj.getParamValue(item.address); }; //console.log(set_name); //console.log(get_name); } }; this.output_handler = null; // input/output items this.inputs_items = []; this.outputs_items = []; this.descriptor = []; // MIDI this.fPitchwheelLabel = []; this.fCtrlLabel = new Array(128); for (var i = 0; i < this.fCtrlLabel.length; i++) { this.fCtrlLabel[i] = []; } // Parse UI this.parse_ui(this.json_object.ui, this); // Set message handler this.port.onmessage = this.handleMessage.bind(this); try { if (this.parameters) this.parameters.forEach((p) => (p.automationRate = "k-rate")); } catch (e) {} } // To be called by the message port with messages coming from the processor handleMessage(event) { var msg = event.data; if (this.output_handler) { this.output_handler(msg.path, msg.value); } } // Public API /** * Destroy the node, deallocate resources. */ destroy() { this.port.postMessage({ type: "destroy" }); this.port.close(); } /** * Returns a full JSON description of the DSP. */ getJSON() { return this.json; } // For WAP async getMetadata() { return new Promise((resolve) => { let real_url = this.baseURL === "" ? "main.json" : this.baseURL + "/main.json"; fetch(real_url) .then((responseJSON) => { return responseJSON.json(); }) .then((json) => { resolve(json); }); }); } /** * Set the control value at a given path. * * @param path - a path to the control * @param val - the value to be set */ setParamValue(path, val) { // Needed for sample accurate control this.parameters.get(path).setValueAtTime(val, 0); } // For WAP setParam(path, val) { // Needed for sample accurate control this.parameters.get(path).setValueAtTime(val, 0); } /** * Get the control value at a given path. * * @return the current control value */ getParamValue(path) { return this.parameters.get(path).value; } // For WAP getParam(path) { return this.parameters.get(path).value; } /** * Setup a control output handler with a function of type (path, value) * to be used on each generated output value. This handler will be called * each audio cycle at the end of the 'compute' method. * * @param handler - a function of type function(path, value) */ setOutputParamHandler(handler) { this.output_handler = handler; } /** * Get the current output handler. */ getOutputParamHandler() { return this.output_handler; } getNumInputs() { return parseInt(this.json_object.inputs); } getNumOutputs() { return parseInt(this.json_object.outputs); } // For WAP inputChannelCount() { return parseInt(this.json_object.inputs); } outputChannelCount() { return parseInt(this.json_object.outputs); } /** * Returns an array of all input paths (to be used with setParamValue/getParamValue) */ getParams() { return this.inputs_items; } // For WAP getDescriptor() { var desc = {}; for (const item in this.descriptor) { if (this.descriptor.hasOwnProperty(item)) { if (this.descriptor[item].label != "bypass") { desc = Object.assign( { [this.descriptor[item].label]: { minValue: this.descriptor[item].min, maxValue: this.descriptor[item].max, defaultValue: this.descriptor[item].init, }, }, desc ); } } } return desc; } /** * Control change * * @param channel - the MIDI channel (0..15, not used for now) * @param ctrl - the MIDI controller number (0..127) * @param value - the MIDI controller value (0..127) */ ctrlChange(channel, ctrl, value) { if (this.fCtrlLabel[ctrl] !== []) { for (var i = 0; i < this.fCtrlLabel[ctrl].length; i++) { var path = this.fCtrlLabel[ctrl][i].path; this.setParamValue( path, deathgateNode.remap(value, 0, 127, this.fCtrlLabel[ctrl][i].min, this.fCtrlLabel[ctrl][i].max) ); if (this.output_handler) { this.output_handler(path, this.getParamValue(path)); } } } } /** * PitchWeel * * @param channel - the MIDI channel (0..15, not used for now) * @param value - the MIDI controller value (0..16383) */ pitchWheel(channel, wheel) { for (var i = 0; i < this.fPitchwheelLabel.length; i++) { var pw = this.fPitchwheelLabel[i]; this.setParamValue(pw.path, deathgateNode.remap(wheel, 0, 16383, pw.min, pw.max)); if (this.output_handler) { this.output_handler(pw.path, this.getParamValue(pw.path)); } } } /** * Generic MIDI message handler. */ midiMessage(data) { var cmd = data[0] >> 4; var channel = data[0] & 0xf; var data1 = data[1]; var data2 = data[2]; if (channel === 9) { return; } else if (cmd === 11) { this.ctrlChange(channel, data1, data2); } else if (cmd === 14) { this.pitchWheel(channel, data2 * 128.0 + data1); } } // For WAP onMidi(data) { midiMessage(data); } /** * @returns {Object} describes the path for each available param and its current value */ async getState() { var params = new Object(); for (let i = 0; i < this.getParams().length; i++) { Object.assign(params, { [this.getParams()[i]]: `${this.getParam(this.getParams()[i])}` }); } return new Promise((resolve) => { resolve(params); }); } /** * Sets each params with the value indicated in the state object * @param {Object} state */ async setState(state) { return new Promise((resolve) => { for (const param in state) { if (state.hasOwnProperty(param)) this.setParam(param, state[param]); } try { this.gui.setAttribute("state", JSON.stringify(state)); } catch (error) { console.warn("Plugin without gui or GUI not defined", error); } resolve(state); }); } /** * A different call closer to the preset management * @param {Object} patch to assign as a preset to the node */ setPatch(patch) { this.setState(this.presets[patch]); } static remap(v, mn0, mx0, mn1, mx1) { return ((1.0 * (v - mn0)) / (mx0 - mn0)) * (mx1 - mn1) + mn1; } } // Factory class export default class deathgate { static fWorkletProcessors; /** * Factory constructor. * * @param context - the audio context * @param baseURL - the baseURL of the plugin folder */ constructor(context, baseURL = "") { console.log("baseLatency " + context.baseLatency); console.log("outputLatency " + context.outputLatency); console.log("sampleRate " + context.sampleRate); this.context = context; this.baseURL = baseURL; this.pathTable = []; this.fWorkletProcessors = this.fWorkletProcessors || []; } heap2Str(buf) { let str = ""; let i = 0; while (buf[i] !== 0) { str += String.fromCharCode(buf[i++]); } return str; } /** * Load additionnal resources to prepare the custom AudioWorkletNode. Returns a promise to be used with the created node. */ async load() { try { const importObject = { env: { memoryBase: 0, tableBase: 0, _abs: Math.abs, // Float version _acosf: Math.acos, _asinf: Math.asin, _atanf: Math.atan, _atan2f: Math.atan2, _ceilf: Math.ceil, _cosf: Math.cos, _expf: Math.exp, _floorf: Math.floor, _fmodf: (x, y) => x % y, _logf: Math.log, _log10f: Math.log10, _max_f: Math.max, _min_f: Math.min, _remainderf: (x, y) => x - Math.round(x / y) * y, _powf: Math.pow, _roundf: Math.fround, _sinf: Math.sin, _sqrtf: Math.sqrt, _tanf: Math.tan, _acoshf: Math.acosh, _asinhf: Math.asinh, _atanhf: Math.atanh, _coshf: Math.cosh, _sinhf: Math.sinh, _tanhf: Math.tanh, _isnanf: Number.isNaN, _isinff: function (x) { return !isFinite(x); }, _copysignf: function (x, y) { return Math.sign(x) === Math.sign(y) ? x : -x; }, // Double version _acos: Math.acos, _asin: Math.asin, _atan: Math.atan, _atan2: Math.atan2, _ceil: Math.ceil, _cos: Math.cos, _exp: Math.exp, _floor: Math.floor, _fmod: (x, y) => x % y, _log: Math.log, _log10: Math.log10, _max_: Math.max, _min_: Math.min, _remainder: (x, y) => x - Math.round(x / y) * y, _pow: Math.pow, _round: Math.fround, _sin: Math.sin, _sqrt: Math.sqrt, _tan: Math.tan, _acosh: Math.acosh, _asinh: Math.asinh, _atanh: Math.atanh, _cosh: Math.cosh, _sinh: Math.sinh, _tanh: Math.tanh, _isnan: Number.isNaN, _isinf: function (x) { return !isFinite(x); }, _copysign: function (x, y) { return Math.sign(x) === Math.sign(y) ? x : -x; }, table: new WebAssembly.Table({ initial: 0, element: "anyfunc" }), }, }; let real_url = this.baseURL === "" ? "deathgate.wasm" : this.baseURL + "/deathgate.wasm"; const dspFile = await fetch(real_url); const dspBuffer = await dspFile.arrayBuffer(); const dspModule = await WebAssembly.compile(dspBuffer); const dspInstance = await WebAssembly.instantiate(dspModule, importObject); let HEAPU8 = new Uint8Array(dspInstance.exports.memory.buffer); let json = this.heap2Str(HEAPU8); let json_object = JSON.parse(json); let options = { wasm_module: dspModule, json: json }; if (this.fWorkletProcessors.indexOf(name) === -1) { try { let re = /JSON_STR/g; let deathgateProcessorString1 = deathgateProcessorString.replace(re, json); let real_url = window.URL.createObjectURL(new Blob([deathgateProcessorString1], { type: "text/javascript" })); await this.context.audioWorklet.addModule(real_url); // Keep the DSP name console.log("Keep the DSP name"); this.fWorkletProcessors.push(name); } catch (e) { console.error(e); console.error("Faust " + this.name + " cannot be loaded or compiled"); return null; } } this.node = new deathgateNode(this.context, this.baseURL, { numberOfInputs: parseInt(json_object.inputs) > 0 ? 1 : 0, numberOfOutputs: parseInt(json_object.outputs) > 0 ? 1 : 0, channelCount: Math.max(1, parseInt(json_object.inputs)), outputChannelCount: [parseInt(json_object.outputs)], channelCountMode: "explicit", channelInterpretation: "speakers", processorOptions: options, }); this.node.onprocessorerror = () => { console.log("An error from deathgate-processor was detected."); }; return this.node; } catch (e) { console.error(e); console.error("Faust " + this.name + " cannot be loaded or compiled"); return null; } } async loadGui() { return new Promise((resolve, reject) => { try { // DO THIS ONLY ONCE. If another instance has already been added, do not add the html file again let real_url = this.baseURL === "" ? "main.html" : this.baseURL + "/main.html"; if (!this.linkExists(real_url)) { // LINK DOES NOT EXIST, let's add it to the document var link = document.createElement("link"); link.rel = "import"; link.href = real_url; document.head.appendChild(link); link.onload = (e) => { // the file has been loaded, instanciate GUI // and get back the HTML elem // HERE WE COULD REMOVE THE HARD CODED NAME var element = createdeathgateGUI(this.node); resolve(element); }; } else { // LINK EXIST, WE AT LEAST CREATED ONE INSTANCE PREVIOUSLY // so we can create another instance var element = createdeathgateGUI(this.node); resolve(element); } } catch (e) { console.log(e); reject(e); } }); } linkExists(url) { return document.querySelectorAll(`link[href="${url}"]`).length > 0; } } // Template string for AudioWorkletProcessor let deathgateProcessorString = ` 'use strict'; // Monophonic Faust DSP class deathgateProcessor extends AudioWorkletProcessor { // JSON parsing functions static parse_ui(ui, obj, callback) { for (var i = 0; i < ui.length; i++) { deathgateProcessor.parse_group(ui[i], obj, callback); } } static parse_group(group, obj, callback) { if (group.items) { deathgateProcessor.parse_items(group.items, obj, callback); } } static parse_items(items, obj, callback) { for (var i = 0; i < items.length; i++) { callback(items[i], obj, callback); } } static parse_item1(item, obj, callback) { if (item.type === "vgroup" || item.type === "hgroup" || item.type === "tgroup") { deathgateProcessor.parse_items(item.items, obj, callback); } else if (item.type === "hbargraph" || item.type === "vbargraph") { // Nothing } else if (item.type === "vslider" || item.type === "hslider" || item.type === "button" || item.type === "checkbox" || item.type === "nentry") { obj.push({ name: item.address, defaultValue: item.init, minValue: item.min, maxValue: item.max }); } } static parse_item2(item, obj, callback) { if (item.type === "vgroup" || item.type === "hgroup" || item.type === "tgroup") { deathgateProcessor.parse_items(item.items, obj, callback); } else if (item.type === "hbargraph" || item.type === "vbargraph") { // Keep bargraph adresses obj.outputs_items.push(item.address); obj.pathTable[item.address] = parseInt(item.index); } else if (item.type === "vslider" || item.type === "hslider" || item.type === "button" || item.type === "checkbox" || item.type === "nentry") { // Keep inputs adresses obj.inputs_items.push(item.address); obj.pathTable[item.address] = parseInt(item.index); } } static get parameterDescriptors() { // Analyse JSON to generate AudioParam parameters var params = []; deathgateProcessor.parse_ui(JSON.parse(\`JSON_STR\`).ui, params, deathgateProcessor.parse_item1); return params; } constructor(options) { super(options); this.running = true; const importObject = { env: { memoryBase: 0, tableBase: 0, // Integer version _abs: Math.abs, // Float version _acosf: Math.acos, _asinf: Math.asin, _atanf: Math.a