kopia lustrzana https://github.com/backface/turtlestitch
new TuneScope extension and library, thanks, Glen, Eric, and team!
rodzic
32a5900215
commit
ec937588a0
|
@ -29,6 +29,7 @@
|
|||
* new extension primitive for querying all variable names accessible from a specified scope (global, sprite, script)
|
||||
* new extension primitive for querying whether a watcher for a variable by name is shown onstage
|
||||
* new support for setting the translation via the API
|
||||
* new TuneScope extension and library, thanks, Glen, Eric, and team!
|
||||
* new "Tad", "Jahrd", "Derec" and "Jamet" costume series, thanks, Meghan and Brian!
|
||||
* **Notable Changes:**
|
||||
* exporting a library includes dependencies (auto-select all referenced blocks)
|
||||
|
@ -59,6 +60,9 @@
|
|||
* **Translation Updates:**
|
||||
* German
|
||||
|
||||
### 2022-07-20
|
||||
* new TuneScope extension and library, thanks, Glen, Eric, and team!
|
||||
|
||||
### 2022-07-19
|
||||
* new "Jamet" costumes, thanks, Meghan and Brian!
|
||||
* updated sw.js with new costumes
|
||||
|
|
|
@ -36,6 +36,7 @@ bitwise.xml Bitwise operators Bitwise arithmetic operators for low-level bit man
|
|||
~ ~
|
||||
~ ~
|
||||
SciSnap!2Blocks.xml SciSnap! v2 Scientific Functions, Graphing, SQL interface, Machine Learning, from Uni Göttingen (Eckart Modrow)
|
||||
TuneScope.xml TuneScope Music Notation, Instruments, Drums, Tones, Chords, Tracks, from the University of Virginia (Glen Bull)
|
||||
~ ~
|
||||
~ ~
|
||||
~ ~
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,110 @@
|
|||
console.log('load _tone_0710_Chaos_sf2_file');
|
||||
var _tone_0710_Chaos_sf2_file={
|
||||
zones:[
|
||||
{
|
||||
midi:71
|
||||
,originalPitch:4800
|
||||
,keyRangeLow:0
|
||||
,keyRangeHigh:49
|
||||
,loopStart:2225
|
||||
,loopEnd:2564
|
||||
,coarseTune:0
|
||||
,fineTune:19
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMTWA8AAAf4cAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'
|
||||
,anchor:0.05204082
|
||||
//_tone.Clarinet_1
|
||||
}
|
||||
,{
|
||||
midi:71
|
||||
,originalPitch:5700
|
||||
,keyRangeLow:50
|
||||
,keyRangeHigh:55
|
||||
,loopStart:1891
|
||||
,loopEnd:2094
|
||||
,coarseTune:0
|
||||
,fineTune:20
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAADAAAIDQB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAMMAAAAAAAACA35+etEAAAAAAD/+9DEAAALVGFGdPeAJCAzKHc5sAAABGN8Qw8CfgXwCMCGIeZbn5E4WwuB0MjeW8NQJoSxUZY1er2dkePIkSlKUve973vDfqx48DEHwQBAMcuD4fcCAIFATP//+XP5cEAQy5/8QAMH8uCAIZcHwfD4AAAAAEYYAAZDSsVtlph2kiTyMC281mFwJUzhoDEjkJCIw6VwgYGDzmZqBxjsumDAiY4HYGERgEkCEImhupgpWbkeGEnhp8QAA0mYx0ZRgNMSlbwIFmLlLIHCeRnzxrMcVBYvC5xgIIzZKQON0d35f2vRgIqUvnJS46Egt6oY492HGoUt6RTTN4OfiURy6yeKNrRwRVlEnnMqeUXp2LQxK4vS2ILt6wbFSxaYgTdW/Wt3rOElrQ9FYHleGNqxORSN1r96/b7hfr0+7+ed/5Zlcr53qbGzQUvcL1TUtzpJVjvG7n3LWeO9V79fOtVzsf/MeZU2OHe2985FKmFb53Dn2rf+z3f6f/9qQGkYFgAgAnJd2khYpdka8ZwCpE3QxAYh2VBWM4N3X/EH1TqwPgEownvuVFmNFZ9Q39WxxkjrbX5oy7tAwlYl4sN/nWfAcJY8WND14EWrG5Up6x9Y1eBF+q9sZb6p1Z6a949Xk1Il6w7ZZL7lxDj6zfL+cTr96lHDlE+tJdfU5EgxUuXJ/aqEQUwAAAACjMBgUMNiEMvJQNlwfMNwdMJQPAgJmFIZmrITAocgsEQQAAXAUwRKEwPGAwOB4EAgYEAcYVGZFYzyBmMkEAz0ITIYTJAGZSaSHYBAcIITcwuHxpJRcVBBeldYGCokEgqBRCIyIAAoCGPiSYtCpg8ImUDyFwGOAAx0F0E5CJQEcnkMBAAOIyK5hUMDwwf0ChNtVukRMnJUghbqgnMEARsz9Ou6AoB0m4bL9u6+4cD2zW4xDihiwe4chvJ6lEJqM5VFKItE2V6n2h5MvcCbVXh+cZBA1LAMulDd/j6wGTou9Zch++szymozR5NMtTDv9eqHfnoE6tCWSl4s46yqcji9LbY5V1/YesxSK7bnSTTKYfyfjCSY8lVnCtSZ58oZdfsU2qHmqtW3ZsTeGNS7/0W69L+tf3/z/fefXodWhPAb//ugxOWAEOjzY/2HgCVet6equ8ABPdhh4zMgIVUPo62jwClcG7DM2I0AABAAACgAAAQmESy5wLIQGAeYBWsY4CCgUYOhcBBjCC9MOCmNMBMMNw8gAwcKsxvAMyqO4wIEwwDBQwlDIwe4QuODcmMN6ysGgwHBYxqQQUMDBgINWM4xIHDHhXMDgpBECgUXnd9mBikLggPAYlGFDKECqhqtJBgBMQggLg9IYHBcwIBTRpeMdmMCiQyCKyZY3WUlwYjUSaUCHQC3qqkgMYi8OBQKHo0OhYNiIBNLjL7MJZCulajsreYu6rtQGBgGHBsIBrxhwKIQIUAZhsRh2GYjDrsu/BbSXcvQFBdmPI5oTS7LguEms7EQbjEXddmVRqVfTUz6Os19lT9u7Vs0sO0petB1KQQAFGotmlIpw3qaboSl/X9lVrv1qaZjOqWXWoaid6cpYtTQ9HbfeO+0Ng7kMElL3v45Dc37Ym3B5Izll+qamqy2ly7jqm3+/3+v13Xcf/+c/////9/Y3LKluXyuks6vSjGXyu3RczwpLEvp7fA+FXYNaxEezoNNyORFqgP6gBEIzqNZEui+pkGnCDVGczHQKY0kS6VVLkvKyJFY1CYDxOQwRHVCEp1pc89rK3ma9lrayt9lbXLfVb5yYraNPWmbWs9+17Wa9a2rTH2VruR3isjgXEVCxFxRXArJ//ugxPCAL64FS7neAgGNlWO3sMABTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'
|
||||
,anchor:0.02639456
|
||||
//_tone.Clarinet_2
|
||||
}
|
||||
,{
|
||||
midi:71
|
||||
,originalPitch:6600
|
||||
,keyRangeLow:56
|
||||
,keyRangeHigh:61
|
||||
,loopStart:607
|
||||
,loopEnd:728
|
||||
,coarseTune:0
|
||||
,fineTune:20
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAFZgC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAPdAAAAAAAABWagXgXkAAAAAAD/+9DEAAAHcCtOdPEAJBSyKfc5ogApp2a8uajai2C2CaC4GRFTigZIlKUpQWBiwfwQOHOsH3+A/DHL/5d/BA5///WDgIHMHwf/+j9YPg4CAYAAMIAQRAAAAAUBgWUsFQQePZbXzQSHLACMcxAzkPTBwGAx7dEyQDjEoRGAIFAEYBCKagXMYcFxCBHTwMFGIJJ0lVQYIOyFoIKcIoQQRpBI20Sdm25vsyR+27veXjlkgGAl+GI2zi22jI2nwKtNOtaIGEJJKaUTZY248ERtLuHWVt+tNp4WCIRPAWgVvXNUqSyWQRe5FnQlk3GZhtHsqRGe1DkvsRSxCr1rLmMik1LAkrnt8+X09NQxqWZXflFJcs/Z7vW8o5VjdJ+cxU1j8Yy5as2+yjmOt8mOYXuVLH/S6l93VT8rmHKfmNXfctd7Y32p9zK/eFQglogdDDxjhiEf//uRo0IbG4Sh4WhQGBAIEBESAsoFEsQgCkzHhE116CDAIEwQCzJlnWdJ4qaiQXKUqQvNGJ46g4GD82sm8YpnC0PGDOY89sSkRgbOZstlhGKAtsrZ1kxHW8QujmHD4yMFUxaisdCteaxa1+U/5gAGYaRCI/MGFR0SZXOLxUGaYwerWtbrWltzTvPS0qD4u/FO47qbcfdam7WpsrLAofghKprbPGISmLsExjbXJyn1llrLLWWSGTI1sF7mRqKF7mZqoLsjFdnEOVXYgS9DEOayy/LL9Zf6GTM1UE5m7rYVueNnjKoLlkQdyKXIYnO0mGeed2V03/l/6///9/70Q1Nxymu1P/dXV2rcz5nb5Xt2K9ucu25Zu3LMbcYvZxix2MUn//////////f/LL8sv1l+sqHGtQ/ldrZ8hqnmHClcEMqgN6GBPG0RW542MK3NjYxVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uAxPaAKUZBbbm9kYAAADSDgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU='
|
||||
,anchor:0.01668934
|
||||
//_tone.Clarinet_3
|
||||
}
|
||||
,{
|
||||
midi:71
|
||||
,originalPitch:7100
|
||||
,keyRangeLow:62
|
||||
,keyRangeHigh:67
|
||||
,loopStart:1024
|
||||
,loopEnd:1114
|
||||
,coarseTune:0
|
||||
,fineTune:20
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAFmwCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAJkAAAAAAAABZt0RKYZAAAAAAD/+8DEAAAGqAND9BAAI7IyqD828ACmEQBkETcAFCebGg+8H0sn1g/KA+H4IAmf1ajhR3lAQcUd4nD+D8QO/4IO/4nlz////B//BAyAgCmQQADIyQAgB2IqaywAgqF6VxiCsm6YFYGAASmRxAU3c6QdCoeaMCmKg40OlUFASmYMHGCTAk7UJ4i0PEYTZRJhaIeP9vOgsRnnlQuLIjlKXZiKM/iEErQlDE8SdiJUXJpFzPl4phxlsVZYI7olzXEgvsK5GOTBPcy1lqpSiflTkBjZoarTEKC+YIM1D8cIq0srvTPbessLDprVr93TN1XtlVrHHiN7g5NN7X27fpxCUJQl7F1ijfiG3xYUuXkNv3TGtWzCie2M5eahanltaJNG8LwIUb0kkpDkpEiTSjLn7///39e+Pv2rvSAAKGAAAQgBAarTfP705QqVnVMFjMGAAwAEzRI/aAJn4qgow6EiYDiRXMPhF3DBwOMBAIhERjTKdRlaClJkiauy8CnMdAUcQAgIBRIbiCQzjp0PxSI/mJAtcdWGEBt5eVPNx9x7isYyTKCzPEw3Ka7D0igR/46/jmUj+FsGVM4LtuBcaopbajc7A0OXsO57ylMG15/KpYjMcf+euz9eN36T6K9GrF+zbp6K3LKOvlR2ZXMx99YDkFHl+dj6fWNTdq1+dizbsWM/28MjfzOA6z9/GIvMYTOf1M6bfcq9fte3TVt2/x3hc/8Mr+Usn6SWW5RLKaUSy5GMKSx//3/uwCQAAJmEIxryGOUZ5xmjIVCgJmLm02AjkqzGLAQKPsMJzAUABBGqHECqMYYIDqBBHC49tLaLaLihJ3A2gFocLInldG3/aC91CVyunYVDHTqGstE8QYTYTZCW40jSQ5mt8wnz6Nuta5hPnz6NmC9Vr6NbeavXr23//zWtrb+awXr23rWta1rbfrV7WtcW/rV69e29a1rWtfmta11/61rXX9q1rWvxa//7oMTSAB/BmV+5zRIDQbGoZ7LwAFa118WtCrXXxa0J8GoNA0DLlA0DUsDQNPg0exEe1B3kazusFT2CoLYKgqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg=='
|
||||
,anchor:0.02362812
|
||||
//_tone.Clarinet_4
|
||||
}
|
||||
,{
|
||||
midi:71
|
||||
,originalPitch:7800
|
||||
,keyRangeLow:68
|
||||
,keyRangeHigh:73
|
||||
,loopStart:840
|
||||
,loopEnd:900
|
||||
,coarseTune:0
|
||||
,fineTune:20
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGawCenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6e//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAM7AAAAAAAABmta1XzMAAAAAAD/+9DEAAAIDCNQ9JAAJAAzKb85kABgAJCjnsIQz3NcVggGGLRo0cwcBAEAQBAHwfB98EAQBD4kBAEPB9/wQKAgCDvBDEAJg/wQBB3/8hBD8Th//+XD7mYADwkI0mTusQs193n19oXApiwouIOBASCAjFbAR5kGDSWBRiIjWcpGJkQKhwQMkkoxsETIIIGgDOhkEylwKjAwkcAOMAAWL9KI3hElwbiJFOFDMAkAd9YRrizxYQKRA6C+2CCW5sXhDsQY5E7IJRZfeBoq7LgQE1qGZXA8OO/R01DDCt7fLnl8YdWSQFylmZmEPZLocnqaVyCgeOcllNjlEqkOW6H7li/STcWjFyLZ0dS7D8gtYZawsZyyJ0/Ma0t5U1OyWbxz3KMtfF6S5Yo+wPUxmMcrtLyt3KvrmGVz7Wd7HH7tXfe853lPzdaWWOawuWLeOFPz///1f171/So4QAFzNWQBREQOKI0OiYShfimZKAWHARmH2YOcEy+5gDAOGCaAwQAJCQAJpjziGjO9AIgFwcAMCgC2QHJWQKbsz0N9PwoAuMBABQ0Lm0zN+NaLiGAUBskw18LADpcGfKHsZIyNZoaDn2BGAENAEvuxMtTOwgyf0gDEFFKMOgjExFBknIdSIJKIQJpPvTM6XKYNYshkSjLGKoayYWQX5h1inV3DgixAEOVo3OTkAQswoh7TB2EFMPwDcw9RnDCLEUMOcB6xWhyi3cvbt14RU+uYKAQIMAlMEYDEwFQagSA4YGYFhgBgC8xl/amGrlJS01NfqUs5XowaAEQAMmBkB+YCgHoYC4YJYOxgMglGCSAAYJAQ9/8+fu///yL1JRKKsbu34xTWDASBHME4BswLQbjABAsMEcC4wBAUSAAcwKgMTACAULOmACBNvDPPfP1j3//vc7NP9+phYu288rGuGBKAkYBIERgCgHmBkB+YBQF5ECIYF4KRgDgWGBiAQYDwKIIAbMCwBsEgYMIMBcCD/////////////////////////////////////BQBYFAGEQDZgQALmAMA+YAwAxgWgdGASBQUAhGBQCWYAQEpgUADmAuCEFwEDAlAYCwFaj5gJAOg4AQEABjIChgOgKGA//uwxPaAP/ZBa/nvEUJOlCD3s4AAKA0YA4AJgTAbmAIBGNAcmBGCMY3K7Y5ZEAANZqqgQUwAS1rXASIaqSeBluHHAChmzq2mMSZBIOJSVNVTpEMSocAQFrnnay71r6r+v7efZyqRcy6o2uVMVpsFLDQ7cpqamy3Sy27GZbNO05U8+rOZdKX9f2l5lTU3K1NTZbxqnRKGoi/8FXFjwiBqCqwVOljxYOxL//lTsRQaes7//+p8SxLv///W6qpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo='
|
||||
,anchor:0.01920635
|
||||
//_tone.Clarinet_5
|
||||
}
|
||||
,{
|
||||
midi:71
|
||||
,originalPitch:8400
|
||||
,keyRangeLow:74
|
||||
,keyRangeHigh:79
|
||||
,loopStart:1063
|
||||
,loopEnd:1106
|
||||
,coarseTune:0
|
||||
,fineTune:35
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGAwCpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamp//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAJtAAAAAAAABgMRIXOPAAAAAAD/+9DEAAAIJClCdDEAJBSzKXc5okBRNNN9ETd3NAMDeBAAAEUIIGn4kOF4YWD4fn+gP5c14f5QEHYPv8QAgclz8oCAIAhA4Pg+D4EBDg+f/+gQBjwfD9eBgABgASADIsabUljpgQImLBiDmoMBkOWpIHQYCDBApXoYDHkJAg/M/kNyTngoLyCVWZylqCAF0vQ3NB5DMmKxYA00j48AYZQDp3fkzKHyeRI8yKlX3H0MIsIgGMEQ5NR+lbpDIOKNlko4AIDYY9aNGH4wn7Lvu1g4juXupEOaAhSTKuI7YmYs7kOTeUFsHlUUgZ2JuJo5z26TGfpJ6zFbVe3etyGgitBb7Yf+32phAlbHsOXvqavc5TXLlJS1IzlVrcsWbk9SYYTE9YvX43b+9N2Mqm8LNJT1sOXan5z9JhKH8vW617HPKk+7PXvuVMuYznLly/e1cQDTn70xgXNXgM8UBVVWdoUAFX0AAAFAIRnNTv6ceTE3StKXyYSThhdCgudA4PJUcwoCMrKTmAWNHbh1KZ4KoHr7CgB4w4yY16cNAF667KUd3jTCdGCbA3oydsy8tf8XesynB7E6E7gAbQous4MjVGnd+3EAvnSznIefgqGWLuxBMaMMZdu5G4/oKkqLGsmovAww2blrS1iEzN+sZcgy7yZA0rpsZlIaqXSMmAcSBKMxAGmtVEj0+8NXWXSCzwlDri1q66ONa8lO91Jzla320vCforkYahYsTfPjnc/7C+bu2Z+av9mLcHZ2Mbss5hu//4yvesbFDUt5/2V5cxu63u7FKPCvlXy/OteysfMXd//W+l+v9Lq6kmAAAAAfMxAiwQEzNOETg00HMQQ5IUeAAlvWYGFBtYBnNfL+sGr1Haa9G0MTEk1LQ2WSBBmQoCKla2AEiMpErWfF/i5SKTToJS9QCuNEaJpSYyumigA5qWmskaYBgIKAFtW5ISi5S6ZY1pYZUzEotMuy/0ajUuzhlhqgKYr9R1yXJiuFNGo1S2eVpVGqbuPf1TU1qrDL+01WUy2lx/LLH//LLLLL8su7xpaXHL8cccefrHHHmVNTU1NjrKtll38csssu7xpaXJYKgqCqwVDRYGQ0oGgaOg0DT2srBV6z//ugxPOAIRGZYfm9EgO/qyezsYAAv/Bo9ER7BqJQWwVDUSusywNKTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'
|
||||
,anchor:0.02392290
|
||||
//_tone.Clarinet_6
|
||||
}
|
||||
,{
|
||||
midi:71
|
||||
,originalPitch:8900
|
||||
,keyRangeLow:80
|
||||
,keyRangeHigh:127
|
||||
,loopStart:535
|
||||
,loopEnd:568
|
||||
,coarseTune:0
|
||||
,fineTune:80
|
||||
,sampleRate:44100
|
||||
,ahdsr:false
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAErwDZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJASGAAAAAAAABK9j7Ot7AAAAAAD/+9DEAAAH2CtH9DGAJNJFar83skFYMhEQAClrt2+Tr8RCd3c/QAAwNxACBQH6gQMg+H/B8Hwcic/wfP4nD/BAMfBDlAxwf/wfD/+CAISgY//8oGJd1Y2IRAYNBAGFgu5pY5ZRqhMVAzdBogBzYjQ0RKAQG2xbIQhYYKGPjo6ZAUSBgkYWsmEi5nMGa6FtKPjPUIiNGRTMEAxEEJNKrssEYWGAZiQMYIMU7JL+BZsFIEdtGICgGQC/isF2C5G3sosY0pZAugYiFmGjZjoubCEhAS6GfJh1b83XtSxdEskc6zMw8JTVa/EHappbF7luKfBrbzzW3fctdjLEVFT3Wzy34plJZPlUlmVmnqw2/fMK67GcKCOW+ta9qTYb1hn23rlTkCbzwt4T+PNZPI/ksf9w3XhyUTkvt196vYbp89YdxzxznMqTlTDO9rnKmrOcrdT7F+o/EXjcjdiMXnbf/////////////////////Wv/97/X/+/w/9fz//v/3DDn///+sOZ552BA/BXM/dpQERCCVjuRJBR6ScgqRDS2i2i4s6dIKwnKQVhTqGgKzSJFGZmqqqOJAIBEUc////mZIkQCAUtNIoyCoLA0DTwVBoGgaBoGQVBV3+DQNAqCoKgqCx4GgaBoNf//LA0DQNAyCoKgqCodTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tAxN0DzUB5bfzzACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU='
|
||||
,anchor:0.01231293
|
||||
//_tone.Clarinet_7
|
||||
}
|
||||
]
|
||||
};
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,19 @@
|
|||
console.log('load _drum_35_21_FluidR3_GM_sf2_file');
|
||||
var _drum_35_21_FluidR3_GM_sf2_file={
|
||||
zones:[
|
||||
{
|
||||
midi:128
|
||||
,loopStart:0
|
||||
,loopEnd:0
|
||||
,keyRangeLow:35
|
||||
,keyRangeHigh:35
|
||||
,sampleRate:44100
|
||||
,coarseTune:-1
|
||||
,fineTune:0
|
||||
,originalPitch:3500
|
||||
,file:'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'
|
||||
,anchor:0.00197279
|
||||
//'808 Kick 1
|
||||
}
|
||||
]
|
||||
};
|
|
@ -0,0 +1,19 @@
|
|||
console.log('load _drum_40_6_JCLive_sf2_file');
|
||||
var _drum_40_6_JCLive_sf2_file={
|
||||
zones:[
|
||||
{
|
||||
midi:128
|
||||
,loopStart:0
|
||||
,loopEnd:0
|
||||
,keyRangeLow:40
|
||||
,keyRangeHigh:40
|
||||
,sampleRate:44100
|
||||
,coarseTune:0
|
||||
,fineTune:21
|
||||
,originalPitch:5000
|
||||
,file:'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/X//ZNHKj/WavNaxgoMgOnuRCT1uWAm8ej+PqRYP/StMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+3DE8wAZgacj7DDTwSwm4KQWCJCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'
|
||||
,anchor:0.00117914
|
||||
//'Snare 2
|
||||
}
|
||||
]
|
||||
};
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,19 @@
|
|||
console.log('load _drum_69_6_JCLive_sf2_file');
|
||||
var _drum_69_6_JCLive_sf2_file={
|
||||
zones:[
|
||||
{
|
||||
midi:128
|
||||
,loopStart:0
|
||||
,loopEnd:0
|
||||
,keyRangeLow:69
|
||||
,keyRangeHigh:69
|
||||
,sampleRate:44100
|
||||
,coarseTune:0
|
||||
,fineTune:16
|
||||
,originalPitch:7700
|
||||
,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAEAAALGwBubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm6mpqampqampqampqampqampqampqampqam39/f39/f39/f39/f39/f39/f39/f39/f3/////////////////////////////////8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAACxvyvBFCAAAAAAD/++DEAAAKgRtP9BEAJxhIK/sxshBXVWeIeI+ZCAAApjGMYwAAAAAAAc5znP9CEb+hCEJ8538hG//Oc5/6EJ//IQhCEJ/5yEZTnP6nP8hCABAwUBAEJQH3xODnBAHwfB8P8Th9QIO+UB99OdLvW+27R6CwAAAABuZbwAqRUEDwMtJBeaCRJoO81sSfHTidAAYwpWtgepONVUy4SMCAlvIjozpxQqlMPEjAAGgnWuQ1LEglSPohpNqmTVhcYpazSn9q07kP05YOHX6FgcyAVNPNaemcBxIEjcalUEQ6ttfyY5gwCYGCqLGUESwr9rolNuNyungfdBB7XJTDRiziQtpmCoamCmYlBh6EJfrOJDD8onKeKzsXhV6tSSiKwLbqGSuRjwGa8LGCgAYxGPG5hqSYUoGKi8zQV4JQfp4chuIUjGGsNzoWOvBIptDRrrKFHAQKhxCY2/m3IRktOc+mHHwJNHmOCZ086DxoMAC06z5hK9sCmjntcfh84jI5+VUjLYWzRU7L3/uRmgfyzSwzLzVjM55aM4LDSF04V9McDgqMmOaQ9pG7lhn5macviFeBpSFF13FfvQuhk9ZyIcqRSHLj8Qp9J1xJ2Ls4dzl3C9Wll5x4xORZl7LI7Sz7lx2G6CWVbF+WRuMWbMorampbw2A3N9RTF0EwIYNIAjCyQ2gbM1LkuwcWGNDBtJiZcMmjhpghWIg4EghiIKYWJmSBBhp2YuJgkMY4ZkAGeJyA0wwK7e3+3eifmAAAFhxCZkIyZu6E5sCo2RqIsCazVak7nu6zwTpTkuG749rsOmhvUj1/BdKysy4ZmV4sTp3NX7fEjQY8e0sWDPW1IGG+TTC+hP2d/By7Q5kSraoV6yhTpwx3NWtD9gZcUQ2F1DEewEgr0ux5hsuoarktVduSLRmE4vQG40WiAhUJfZkWwn2fredxuopiMFMjoP45kUWA0D4VxezlNMuL5Ip4fJqnKcz4nAzG9VI5O0XKvT7LKp1OwODRhZc8UbY7560trI0vZVcnsuD5gZ47yO2tSreLpxgwH2IUSbDNDf7xWJHkZHlPD3inpEgya1SNNJuvpSmr5jUxu1586gfE+reW29/3zLJnV8Pab2Z39t3MYAAiJgmmfUYJYdQ6o8kmUgLMUYeCAKSkwAKs1UzlPrBjrrlZqmEoRhBOkEimQjQH1itGSefWHK1wtgNrZc2i3Tk9YRmK1hKDUslZYqOUyERoDsstI2akk1BUApZLhOLUQ8lAugigMCNEZpPhMV0yw1DIzSVc1a7eGkqnrkS09SkQl4qpEKhQ1YYZxIpLCSh0mU0FzBOxEuTlwcnAtyrZFknUSMLcxDGLs3p0wh3i6E/NhXppTn+oFtYVxbj5VBuwz9HCsqVkP1kP1TtiRPH/+7DE8oBiJj9v/YeAJQnIK32WPjhDkiyIUYRcVQW5pOZmXSOP5DDvNFKH8T1FVXA+SSn6X0xDKirtELo6j9aG9WxLLpgOYymLb5XPz0Pw4vGMJBumZaWycuMNDVCbyiJ08frJPUJsX1UMypO1wtCmnetz2AjlCpVTputJZmVy5ZW2A7VnnP38qUkAAASmIVzaRMgcMFMs4Clh4pgnrDMtKpqKaExkaRqWKXwoF4GALDMRhHMD1lIjyD1qio7E7UJdEfE1p5OSXbH2uCU4d4WSq42yeHxWHsfRvKt61m7thVKRMVINr07rqslrEo2VJIesN7eui7ikq4tqNP1nLaoHxumYJM8JrGWU6hCWVrkkRoDFc6o4aKTQwWI7WPZCTgGMkcOJVGEPdKuapOdvE9LixSinDPVJciQjEBzGQGELqLQoz9SrkZqnWWGC0tSDUpfjUFuS0VvQ0vyWQo5Txb1Cu4h+q1OODYU1ycshfjSO4uBviajhLIrhXSwMynUyWN0/GQvxgltYUNPoV4kTSb2SRGjEOk8cRVaXF8kG9vOV4XJFLZBTDI5yTuUy0Nh6s6pRRJjRisrYnkUfZwwYp1J+lZEOgn8j1CrdJ54hynRr5VX3Bqu79/apqgAIRwFYYlZMyYrQXBNxcwAzKAEKYFEGj0Uk6WgM6QgfgvRKhcy/niX+K9P5fU0R5hhTrxVH9Fw3RaPI6TkvGcrXpbUHwXKrLP3KCsPt7WasO2JgfeMvNMN47WDvV714+VSmZZp13Mrssq9HgsDqsGy8d0B8k9vXTnIwTMF2KBGYMr2FNhTJFwOdkP7w3mHM6TJN1wVqpUDnGf/7sMT3AGnaQT3Mse+EZsgm/rLwAJ3GEhh0ttLLzLIyLbepmeFCSCiYnsppMKaYGxCo6uhwVK5KesZDVar1SnVbWj+VsorpmRVMUtGLbBHgqpiOqE5LcPKhgTt2GqAdrU3K6ExYhs1mZgfKJcqVxyrasz7EVkfVgQmvzvY194r6WgwfbG811p9BjTWvisz3Sph8tspKpYpEVhcTQWAQAADxtE3zhIzPhACORzNS7NCkKGCljkSoqiDCqW6s2tVUEL4svR4q4F3iJCNiJQgaFGbq3moCoFNxAVW5wEHjKJlTSn7QSudi47pqsXsrQKhdNFFcrRl9wDCU4UiliMnkzTmxO6/6Zq7YZaUw5OUVUpU+aESliIDHxgLKYAWLIHuhjlxjLpO1H4hcjTwr3WiXemVbldMPkUDS6auPyy59H0a2l7KaJ9pVKWZOFC2Up+Izp8zkGkACqBT5eBfhQB5kHYpMwICSQy4SyUqoDiNS3q1V+rhjKlAXxgpoyt7UxwbdYYWSxFpbsrSch8WvTVh9FzpCLFmYxQSOIMpkLoxGcdp9pt6n2o6lbdat2CHd1DWLosPia12dtZUsiTK6COuO0CHIedm/A8Qbyag+GJVcd6xDDBpa8TYY46UjsQC8EDYT8trVblLcrWaGKf+MSlV2gmpdM5dxq4U2W+f//9bLdapMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//uAxPEALcpBKfmsAEAAAD/DgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo='
|
||||
,anchor:0.01902494
|
||||
//'Cabasa
|
||||
}
|
||||
]
|
||||
};
|
|
@ -0,0 +1,440 @@
|
|||
// play note function
|
||||
var AudioContextFunc = window.AudioContext || window.webkitAudioContext;
|
||||
var audioContext = new AudioContextFunc();
|
||||
|
||||
// calculate midi pitches and frequencies
|
||||
var tempMidiPitches = {}
|
||||
var tempMidiFreqs = {}
|
||||
|
||||
let notes = [
|
||||
"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
|
||||
]
|
||||
|
||||
for (var i = 0; i <= 127; i++) {
|
||||
let note = notes[i % 12] + Math.floor((i-12)/12);
|
||||
tempMidiPitches[note] = i;
|
||||
tempMidiFreqs[note] = 440 * Math.pow(2, (i - 69)/12)
|
||||
}
|
||||
|
||||
const _convertToSharp = (note) => {
|
||||
const splitByFlat = note.split("b");
|
||||
if (splitByFlat.length < 2) return note; // does not include a flat
|
||||
|
||||
const letter = splitByFlat[0];
|
||||
const number = splitByFlat[1];
|
||||
|
||||
const indexOfLetter = notes.indexOf(letter);
|
||||
if (indexOfLetter === -1) return note; // TODO: handle this error
|
||||
let previousSharp;
|
||||
if (indexOfLetter === 0) {
|
||||
previousSharp = notes[notes.length - 1];
|
||||
} else {
|
||||
previousSharp = notes[indexOfLetter - 1];
|
||||
}
|
||||
return previousSharp + number;
|
||||
}
|
||||
window.parent.midiPitches = tempMidiPitches;
|
||||
window.parent.midiFreqs = tempMidiFreqs;
|
||||
|
||||
|
||||
window.playNote = (note, noteLength, instrumentName, volume) => {
|
||||
if (note == "R" || note == "r") return;
|
||||
|
||||
note = _convertToSharp(note);
|
||||
|
||||
var player=new WebAudioFontPlayer();
|
||||
instrumentName = instrumentName || window.parent.currentInstrumentName;
|
||||
instrumentName = instrumentName.toLowerCase()
|
||||
// console.log(instrumentName);
|
||||
let currentInstrumentData = window.parent.instrumentData[instrumentName]
|
||||
player.loader.decodeAfterLoading(audioContext, currentInstrumentData.name);
|
||||
|
||||
function play(){
|
||||
const vol = volume || window.parent.instrumentVolumes[instrumentName] || window.parent.globalInstrumentVolume;
|
||||
console.log(note, noteLength, instrumentName, vol)
|
||||
player.queueWaveTable(audioContext, audioContext.destination
|
||||
, window[currentInstrumentData.name], 0, window.parent.midiPitches[note], noteLength, vol
|
||||
);
|
||||
return false;
|
||||
}
|
||||
play();
|
||||
}
|
||||
|
||||
window.timeSignatureToBeatsPerMeasure = {
|
||||
"4/4": [4,1], // 4 beats per measure, Quarter note gets the beat
|
||||
"3/4": [3,1],
|
||||
"5/4": [5,1],
|
||||
"7/4": [7,1],
|
||||
"6/8": [6,0.5], // 6 beats per measure, Eighth note gets the beat
|
||||
"9/8": [9,0.5],
|
||||
"12/8": [12,0.5]
|
||||
}
|
||||
|
||||
window.baseTempo = 60;
|
||||
|
||||
// converts note lengths (quarter, half, whole)
|
||||
// to corresponding time value (1, 2, 4)
|
||||
window.noteLengthToTimeValue = {
|
||||
"dotted whole": 6,
|
||||
"whole": 4,
|
||||
"dotted half": 3,
|
||||
"half": 2,
|
||||
"dotted quarter": 1.5,
|
||||
"quarter": 1,
|
||||
"dotted eighth": 0.75,
|
||||
"eighth": 0.5,
|
||||
"dotted sixteenth": 0.375,
|
||||
"sixteenth": 0.25,
|
||||
"dotted thirtysecond": 0.1875,
|
||||
"thirtysecond": 0.125,
|
||||
"whole triplet": 2.667,
|
||||
"half triplet": 1.333,
|
||||
"quarter triplet": 0.667,
|
||||
"eighth triplet": 0.333,
|
||||
"sixteenth triplet": 0.167,
|
||||
"thirtysecond triplet": 0.0417
|
||||
}
|
||||
|
||||
// instrument data
|
||||
window.parent.instrumentData = {
|
||||
"accordion": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0230_Aspirin_sf2_file.js",
|
||||
name: "_tone_0230_Aspirin_sf2_file"
|
||||
},
|
||||
"bass, acoustic": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0320_GeneralUserGS_sf2_file.js",
|
||||
name: "_tone_0320_GeneralUserGS_sf2_file"
|
||||
},
|
||||
"bass, electric (finger)": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0350_JCLive_sf2_file.js",
|
||||
name: "_tone_0350_JCLive_sf2_file"
|
||||
},
|
||||
"guitar, acoustic": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0241_JCLive_sf2_file.js",
|
||||
name: "_tone_0241_JCLive_sf2_file"
|
||||
},
|
||||
"guitar, electric": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0260_JCLive_sf2_file.js",
|
||||
name: "_tone_0260_JCLive_sf2_file"
|
||||
},
|
||||
"piano": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0020_JCLive_sf2_file.js",
|
||||
name: "_tone_0020_JCLive_sf2_file"
|
||||
},
|
||||
"organ": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0180_Chaos_sf2_file.js",
|
||||
name: "_tone_0180_Chaos_sf2_file"
|
||||
},
|
||||
"banjo": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/1050_FluidR3_GM_sf2_file.js",
|
||||
name: "_tone_1050_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"saxophone": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0650_FluidR3_GM_sf2_file.js",
|
||||
name: "_tone_0650_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"shakuhachi": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0770_SBLive_sf2.js",
|
||||
name: "_tone_0770_SBLive_sf2"
|
||||
},
|
||||
"sitar": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/1040_Aspirin_sf2_file.js",
|
||||
name: "_tone_1040_Aspirin_sf2_file"
|
||||
},
|
||||
"bassoon": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0700_FluidR3_GM_sf2_file.js",
|
||||
name: "_tone_0700_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"bass": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0350_JCLive_sf2_file.js",
|
||||
name: "_tone_0350_JCLive_sf2_file"
|
||||
},
|
||||
"violin": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0400_JCLive_sf2_file.js",
|
||||
name: "_tone_0400_JCLive_sf2_file"
|
||||
},
|
||||
"cello": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0420_JCLive_sf2_file.js",
|
||||
name: "_tone_0420_JCLive_sf2_file"
|
||||
},
|
||||
"clarinet": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0710_Chaos_sf2_file.js",
|
||||
name: "_tone_0710_Chaos_sf2_file"
|
||||
},
|
||||
"flute": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0730_JCLive_sf2_file.js",
|
||||
name: "_tone_0730_JCLive_sf2_file"
|
||||
},
|
||||
"french horn": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0600_GeneralUserGS_sf2_file.js",
|
||||
name: "_tone_0600_GeneralUserGS_sf2_file"
|
||||
},
|
||||
"harp": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0460_GeneralUserGS_sf2_file.js",
|
||||
name: "_tone_0460_GeneralUserGS_sf2_file"
|
||||
},
|
||||
"koto": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/1070_FluidR3_GM_sf2_file.js",
|
||||
name: "_tone_1070_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"marimba": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0121_FluidR3_GM_sf2_file.js",
|
||||
name: "_tone_0121_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"oboe": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0680_JCLive_sf2_file.js",
|
||||
name: "_tone_0680_JCLive_sf2_file"
|
||||
},
|
||||
"trumpet": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0560_GeneralUserGS_sf2_file.js",
|
||||
name: "_tone_0560_GeneralUserGS_sf2_file"
|
||||
},
|
||||
"tuba": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/0580_GeneralUserGS_sf2_file.js",
|
||||
name: "_tone_0580_GeneralUserGS_sf2_file"
|
||||
},
|
||||
|
||||
// drums
|
||||
|
||||
"cabasa": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12869_6_JCLive_sf2_file.js",
|
||||
name: "_drum_69_6_JCLive_sf2_file"
|
||||
},
|
||||
"snare drum": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12840_6_JCLive_sf2_file.js",
|
||||
name: "_drum_40_6_JCLive_sf2_file"
|
||||
},
|
||||
"bass drum": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12835_21_FluidR3_GM_sf2_file.js",
|
||||
name: "_drum_35_21_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"closed hi-hat": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12842_0_FluidR3_GM_sf2_file.js",
|
||||
name: "_drum_42_0_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"open hi-hat": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12846_0_FluidR3_GM_sf2_file.js",
|
||||
name: "_drum_46_0_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"mid tom": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12847_21_FluidR3_GM_sf2_file.js",
|
||||
name: "_drum_47_21_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"high tom": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12848_21_FluidR3_GM_sf2_file.js",
|
||||
name: "_drum_48_21_FluidR3_GM_sf2_file"
|
||||
},
|
||||
"crash cymbal": {
|
||||
path: "https://surikov.github.io/webaudiofontdata/sound/12849_21_FluidR3_GM_sf2_file.js",
|
||||
name: "_drum_49_21_FluidR3_GM_sf2_file"
|
||||
},
|
||||
}
|
||||
|
||||
// load all instruments
|
||||
let instrumentNames = Object.keys(window.parent.instrumentData);
|
||||
window.parent.currentInstrumentName = "piano";
|
||||
|
||||
// initialize volumes
|
||||
window.parent.instrumentVolumes = {}
|
||||
window.parent.globalInstrumentVolume = 0.5;
|
||||
|
||||
// tones
|
||||
class Tone {
|
||||
constructor(id) {
|
||||
this.id = id;
|
||||
this.on = false;
|
||||
|
||||
const thisPlayer = new Object;
|
||||
thisPlayer.context = new AudioContext();
|
||||
thisPlayer.oscillator = thisPlayer.context.createOscillator();
|
||||
thisPlayer.gainobj = thisPlayer.context.createGain();
|
||||
thisPlayer.oscillator.frequency.value = 100;
|
||||
thisPlayer.gainobj.gain.value = 1;
|
||||
thisPlayer.oscillator.connect(thisPlayer.gainobj);
|
||||
thisPlayer.gainobj.connect(thisPlayer.context.destination);
|
||||
|
||||
this.player = thisPlayer;
|
||||
}
|
||||
|
||||
dBFS2gain = (dbfs) => {
|
||||
//return Math.pow(10, dbfs / 20);
|
||||
return (dbfs / 100).toFixed(2);
|
||||
}
|
||||
|
||||
setFreq = (freq) => {
|
||||
this.freq = freq;
|
||||
this.player.oscillator.frequency.value = Math.max(freq, 0);
|
||||
}
|
||||
|
||||
setAmpl = (ampl) => {
|
||||
this.ampl = ampl;
|
||||
this.player.gainobj.gain.value = this.dBFS2gain(parseInt(ampl));
|
||||
}
|
||||
|
||||
turnOn = () => {
|
||||
console.log("on");
|
||||
if (this.on) return;
|
||||
console.log("turning on");
|
||||
if (!this.started) {
|
||||
this.player.oscillator.start(0);
|
||||
this.started = true;
|
||||
} else {
|
||||
this.player.context.resume();
|
||||
}
|
||||
this.on = true;
|
||||
}
|
||||
|
||||
turnOff = () => {
|
||||
console.log("off");
|
||||
if (!this.on) return;
|
||||
console.log("turning off");
|
||||
this.player.context.suspend();
|
||||
this.on = false;
|
||||
}
|
||||
|
||||
}
|
||||
window.Tone = Tone;
|
||||
window.tones = {};
|
||||
|
||||
/* Auxillary Functions */
|
||||
// repeats an array n times
|
||||
// similar to [1,2,3] * 2 = [1,2,3,1,2,3] in Python
|
||||
window.multiplyArray = (arr, length) =>
|
||||
Array.from({ length }, () => arr).flat()
|
||||
|
||||
|
||||
/*
|
||||
Queue.js
|
||||
A function to represent a queue
|
||||
Created by Kate Morley - http://code.iamkate.com/ - and released under the terms
|
||||
of the CC0 1.0 Universal legal code:
|
||||
http://creativecommons.org/publicdomain/zero/1.0/legalcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* Creates a new queue. A queue is a first-in-first-out (FIFO) data structure -
|
||||
* items are added to the end of the queue and removed from the front.
|
||||
*/
|
||||
function Queue() {
|
||||
|
||||
// initialise the queue and offset
|
||||
var queue = [];
|
||||
var offset = 0;
|
||||
|
||||
// Returns the length of the queue.
|
||||
this.getLength = function () {
|
||||
return (queue.length - offset);
|
||||
}
|
||||
|
||||
// Returns true if the queue is empty, and false otherwise.
|
||||
this.isEmpty = function () {
|
||||
return (queue.length === 0);
|
||||
}
|
||||
|
||||
/* Enqueues the specified item. The parameter is:
|
||||
*
|
||||
* item - the item to enqueue
|
||||
*/
|
||||
this.enqueue = function (item) {
|
||||
queue.push(item);
|
||||
}
|
||||
|
||||
/* Dequeues an item and returns it. If the queue is empty, the value
|
||||
* 'undefined' is returned.
|
||||
*/
|
||||
this.dequeue = function () {
|
||||
|
||||
// if the queue is empty, return immediately
|
||||
if (queue.length === 0) return undefined;
|
||||
|
||||
// store the item at the front of the queue
|
||||
var item = queue[offset];
|
||||
|
||||
// increment the offset and remove the free space if necessary
|
||||
if (++offset * 2 >= queue.length) {
|
||||
queue = queue.slice(offset);
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
// return the dequeued item
|
||||
return item;
|
||||
|
||||
}
|
||||
|
||||
/* Returns the item at the front of the queue (without dequeuing it). If the
|
||||
* queue is empty then undefined is returned.
|
||||
*/
|
||||
this.peek = function () {
|
||||
return (queue.length > 0 ? queue[offset] : undefined);
|
||||
}
|
||||
|
||||
}
|
||||
window.Queue = Queue;
|
||||
|
||||
/**
|
||||
* Converts all elements in a nested array (2D, 3D, etc) to lowercase
|
||||
* @param {*} arr
|
||||
*/
|
||||
function toLowerCaseRecursive(array) {
|
||||
//check for arrays and recurse
|
||||
if (Array.isArray(array)) {
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
array[i] = toLowerCaseRecursive(array[i]);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
//check for string vs non-strings
|
||||
if (typeof array === "string") {
|
||||
if (!hasNumber(array)) { //contains no numbers, so it isn't a note value
|
||||
return array.toLowerCase();
|
||||
} else { //case with note values, which contain numbers
|
||||
//capitalize the first character in the string
|
||||
return array[0].toUpperCase() + array.slice(1);
|
||||
}
|
||||
} else {
|
||||
return array;
|
||||
}
|
||||
}
|
||||
window.toLowerCaseRecursive = toLowerCaseRecursive;
|
||||
|
||||
function convertListToArrayRecursive(list) {
|
||||
let temp = []
|
||||
// need to do more testing for chords and nested lists
|
||||
if (!(list.contents === undefined)) {
|
||||
for (var i = 0; i < list.contents.length; i++) {
|
||||
temp[i] = convertListToArrayRecursive(list.contents[i]);
|
||||
}
|
||||
return temp;
|
||||
} else {
|
||||
return list;
|
||||
}
|
||||
}
|
||||
window.convertListToArrayRecursive = convertListToArrayRecursive;
|
||||
|
||||
function hasNumber(myString) {
|
||||
return /\d/.test(myString);
|
||||
}
|
||||
window.hasNumber = hasNumber;
|
||||
|
||||
function deep_copy(array) {
|
||||
return JSON.parse(JSON.stringify(array));
|
||||
}
|
||||
window.deep_copy = deep_copy;
|
||||
|
||||
// play dummy sound to initialize
|
||||
|
||||
setTimeout(() => {
|
||||
console.log("playing initialization sound")
|
||||
for (let i = 0; i < instrumentNames.length; i++) {
|
||||
let instrumentName = instrumentNames[i];
|
||||
if (instrumentName === "shakuhachi") return;
|
||||
window.playNote("C4", 1, instrumentName, 0);
|
||||
}
|
||||
}, 1000 * 3);
|
||||
|
||||
// set loaded to true
|
||||
|
||||
setTimeout(() => {
|
||||
console.log("TuneScope Loaded")
|
||||
window.parent.loadedTuneScope = true;
|
||||
}, 1000 * 4)
|
|
@ -0,0 +1,351 @@
|
|||
SnapExtensions.primitives.set(
|
||||
'ts_setinst(name)',
|
||||
function (name) {
|
||||
window.parent.currentInstrumentName = name.toLowerCase();
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_setvol(percent)',
|
||||
function (percent) {
|
||||
window.parent.globalInstrumentVolume = percent/100;
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_setinstvol(name, percent)',
|
||||
function (instrumentName, percent) {
|
||||
window.parent.instrumentVolumes[instrumentName] = percent/100;
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_playnote(note, duration)',
|
||||
function (note, noteLength) {
|
||||
window.playNote(note, noteLength);
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_playtracks(tracklist, timesignature)',
|
||||
function (tracksList, timeSignature, tempo) {
|
||||
const multiplyArray = (arr, length) =>
|
||||
Array.from({ length }, () => arr).flat()
|
||||
|
||||
const wait = (duration) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, duration)
|
||||
})
|
||||
}
|
||||
|
||||
const playTrackMeasure = async (currTrack, measureIndex, beatsPerMeasure, tempo, instrument) => {
|
||||
var beat = 0;
|
||||
const beatEndIndex = beatsPerMeasure[0];
|
||||
|
||||
|
||||
while (beat < beatEndIndex) {
|
||||
const note = currTrack[measureIndex][0];
|
||||
const noteLength = currTrack[measureIndex][1];
|
||||
measureIndex++; //increment for the next index in the track
|
||||
|
||||
const durationInSeconds = noteLength * (window.baseTempo / tempo);
|
||||
|
||||
// play the note and wait
|
||||
await window.playNote(note, durationInSeconds, instrument);
|
||||
await wait(durationInSeconds * 1000)
|
||||
|
||||
// we increment i with respect to the number of beats the current note occupies in a measure
|
||||
beat += noteLength * beatsPerMeasure[1];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const playTracks = async (tracksList, timeSignature, tempo) => {
|
||||
// verify inputs
|
||||
if (!tracksList.contents) return;
|
||||
|
||||
const beatsPerMeasure = window.timeSignatureToBeatsPerMeasure[timeSignature];
|
||||
|
||||
var tracks = window.convertListToArrayRecursive(tracksList);
|
||||
|
||||
// convert all elements in the track to lowercase
|
||||
tracks = window.toLowerCaseRecursive(tracks);
|
||||
|
||||
// check to make sure we have an actual melody/chord track rather than just a loop
|
||||
// this ensures that we have a definitive track length
|
||||
let haveSetTrackLength = false
|
||||
let definitiveTrackIndex = 0 //index of valid melody/chord track
|
||||
|
||||
// check to make sure we have an actual melody/chord track rather than just a loop
|
||||
// this ensures that we have a deinitive track length
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
let currTrack = tracks[i];
|
||||
if (currTrack[0][0] === "melody" || currTrack[0][0] === "chords") {
|
||||
definitiveTrackIndex = i;
|
||||
haveSetTrackLength = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!haveSetTrackLength) {
|
||||
console.error("No Melody or Chord track provided, only Chord/Drum Loop")
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
first, add up all the note values in the track
|
||||
to determine the total number of beats
|
||||
then, calculate the number of measures by considering the time signature
|
||||
and the total number of beats in the track list
|
||||
*/
|
||||
|
||||
// converts the strings of note length in each track to their respective duration values
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
let currTrack = tracks[i];
|
||||
for (let j = 1; j < currTrack.length; j++) { //index from 1 to avoid the header
|
||||
//Reassign the durations list to numerical duration values from strings
|
||||
//jth (Note, Duration) pair
|
||||
currTrack[j][1] = window.noteLengthToTimeValue[currTrack[j][1]]
|
||||
}
|
||||
}
|
||||
|
||||
// properly encodes drum tracks
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
let currTrack = tracks[i];
|
||||
// check each track's header to see whether it is a drum track
|
||||
// Header: (Instrument, Type)
|
||||
if (currTrack[0][0] === "loop-drums") {
|
||||
var isBassDrum = (currTrack[0][1] === "bass drum");
|
||||
for (let j = 1; j < currTrack.length; j++) {
|
||||
if (currTrack[j][0] === "x") { // ("x", duration) encode a note
|
||||
//check if the instrument is a bass drum
|
||||
if (isBassDrum) {
|
||||
currTrack[j][0] = "C2";
|
||||
} else {
|
||||
currTrack[j][0] = "C4";
|
||||
}
|
||||
} else { //(" ", duration) encode a rest
|
||||
currTrack[j][0] = "R";
|
||||
}
|
||||
|
||||
//converting the duration length to the appropriate value based on the timesignature
|
||||
// If eighth notes get the beat, subdivide drum tracks into sixteenth notes
|
||||
if (beatsPerMeasure[1] == 0.5) {
|
||||
currTrack[j][1] = 0.25;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// calculates the total number of beats in the song
|
||||
var totalBeats = 0;
|
||||
var defTrack = tracks[definitiveTrackIndex];
|
||||
for (let j = 1; j < defTrack.length; j++) {
|
||||
totalBeats += parseFloat(defTrack[j][1]);
|
||||
}
|
||||
|
||||
// length of measure = total number of beats (w.r.t which note gets the beat) / beats per measure
|
||||
const totalMeasures = (totalBeats) / (beatsPerMeasure[0] * beatsPerMeasure[1]);
|
||||
|
||||
//convert any melody/chord/drum loop to a regular track
|
||||
// done by repeatedly appending the array to itself
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
let currTrack = tracks[i];
|
||||
//check if the current track is a loop
|
||||
if (currTrack[0][0] === "loop-melody" || currTrack[0][0] === "loop-chords" || currTrack[0][0] === "loop-drums") {
|
||||
let beatsInLoop = 0;
|
||||
for (let j = 1; j < currTrack.length; j++) {
|
||||
beatsInLoop += parseFloat(currTrack[j][1]);
|
||||
}
|
||||
let loopCount = parseInt(totalBeats / beatsInLoop);
|
||||
|
||||
//appending the track to itself
|
||||
//we don't repeat the header
|
||||
let header = currTrack[0];
|
||||
let newTrack = multiplyArray(currTrack.slice(1), loopCount);
|
||||
newTrack.unshift(header)
|
||||
|
||||
if (header[0] === "loop-chords") {
|
||||
newTrack[0][0] = "chords";
|
||||
} else {
|
||||
newTrack[0][0] = "melody";
|
||||
}
|
||||
|
||||
//push the multiplied track to the tracks list
|
||||
//and remove the original loop
|
||||
tracks.push(newTrack)
|
||||
tracks.splice(i,1)
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
let currTrack = tracks[i];
|
||||
//find which elements of the track list are embedded chords
|
||||
if (currTrack[0][0] === "chords") {
|
||||
let chordInstrument = currTrack[0][1];
|
||||
let maxChordLen = 0;
|
||||
for (let j = 1; j < currTrack.length; j++) {
|
||||
// iterate through each chord in the track to find the largest chord (most # of notes)
|
||||
maxChordLen = Math.max(maxChordLen, currTrack[j][0].length);
|
||||
}
|
||||
|
||||
//splits the notes of chords into separate tracks
|
||||
for(let k = 0; k < maxChordLen; k++) {
|
||||
// the new track will have the same instrument, but be encoded as a melody line
|
||||
let newTrack = [["melody", chordInstrument]];
|
||||
for (let j = 1; j < currTrack.length; j++) {
|
||||
let currChord = currTrack[j][0];
|
||||
// if the chord is large enough, add the kth note of the chord to the melody line
|
||||
//otherwise, the melody will rest for that note in the track
|
||||
if (k < currChord.length) {
|
||||
// kth note of the chord, keep the duration of the chord
|
||||
newTrack.push([currChord[k], currTrack[j][1]]);
|
||||
}else {
|
||||
newTrack.push(["r", currTrack[j][1]]);
|
||||
|
||||
}
|
||||
}
|
||||
//add this new track to the overarching tracklist
|
||||
tracks.push(newTrack);
|
||||
}
|
||||
// delete original chord track from tracks
|
||||
tracks.splice(i, 1);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Play Measures track by track
|
||||
for (let i = 0; i < totalMeasures; i++) {
|
||||
console.log("Playing measure " + (i + 1));
|
||||
const measureResults = [];
|
||||
|
||||
// count for the number of beats that have passed since the last measure
|
||||
// e.g. in 4/4, measure 3 will have 2*4 = 8 beats elapsed. Next measure starts
|
||||
// on beat 8 (0 indexed)
|
||||
let elapsedBeats = i * beatsPerMeasure[0];
|
||||
|
||||
//per track
|
||||
for (let j = 0; j < tracks.length; j++) {
|
||||
let currTrack = tracks[j];
|
||||
let instrument = currTrack[0][1];
|
||||
let measureIndex = 0;
|
||||
let elapsedSum = 0;
|
||||
|
||||
// identifying where in the track array to begin the measure
|
||||
// since different tracks have different array lengths, but
|
||||
// the same amount of beats, they will align at each measure
|
||||
// beat-wise, but have different starting indices measure-wise
|
||||
for (let k = 1; k < currTrack.length; k++) {
|
||||
if (elapsedSum >= elapsedBeats) {
|
||||
measureIndex = k;
|
||||
break;
|
||||
} else {
|
||||
// add the value of the kth duration
|
||||
elapsedSum += parseFloat(currTrack[k][1]);
|
||||
}
|
||||
}
|
||||
|
||||
measureResults.push(new Promise((resolve, reject) => {
|
||||
playTrackMeasure(currTrack, measureIndex, beatsPerMeasure, tempo, instrument).then(() => {
|
||||
resolve();
|
||||
}).catch((err) => {
|
||||
reject(err);
|
||||
})
|
||||
}));
|
||||
}
|
||||
await Promise.all(measureResults);
|
||||
}
|
||||
}
|
||||
|
||||
playTracks(tracksList, timeSignature, tempo);
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_playMIDI(controller, instrument)',
|
||||
function (controller_name, instrument) {
|
||||
var current_controller = controller_name;
|
||||
var midi_instrument = instrument;
|
||||
|
||||
function onEnabled() {
|
||||
let synth = window.WebMidi.getInputByName(current_controller);
|
||||
let keyboard = synth.channels[1];
|
||||
|
||||
// Listener for the keyboard, prints midi note number
|
||||
keyboard.addListener("noteon", e => {
|
||||
window.playNote(e.note.identifier, 0.5, midi_instrument);
|
||||
});
|
||||
}
|
||||
|
||||
const playMidiController = async (controller, instrument) => {
|
||||
if(controller === null || controller === "") return;
|
||||
current_controller = controller;
|
||||
|
||||
//enables the webmidi controller, doesn't record notes
|
||||
window.WebMidi.enable((err) => {
|
||||
if (err) {
|
||||
alert(err);
|
||||
} else {
|
||||
onEnabled();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
playMidiController(controller_name, instrument);
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_settone(id, frequency, amplitude)',
|
||||
function (id, freq, ampl) {
|
||||
var created = false;
|
||||
if (!window.tones[id]) {
|
||||
window.tones[id] = new window.Tone(id);
|
||||
created = true;
|
||||
}
|
||||
|
||||
window.tones[id].setFreq(freq);
|
||||
window.tones[id].setAmpl(ampl * 100);
|
||||
created && window.tones[id].turnOn();
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_turntoneon(id, bool)',
|
||||
function (id, on) {
|
||||
if (!window.tones[id]) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (on) {
|
||||
window.tones[id].turnOn();
|
||||
} else {
|
||||
window.tones[id].turnOff();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_stoptones()',
|
||||
function () {
|
||||
const vals = Object.values(window.tones);
|
||||
|
||||
for (let i = 0; i < vals.length; i++) {
|
||||
const currTone = vals[i];
|
||||
currTone.turnOff();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
SnapExtensions.primitives.set(
|
||||
'ts_loaded()',
|
||||
function () {
|
||||
return window.parent.loadedTuneScope === true;
|
||||
}
|
||||
);
|
File diff suppressed because one or more lines are too long
Plik diff jest za duży
Load Diff
44
sw.js
44
sw.js
|
@ -1,4 +1,4 @@
|
|||
var snapVersion = '8.0.0-dev-220719',
|
||||
var snapVersion = '8.0.0-dev-220720',
|
||||
cacheName = 'snap-pwa',
|
||||
filesToCache = [
|
||||
'snap.html',
|
||||
|
@ -109,6 +109,48 @@ var snapVersion = '8.0.0-dev-220719',
|
|||
'libraries/schemeNumber.js',
|
||||
'libraries/SciSnapExtensions.js',
|
||||
'libraries/SciSnap!2Blocks.xml',
|
||||
|
||||
'libraries/TuneScope.xml',
|
||||
|
||||
// TuneScope dependencies
|
||||
'libraries/TuneScope/TuneScope.js',
|
||||
'libraries/TuneScope/TS_init.js',
|
||||
'libraries/TuneScope/webmidi.iife.js',
|
||||
'libraries/TuneScope/WebAudioFontPlayer.js',
|
||||
|
||||
// TuneScope instruments
|
||||
'libraries/TuneScope/12849_21_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/12848_21_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/12847_21_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/12846_0_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/12842_0_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/12835_21_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/12840_6_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/12869_6_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0580_GeneralUserGS_sf2_file.js',
|
||||
'libraries/TuneScope/0560_GeneralUserGS_sf2_file.js',
|
||||
'libraries/TuneScope/0680_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0121_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/1070_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/0460_GeneralUserGS_sf2_file.js',
|
||||
'libraries/TuneScope/0600_GeneralUserGS_sf2_file.js',
|
||||
'libraries/TuneScope/0730_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0710_Chaos_sf2_file.js',
|
||||
'libraries/TuneScope/0420_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0400_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0700_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/1040_Aspirin_sf2_file.js',
|
||||
'libraries/TuneScope/0770_SBLive_sf2.js',
|
||||
'libraries/TuneScope/0650_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/1050_FluidR3_GM_sf2_file.js',
|
||||
'libraries/TuneScope/0180_Chaos_sf2_file.js',
|
||||
'libraries/TuneScope/0020_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0260_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0241_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0350_JCLive_sf2_file.js',
|
||||
'libraries/TuneScope/0320_GeneralUserGS_sf2_file.js',
|
||||
'libraries/TuneScope/0230_Aspirin_sf2_file.js',
|
||||
|
||||
'libraries/serial_module.xml',
|
||||
'libraries/signada.js',
|
||||
'libraries/signada.xml',
|
||||
|
|
Ładowanie…
Reference in New Issue