├── .gitattributes ├── .gitignore ├── .vs ├── ProjectSettings.json ├── VSWorkspaceState.json └── slnx.sqlite ├── License.md ├── README.md ├── WebMIDI ├── constants.js └── namespace.js ├── consoleSf2Synth └── consoleSf2Synth.js ├── cwMIDISynth ├── cwConstants.js ├── cwMIDISynth.js ├── cwMIDISynthCore.js ├── sounds │ ├── irHall.ogg │ └── irRoom.wav └── waveShaper.js ├── cwMonoSynth └── cwMonoSynth.js ├── docs ├── index.html └── styleSheet.css ├── host.html ├── host.js ├── hostStyleSheet.css ├── residentSf2Synth ├── residentSf2Synth.js ├── riffParser.js ├── soundFont.js ├── soundFontParser.js └── soundFontSynthNote.js └── residentWAFSynth ├── residentWAFSynth.js ├── residentWAFSynthNote.js ├── wafReverberator.js ├── webAudioFont.js ├── webAudioFontDefs.js └── webAudioFontFiles ├── 0000_FluidR3_GM_sf2_file.js ├── 0000_GeneralUserGS_sf2_file.js ├── 0060_FluidR3_GM_sf2_file.js ├── 0060_GeneralUserGS_sf2_file.js ├── 0080_FluidR3_GM_sf2_file.js ├── 0080_GeneralUserGS_sf2_file.js ├── 0090_FluidR3_GM_sf2_file.js ├── 0090_GeneralUserGS_sf2_file.js ├── 0100_FluidR3_GM_sf2_file.js ├── 0100_GeneralUserGS_sf2_file.js ├── 0110_FluidR3_GM_sf2_file.js ├── 0110_GeneralUserGS_sf2_file.js ├── 0120_FluidR3_GM_sf2_file.js ├── 0120_GeneralUserGS_sf2_file.js ├── 0130_FluidR3_GM_sf2_file.js ├── 0130_GeneralUserGS_sf2_file.js ├── 0140_FluidR3_GM_sf2_file.js ├── 0140_GeneralUserGS_sf2_file.js ├── 0150_FluidR3_GM_sf2_file.js ├── 0160_FluidR3_GM_sf2_file.js ├── 0160_GeneralUserGS_sf2_file.js ├── 0240_FluidR3_GM_sf2_file.js ├── 0250_FluidR3_GM_sf2_file.js ├── 0260_FluidR3_GM_sf2_file.js ├── 0270_FluidR3_GM_sf2_file.js ├── 0460_FluidR3_GM_sf2_file.js ├── 0530_FluidR3_GM_sf2_file.js ├── 0580_FluidR3_GM_sf2_file.js ├── 0600_FluidR3_GM_sf2_file.js ├── 0660_FluidR3_GM_sf2_file.js ├── 0680_FluidR3_GM_sf2_file.js ├── 0700_FluidR3_GM_sf2_file.js ├── 0710_FluidR3_GM_sf2_file.js ├── 0730_FluidR3_GM_sf2_file.js ├── 0790_FluidR3_GM_sf2_file.js ├── 0890_FluidR3_GM_sf2_file.js ├── 0920_FluidR3_GM_sf2_file.js ├── 0930_FluidR3_GM_sf2_file.js ├── 0950_FluidR3_GM_sf2_file.js ├── 12841_0_FluidR3_GM_sf2_file.js ├── 12845_0_FluidR3_GM_sf2_file.js ├── 12848_0_FluidR3_GM_sf2_file.js ├── 12856_0_FluidR3_GM_sf2_file.js ├── 12859_0_FluidR3_GM_sf2_file.js ├── 12860_0_FluidR3_GM_sf2_file.js ├── 12861_0_FluidR3_GM_sf2_file.js ├── 12862_0_FluidR3_GM_sf2_file.js ├── 12863_0_FluidR3_GM_sf2_file.js ├── 12870_0_FluidR3_GM_sf2_file.js ├── 12873_0_FluidR3_GM_sf2_file.js ├── 12874_0_FluidR3_GM_sf2_file.js ├── 12875_0_FluidR3_GM_sf2_file.js ├── 12876_0_FluidR3_GM_sf2_file.js ├── 12877_0_FluidR3_GM_sf2_file.js ├── 12881_0_FluidR3_GM_sf2_file.js └── LICENSE.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Build results 10 | [Dd]ebug/ 11 | [Dd]ebugPublic/ 12 | [Rr]elease/ 13 | x64/ 14 | build/ 15 | bld/ 16 | [Bb]in/ 17 | [Oo]bj/ 18 | 19 | # Roslyn cache directories 20 | *.ide/ 21 | 22 | # MSTest test Results 23 | [Tt]est[Rr]esult*/ 24 | [Bb]uild[Ll]og.* 25 | 26 | #NUNIT 27 | *.VisualState.xml 28 | TestResult.xml 29 | 30 | # Build Results of an ATL Project 31 | [Dd]ebugPS/ 32 | [Rr]eleasePS/ 33 | dlldata.c 34 | 35 | *_i.c 36 | *_p.c 37 | *_i.h 38 | *.ilk 39 | *.meta 40 | *.obj 41 | *.pch 42 | *.pdb 43 | *.pgc 44 | *.pgd 45 | *.rsp 46 | *.sbr 47 | *.tlb 48 | *.tli 49 | *.tlh 50 | *.tmp 51 | *.tmp_proj 52 | *.log 53 | *.vspscc 54 | *.vssscc 55 | .builds 56 | *.pidb 57 | *.svclog 58 | *.scc 59 | 60 | # Chutzpah Test files 61 | _Chutzpah* 62 | 63 | # Visual C++ cache files 64 | ipch/ 65 | *.aps 66 | *.ncb 67 | *.opensdf 68 | *.sdf 69 | *.cachefile 70 | 71 | # Visual Studio profiler 72 | *.psess 73 | *.vsp 74 | *.vspx 75 | 76 | # TFS 2012 Local Workspace 77 | $tf/ 78 | 79 | # Guidance Automation Toolkit 80 | *.gpState 81 | 82 | # ReSharper is a .NET coding add-in 83 | _ReSharper*/ 84 | *.[Rr]e[Ss]harper 85 | *.DotSettings.user 86 | 87 | # JustCode is a .NET coding addin-in 88 | .JustCode 89 | 90 | # TeamCity is a build add-in 91 | _TeamCity* 92 | 93 | # DotCover is a Code Coverage Tool 94 | *.dotCover 95 | 96 | # NCrunch 97 | _NCrunch_* 98 | .*crunch*.local.xml 99 | 100 | # MightyMoose 101 | *.mm.* 102 | AutoTest.Net/ 103 | 104 | # Web workbench (sass) 105 | .sass-cache/ 106 | 107 | # Installshield output folder 108 | [Ee]xpress/ 109 | 110 | # DocProject is a documentation generator add-in 111 | DocProject/buildhelp/ 112 | DocProject/Help/*.HxT 113 | DocProject/Help/*.HxC 114 | DocProject/Help/*.hhc 115 | DocProject/Help/*.hhk 116 | DocProject/Help/*.hhp 117 | DocProject/Help/Html2 118 | DocProject/Help/html 119 | 120 | # Click-Once directory 121 | publish/ 122 | 123 | # Publish Web Output 124 | *.[Pp]ublish.xml 125 | *.azurePubxml 126 | ## TODO: Comment the next line if you want to checkin your 127 | ## web deploy settings but do note that will include unencrypted 128 | ## passwords 129 | #*.pubxml 130 | 131 | # NuGet Packages Directory 132 | packages/* 133 | ## TODO: If the tool you use requires repositories.config 134 | ## uncomment the next line 135 | #!packages/repositories.config 136 | 137 | # Enable "build/" folder in the NuGet Packages folder since 138 | # NuGet packages use it for MSBuild targets. 139 | # This line needs to be after the ignore of the build folder 140 | # (and the packages folder if the line above has been uncommented) 141 | !packages/build/ 142 | 143 | # Windows Azure Build Output 144 | csx/ 145 | *.build.csdef 146 | 147 | # Windows Store app package directory 148 | AppPackages/ 149 | 150 | # Others 151 | sql/ 152 | *.Cache 153 | ClientBin/ 154 | [Ss]tyle[Cc]op.* 155 | ~$* 156 | *~ 157 | *.dbmdl 158 | *.dbproj.schemaview 159 | *.pfx 160 | *.publishsettings 161 | node_modules/ 162 | 163 | # RIA/Silverlight projects 164 | Generated_Code/ 165 | 166 | # Backup & report files from converting an old project file 167 | # to a newer Visual Studio version. Backup files are not needed, 168 | # because we have git ;-) 169 | _UpgradeReport_Files/ 170 | Backup*/ 171 | UpgradeLog*.XML 172 | UpgradeLog*.htm 173 | 174 | # SQL Server files 175 | *.mdf 176 | *.ldf 177 | 178 | # Business Intelligence projects 179 | *.rdl.data 180 | *.bim.layout 181 | *.bim_*.settings 182 | 183 | # Microsoft Fakes 184 | FakesAssemblies/ 185 | 186 | # LightSwitch generated files 187 | GeneratedArtifacts/ 188 | _Pvt_Extensions/ 189 | ModelManifest.xml -------------------------------------------------------------------------------- /.vs/ProjectSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "CurrentProjectSetting": null 3 | } -------------------------------------------------------------------------------- /.vs/VSWorkspaceState.json: -------------------------------------------------------------------------------- 1 | { 2 | "ExpandedNodes": [ 3 | "" 4 | ], 5 | "PreviewInSolutionExplorer": false 6 | } -------------------------------------------------------------------------------- /.vs/slnx.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notator/WebMIDISynthHost/eafcdbc4b4c36a3a12cc1be0cc3c724214fb8dce/.vs/slnx.sqlite -------------------------------------------------------------------------------- /License.md: -------------------------------------------------------------------------------- 1 | 2 | The following licence applies to all the software in this repository, except for 3 | third party software covered by other licences (see below).
4 | 5 | #### Copyright (c) 2020 James Ingram 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | THE SOFTWARE. 24 | 25 | #### Third Party Software 26 | 27 | 1. Sergey Surikov's WebAudioFont software is covered by the [GNU General Public Licence v3.0](https://github.com/surikov/webaudiofont/blob/master/LICENSE.md). 28 | 2. The Arachno SoundFont does not allow commercial use.
29 | The [original Arachnosoft Read Me](https://james-ingram-act-two.de/soundFonts/Arachno/Read%20Me.txt) is included in the folder containing the soundFont itself, and contains the following IMPORTANT LICENSING INFORMATION:
30 | "Most portions of this bank actually come from other sources (SoundFont 31 | and GigaSampler libraries, third-party synthesizer samples) that 32 | have been credited in the bundled documentation.
33 | You're free to use Arachno SoundFont in any of your projects. But, 34 | please be aware that this bank is primarily distributed for private, 35 | non-commercial purposes only, as it uses portions from other authors.
36 | If you want to use it for commercial purposes, please obtain a written 37 | consent from the original authors credited in the documentation." 38 | 3. As far as I can ascertain, the TimGM6mb soundFont is in the public domain. If this is not the case, please let me know.
39 | I downloaded it from the [VirtualMIDISynth site](https://coolsoft.altervista.org/en/virtualmidisynth). 40 | 4. Links to the WebAudioFont presets used by the ResidentWAFSynth were found via Surikov's [WebAudioFont page](https://surikov.github.io/webaudiofontdata/sound/).
41 | The presets originated in two soundFonts: 42 | - [GeneralUser GS licence](http://www.schristiancollins.com/generaluser.php) 43 | - [FluidR3 licence](https://github.com/musescore/MuseScore/blob/master/share/sound/FluidR3Mono_License.md) 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Web MIDI Synth Host 2 | #### 2nd May 2022: This repository is now a read-only archive. 3 | To keep things simple, I am now developing just one synthesizer in one repository: the **ResidentSynth** in the [ResidentSynthHost](https://james-ingram-act-two.de/open-source/ResidentSynthHost/host.html) repository.
4 | The **ResidentSynth** is a direct descendant of **ResidentWAFSynth**, whose code is archived here.
5 | 6 | --- 7 | 8 | This is a Web MIDI application, written in HTML5 and Javascript. It can be tried out at
9 | https://james-ingram-act-two.de/open-source/WebMIDISynthHost/host.html
10 |
11 | A "Web MIDI Synth" is a GUI-less software synth that uses the Web Audio API to implement the Web MIDI API's _Output Device_ interface.
12 | Web MIDI Synths can be included in websites as a substitute for end-user hardware MIDI Output devices. This makes them especially useful on mobile devices. Also, since they themselves provide the MIDI Output Device interface, they don't depend on browser implementations of the Web MIDI API.
13 |
14 | This project was originally started so as to further the discussion about software synths at [Web MIDI API issue 124](https://github.com/WebAudio/web-midi-api/issues/124).
15 | It is now being used as a framework demonstrating the use of the Web MIDI Output Device Interface for different GUI-less synthesizers.
16 | Issues and suggestions for the [cwMIDISynth](https://github.com/cwilso/midi-synth) should be made in its own repository.
17 | A new, compatible synth could be added to this host as follows: 18 | 1. clone this repository. 19 | 2. create a new folder, parallel to the other synths' folders, for the new synth's files. 20 | 3. create a file that implements the new synth's interface using one of the existing synth definition files as a model. Such definitions can be found in: 21 | - `residentWAFSynth/residentWAFSynth.js` 22 | - `residentSf2Synth/residentSf2Synth.js` 23 | - `consoleSf2Synth/consoleSf2Synth.js` 24 | - `cwMIDISynth/cwMIDISynth.js` 25 | - `cwMonosynth/cwMonosynth.js` 26 | 4. include code for the new synth at the bottom of `host.js` (see the instructions there) 27 | 5. implement the interface, and include the synth's file(s) at the bottom of the host.html file 28 | 29 | #### Currently Hosted Synthesizers: 30 | * **ResidentWAFSynth**
31 | The ResidentWAFSynth uses [WebAudioFont](https://github.com/surikov/webaudiofont) presets. These load very quickly, and can be arbitrarily configured in the `residentWAFSynth/webAudioFontDefs.js` file. For illustration purposes, the example in this repository is deliberately large. The equivalent file in other installations would typically be much smaller.
32 | The code for this synth owes a lot to Sergey Surikov's [WebAudioFontPlayer](https://surikov.github.io/webaudiofont/npm/dist/WebAudioFontPlayer.js). In particular, the code for loading and adjusting presets is very similar to the code in his `WebAudioFontLoader`.
33 | The synth has the same controls as the _ResidentSf2Synth_ (its direct predecessor — see below), but with an additional reverberation control which is practically a clone of Surikov's `WebAudioFontReverberator`.
34 | It should be easy to add more controls in future using the reverberator as a model (Low Frequency Modulation, Ring-Modulation, Envelope controls etc.). (This should be done in [the synth's own repository](https://github.com/notator/ResidentWAFSynthHost).)
35 | Apart from having a MIDI interface, the main difference between the ResidentWAFSynth and Surikov's WebAudioFontPlayer is in the approach to note envelopes: The ResidentWAFSynth allows custom envelope settings to be provided for each preset zone. At a more general level, there are three types of (General MIDI) preset: Those that loop indefinitely (such as wind instruments, organs etc.) those that decay slowly (pianos, vibraphones etc.) and percussion instruments (which decay without looping, using their original sample).
36 | * **ResidentSf2Synth**
37 | This was initially a clone of gree's [sf2synth.js](https://github.com/gree/sf2synth.js), but I changed both the soundFont and synthesizer code so that soundFonts could be cached and changed at runtime.
38 | This implementation uses sf2 soundFont files created from the [Arachno](http://www.arachnosoft.com/main/soundfont.php) and [TimGM6mb](https://packages.debian.org/sid/sound/timgm6mb-soundfont) soundfonts using the [Awave Studio](https://www.fmjsoft.com/) soundFont editor. Any sf2 soundFont could, of course, be used but large soundFonts are impractical here.
39 | Issues relating to this synthesizer should be raised here, in this repository.
40 | * **ConsoleSf2Synth**
41 | This is a minimal synth that simply echoes the messages it receives to the console without producing sound. 42 | It could be used as a stub when writing a new synthesizer. 43 | * **CW_MIDISynth**
44 | This is Chris Wilson's MIDI synth ([repository](https://github.com/cwilso/midi-synth), [application](https://webaudiodemos.appspot.com/midi-synth/index.html)) without its original GUI. I have tried to keep closely to the code in the original files while using simple MIDI controls whose values are in the range 0..127. It would, of course, be possible to get nearer to the original settings by using hi- and lo-byte controllers (as standard MIDI does).
45 | Issues with this synthesizer should be raised at its own [repository](https://github.com/cwilso/midi-synth). 46 | * **CW_MonoSynth** A very simple synth. The original is [here](https://github.com/cwilso/monosynth).
47 | 48 | #### Demo Applications: 49 | There are simple demo applications, showing how to embed the above synths in web pages, at:
50 | [SimpleWebAudioFontSynthHost](https://james-ingram-act-two.de/open-source/SimpleWebAudioFontSynthHost/host.html) (ResidentWAFSynth)
51 | [SimpleSoundFontSynthHost](https://james-ingram-act-two.de/open-source/SimpleSoundFontSynthHost/host.html) (ResidentSf2Synth)
52 | [SimpleMIDISynthHost](https://james-ingram-act-two.de/open-source/SimpleMIDISynthHost/host.html) and [SimpleMIDISynthHost2](https://james-ingram-act-two.de/open-source/SimpleMIDISynthHost2/host.html) (CW_MIDISynth).
53 | SimpleMIDISynthHost2 demonstrates how to use a hardware MIDI keyboard to play the synth, and only works in browsers that support the Web MIDI API.
54 | 55 | James Ingram
56 | December 2015 (updated February 2016, June 2019, March 2020, April 2020, May 2022)
57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /WebMIDI/constants.js: -------------------------------------------------------------------------------- 1 | /* 2 | * copyright 2015 James Ingram 3 | * https://james-ingram-act-two.de/ 4 | * 5 | * Code licensed under MIT 6 | * 7 | * The WebMIDI.constants namespace which defines read-only MIDI constants. 8 | * ji: The CONTROL objects need to be extended to include other useful standard MIDI controls. 9 | * (Not _all_ the standard MIDI controls are useful for software WebMIDISynths.) 10 | */ 11 | 12 | /*jslint bitwise, white */ 13 | /*global WebMIDI */ 14 | 15 | WebMIDI.namespace('WebMIDI.constants'); 16 | 17 | WebMIDI.constants = (function() 18 | { 19 | "use strict"; 20 | var 21 | COMMAND = {}, 22 | CONTROL = {}, 23 | // These GM_PRESET_NAMES are written here exactly as defined at MIDI.org: 24 | // http://midi.org/techspecs/gm1sound.php 25 | GM_PRESET_NAMES = 26 | [ 27 | // Piano (1-8) 28 | "Acoustic Grand Piano", "Bright Acoustic Piano", "Electric Grand Piano", "Honky-tonk Piano", "Electric Piano 1", 29 | "Electric Piano 2", "Harpsichord", "Clavi", 30 | // Chromatic Percussion (9-16) 31 | "Celesta", "Glockenspiel", "Music Box", "Vibraphone", "Marimba", "Xylophone", "Tubular Bells", "Dulcimer", 32 | // Organ (17-24) 33 | "Drawbar Organ", "Percussive Organ", "Rock Organ", "Church Organ", "Reed Organ", "Accordion", "Harmonica", 34 | "Tango Accordion", 35 | // Guitar (25-32) 36 | "Acoustic Guitar (nylon)", "Acoustic Guitar (steel)", "Electric Guitar (jazz)", "Electric Guitar (clean)", 37 | "Electric Guitar (muted)", "Overdriven Guitar", "Distortion Guitar", "Guitar harmonics", 38 | // Bass (33-40) 39 | "Acoustic Bass", "Electric Bass (finger)", "Electric Bass (pick)", "Fretless Bass", "Slap Bass 1", "Slap Bass 2", 40 | "Synth Bass 1", "Synth Bass 2", 41 | // Strings (41-48) 42 | "Violin", "Viola", "Cello", "Contrabass", "Tremolo Strings", "Pizzicato Strings", "Orchestral Harp", "Timpani", 43 | // Ensemble (49-56) 44 | "String Ensemble 1", "String Ensemble 2", "SynthStrings 1", "SynthStrings 2", "Choir Aahs", "Voice Oohs", "Synth Voice", 45 | "Orchestra Hit", 46 | // Brass (57-64) 47 | "Trumpet", "Trombone", "Tuba", "Muted Trumpet", "French Horn", "Brass Section", "SynthBrass 1", "SynthBrass 2", 48 | // Reed (65-72) 49 | "Soprano Sax", "Alto Sax", "Tenor Sax", "Baritone Sax", "Oboe", "English Horn", "Bassoon", "Clarinet", 50 | // Pipe (73-80) 51 | "Piccolo", "Flute", "Recorder", "Pan Flute", "Blown Bottle", "Shakuhachi", "Whistle", "Ocarina", 52 | // Synth Lead (81-88) 53 | "Lead 1 (square)", "Lead 2 (sawtooth)", "Lead 3 (calliope)", "Lead 4 (chiff)", "Lead 5 (charang)", "Lead 6 (voice)", 54 | "Lead 7 (fifths)", "Lead 8 (bass + lead)", 55 | // Synth Pad (89-96) 56 | "Pad 1 (new age)", "Pad 2 (warm)", "Pad 3 (polysynth)", "Pad 4 (choir)", "Pad 5 (bowed)", "Pad 6 (metallic)", 57 | "Pad 7 (halo)", "Pad 8 (sweep)", 58 | // Synth Effects (97-104) 59 | "FX 1 (rain)", "FX 2 (soundtrack)", "FX 3 (crystal)", "FX 4 (atmosphere)", "FX 5 (brightness)", "FX 6 (goblins)", 60 | "FX 7 (echoes)", "FX 8 (sci-fi)", 61 | // Ethnic (105-112) 62 | "Sitar", "Banjo", "Shamisen", "Koto", "Kalimba", "Bag pipe", "Fiddle", "Shanai", 63 | // Percussive (113-120) 64 | "Tinkle Bell", "Agogo", "Steel Drums", "Woodblock", "Taiko Drum", "Melodic Tom", "Synth Drum", "Reverse Cymbal", 65 | // Sound Effects (121-128) 66 | "Guitar Fret Noise", "Breath Noise", "Seashore", "Bird Tweet", "Telephone Ring", "Helicopter", "Applause", 67 | "Gunshot" 68 | ], 69 | 70 | // These GM_PERCUSSION_NAMES are written here exactly as defined at MIDI.org: 71 | // http://midi.org/techspecs/gm1sound.php 72 | GM_PERCUSSION_NAMES = 73 | [ 74 | "Acoustic Bass Drum",// noteIndex 35 75 | "Bass Drum 1", // 36 76 | "Side Stick", // 37 77 | "Acoustic Snare",// 38 78 | "Hand Clap", // 39 79 | "Electric Snare",// 40 80 | "Low Floor Tom", // 41 81 | "Closed Hi Hat", // 42 82 | "High Floor Tom",// 43 83 | "Pedal Hi-Hat", // 44 84 | "Low Tom", // 45 85 | "Open Hi-Hat", // 46 86 | "Low-Mid Tom", // 47 87 | "Hi-Mid Tom", // 48 88 | "Crash Cymbal 1",// 49 89 | "High Tom", // 50 90 | "Ride Cymbal 1", // 51 91 | "Chinese Cymbal",// 52 92 | "Ride Bell", // 53 93 | "Tambourine", // 54 94 | "Splash Cymbal", // 55 95 | "Cowbell", // 56 96 | "Crash Cymbal 2",// 57 97 | "Vibraslap", // 58 98 | "Ride Cymbal 2", // 59 99 | "Hi Bongo", // 60 100 | "Low Bongo", // 61 101 | "Mute Hi Conga", // 62 102 | "Open Hi Conga", // 63 103 | "Low Conga", // 64 104 | "High Timbale", // 65 105 | "Low Timbale", // 66 106 | "High Agogo", // 67 107 | "Low Agogo", // 68 108 | "Cabasa", // 69 109 | "Maracas", // 70 110 | "Short Whistle", // 71 111 | "Long Whistle", // 72 112 | "Short Guiro", // 73 113 | "Long Guiro", // 74 114 | "Claves", // 75 115 | "Hi Wood Block", // 76 116 | "Low Wood Block",// 77 117 | "Mute Cuica", // 78 118 | "Open Cuica", // 79 119 | "Mute Triangle", // 80 120 | "Open Triangle" // 81 121 | ], 122 | 123 | commandName = function(command) 124 | { 125 | switch(command) 126 | { 127 | case COMMAND.NOTE_OFF: 128 | return ("noteOff"); 129 | case COMMAND.NOTE_ON: 130 | return ("noteOn"); 131 | case COMMAND.AFTERTOUCH: 132 | return ("aftertouch"); 133 | case COMMAND.CONTROL_CHANGE: 134 | return ("controlChange"); 135 | case COMMAND.PRESET: 136 | return ("preset"); 137 | case COMMAND.CHANNEL_PRESSURE: 138 | return ("channelPressure"); 139 | case COMMAND.PITCHWHEEL: 140 | return ("pitchWheel"); 141 | default: 142 | console.warn("Bad argument"); 143 | break; 144 | } 145 | }, 146 | // Only AFTERTOUCH, PRESET, CHANNEL_PRESSURE and PITCHWHEEL have default values. 147 | commandDefaultValue = function(command) 148 | { 149 | switch(command) 150 | { 151 | case COMMAND.AFTERTOUCH: 152 | case COMMAND.PRESET: 153 | case COMMAND.CHANNEL_PRESSURE: 154 | return (0); 155 | case COMMAND.PITCHWHEEL: 156 | return (64); 157 | default: 158 | console.warn("Bad argument."); 159 | break; 160 | } 161 | }, 162 | 163 | controlName = function(control) 164 | { 165 | switch(control) 166 | { 167 | case CONTROL.BANK: 168 | return ("bank"); 169 | case CONTROL.MODWHEEL: 170 | return ("modWheel"); 171 | case CONTROL.VOLUME: 172 | return ("volume"); 173 | case CONTROL.PAN: 174 | return ("pan"); 175 | case CONTROL.REVERBERATION: 176 | return ("reverberation"); 177 | case CONTROL.ALL_SOUND_OFF: 178 | return ("allSoundOff"); 179 | case CONTROL.ALL_CONTROLLERS_OFF: 180 | return ("allControllersOff"); 181 | case CONTROL.ALL_NOTES_OFF: 182 | return ("allNotesOff"); 183 | 184 | case CONTROL.REGISTERED_PARAMETER_FINE: 185 | return ("registeredParameterFine"); 186 | case CONTROL.REGISTERED_PARAMETER_COARSE: 187 | return ("registeredParameterCoarse"); 188 | case CONTROL.DATA_ENTRY_FINE: 189 | return ("dataEntryFine"); 190 | case CONTROL.DATA_ENTRY_COARSE: 191 | return ("dataEntryCoarse"); 192 | } 193 | }, 194 | // Only 3-byte controls have default values. 195 | // The return value is undefined for 2-byte controls. 196 | controlDefaultValue = function(control) 197 | { 198 | switch(control) 199 | { 200 | case CONTROL.BANK: 201 | case CONTROL.MODWHEEL: 202 | case CONTROL.REVERBERATION: 203 | return (0); 204 | case CONTROL.VOLUME: 205 | return (100); 206 | case CONTROL.PAN: 207 | return (64); 208 | 209 | case CONTROL.REGISTERED_PARAMETER_FINE: 210 | return (0); // fine parameter is fine pitchWheelDeviation (=cents) 211 | case CONTROL.REGISTERED_PARAMETER_COARSE: 212 | return (0); // coarse parameter is coarse pitchWheelDeviation (=semitones) 213 | case CONTROL.DATA_ENTRY_FINE: 214 | return (0); // default fine pitchWheelDeviation is 0 cents 215 | case CONTROL.DATA_ENTRY_COARSE: 216 | return (2); // default coarse pitchWheelDeviation is 2 semitones 217 | default: 218 | break; // return undefined 219 | } 220 | }, 221 | 222 | generalMIDIPresetName = function(presetIndex) 223 | { 224 | var presetName; 225 | if(presetIndex >= 0 && presetIndex <= GM_PRESET_NAMES.length) 226 | { 227 | presetName = GM_PRESET_NAMES[presetIndex]; 228 | } 229 | else 230 | { 231 | console.warn("Bad argument"); 232 | } 233 | return presetName; 234 | }, 235 | 236 | generalMIDIPercussionName = function(noteIndex) 237 | { 238 | var 239 | percussionName, 240 | indexOfFirstPercussionName = 35, 241 | index = noteIndex - indexOfFirstPercussionName; 242 | 243 | if(index >= 0 && index <= GM_PERCUSSION_NAMES.length) 244 | { 245 | percussionName = GM_PERCUSSION_NAMES[index]; 246 | } 247 | else 248 | { 249 | console.warn("Bad argument"); 250 | } 251 | return percussionName; 252 | }, 253 | 254 | API = 255 | { 256 | COMMAND: COMMAND, 257 | CONTROL: CONTROL, 258 | commandName: commandName, 259 | commandDefaultValue: commandDefaultValue, 260 | controlName: controlName, 261 | controlDefaultValue: controlDefaultValue, 262 | generalMIDIPresetName: generalMIDIPresetName, 263 | generalMIDIPercussionName: generalMIDIPercussionName 264 | }; 265 | 266 | // COMMAND 267 | Object.defineProperty(COMMAND, "NOTE_OFF", { value: 0x80, writable: false }); 268 | Object.defineProperty(COMMAND, "NOTE_ON", { value: 0x90, writable: false }); 269 | Object.defineProperty(COMMAND, "AFTERTOUCH", { value: 0xA0, writable: false }); 270 | Object.defineProperty(COMMAND, "CONTROL_CHANGE", { value: 0xB0, writable: false }); 271 | Object.defineProperty(COMMAND, "PRESET", { value: 0xC0, writable: false }); 272 | Object.defineProperty(COMMAND, "CHANNEL_PRESSURE", { value: 0xD0, writable: false }); 273 | Object.defineProperty(COMMAND, "PITCHWHEEL", { value: 0xE0, writable: false }); 274 | 275 | // CONTROL 276 | // Note that I am currently only using the "coarse" versions of these controls. 277 | // I think the corresponding "fine" controls should be named with a "_LO" suffix 278 | // (e.g. MODWHEEL_LO). 279 | Object.defineProperty(CONTROL, "BANK", { value: 0, writable: false }); 280 | Object.defineProperty(CONTROL, "MODWHEEL", { value: 1, writable: false }); 281 | Object.defineProperty(CONTROL, "VOLUME", { value: 7, writable: false }); 282 | Object.defineProperty(CONTROL, "PAN", { value: 10, writable: false }); 283 | Object.defineProperty(CONTROL, "DATA_ENTRY_FINE", { value: 38, writable: false }); 284 | Object.defineProperty(CONTROL, "DATA_ENTRY_COARSE", { value: 6, writable: false }); 285 | Object.defineProperty(CONTROL, "REVERBERATION", { value: 91, writable: false }); 286 | Object.defineProperty(CONTROL, "REGISTERED_PARAMETER_FINE", { value: 100, writable: false }); 287 | Object.defineProperty(CONTROL, "REGISTERED_PARAMETER_COARSE", { value: 101, writable: false }); 288 | Object.defineProperty(CONTROL, "ALL_SOUND_OFF", { value: 120, writable: false }); 289 | Object.defineProperty(CONTROL, "ALL_CONTROLLERS_OFF", { value: 121, writable: false }); 290 | Object.defineProperty(CONTROL, "ALL_NOTES_OFF", { value: 123, writable: false }); 291 | return API; 292 | } ()); 293 | 294 | 295 | -------------------------------------------------------------------------------- /WebMIDI/namespace.js: -------------------------------------------------------------------------------- 1 | /* 2 | * copyright 2015 James Ingram 3 | * https://james-ingram-act-two.de/ 4 | * 5 | * This code was adapted from JavaScript Patterns (O'Reilly, Stoyan Stephanov), page 89. 6 | * As far as this code can be considered my work, it is licensed under MIT. 7 | * 8 | */ 9 | 10 | /*jslint white */ 11 | /*global WebMIDI */ 12 | 13 | var WebMIDI = WebMIDI || {}; 14 | 15 | WebMIDI.namespace = function (ns_string) 16 | { 17 | "use strict"; 18 | var parts = ns_string.split('.'), 19 | parent = WebMIDI, 20 | i; 21 | 22 | // strip redundant leading global 23 | if (parts[0] === "WebMIDI") 24 | { 25 | parts = parts.slice(1); 26 | } 27 | 28 | for (i = 0; i < parts.length; ++i) 29 | { 30 | // create a property if it does not exist 31 | if (parent[parts[i]] === undefined) 32 | { 33 | parent[parts[i]] = {}; 34 | parent = parent[parts[i]]; 35 | } 36 | } 37 | return parent; 38 | }; 39 | 40 | -------------------------------------------------------------------------------- /consoleSf2Synth/consoleSf2Synth.js: -------------------------------------------------------------------------------- 1 | /* 2 | * copyright 2015 James Ingram 3 | * https://james-ingram-act-two.de/ 4 | * 5 | * Code licensed under MIT 6 | * 7 | * WebMIDI.consoleSf2Synth contains a ConsoleSf2Synth constructor. 8 | * 9 | * This skeleton synth just logs MIDI messages to the console, but it is 10 | * intended to be easily adaptable for use by software synths that produce sound. 11 | * The object of having this code is to be able to discuss and improve the interface. 12 | */ 13 | 14 | /*jslint bitwise, white: true */ 15 | /*global WebMIDI */ 16 | 17 | WebMIDI.namespace('WebMIDI.consoleSf2Synth'); 18 | 19 | WebMIDI.consoleSf2Synth = (function() 20 | { 21 | "use strict"; 22 | 23 | var 24 | bank = 0, // CTL.BANK implementation. 25 | 26 | CMD = WebMIDI.constants.COMMAND, 27 | CTL = WebMIDI.constants.CONTROL, 28 | 29 | commands = 30 | [ 31 | CMD.NOTE_OFF, 32 | CMD.NOTE_ON, 33 | CMD.CONTROL_CHANGE, 34 | CMD.PRESET, 35 | CMD.CHANNEL_PRESSURE, 36 | CMD.PITCHWHEEL 37 | ], 38 | controls = 39 | [ 40 | CTL.BANK, 41 | CTL.MODWHEEL, 42 | CTL.PAN, 43 | 44 | CTL.REGISTERED_PARAMETER_COARSE, // coarse parameter is coarse pitchWheelDeviation (=semitones) 45 | CTL.DATA_ENTRY_COARSE, // default coarse pitchWheelDeviation is 2 semitones 46 | 47 | CTL.ALL_CONTROLLERS_OFF, 48 | CTL.ALL_NOTES_OFF 49 | ], 50 | 51 | ConsoleSf2Synth = function() 52 | { 53 | if(!(this instanceof ConsoleSf2Synth)) 54 | { 55 | return new ConsoleSf2Synth(); 56 | } 57 | 58 | /** WebMIDIAPI §10 -- MIDIPort interface **/ 59 | Object.defineProperty(this, "id", { value: "ConsoleSf2Synth_v1", writable: false }); 60 | Object.defineProperty(this, "manufacturer", { value: "james ingram", writable: false }); 61 | Object.defineProperty(this, "name", { value: "ConsoleSf2Synth", writable: false }); 62 | Object.defineProperty(this, "type", { value: "output", writable: false }); 63 | Object.defineProperty(this, "version", { value: "1", writable: false }); 64 | Object.defineProperty(this, "ondisconnect", { value: null, writable: false }); // Do we need this at all? Is it correct to set it to null? 65 | 66 | /*** Is this necessary? See https://github.com/WebAudio/web-midi-api/issues/110 ***/ 67 | Object.defineProperty(this, "removable", { value: true, writable: false }); 68 | 69 | /*** Extensions for software synths ***/ 70 | Object.defineProperty(this, "url", { value: "https://github.com/notator/WebMIDISynthHost", writable: false }); // The synth author's webpage hosting the synth. 71 | Object.defineProperty(this, "commands", { value: commands, writable: false }); // The commands supported by this synth (see above). 72 | Object.defineProperty(this, "controls", { value: controls, writable: false }); // The controls supported by this synth (see above). 73 | Object.defineProperty(this, "isMultiChannel", { value: true, writable: false }); // If isMultiChannel is false, the synth ignores the channel nibble in MIDI messages 74 | Object.defineProperty(this, "isPolyphonic", { value: true, writable: false }); // If isPolyphonic is false, the synth can only play one note at a time 75 | Object.defineProperty(this, "supportsGeneralMIDI", { value: true, writable: false }); // see comment in residentSf2Synth.js. 76 | }, 77 | 78 | API = 79 | { 80 | ConsoleSf2Synth: ConsoleSf2Synth // constructor 81 | }; 82 | // end var 83 | 84 | // WebMIDIAPI §4.6 -- MIDIPort interface 85 | // See https://github.com/notator/WebMIDISynthHost/issues/24 86 | ConsoleSf2Synth.prototype.open = function() 87 | { 88 | console.log("consoleSf2Synth opened."); 89 | }; 90 | 91 | // WebMIDIAPI §4.6 -- MIDIPort interface 92 | // See https://github.com/notator/WebMIDISynthHost/issues/24 93 | ConsoleSf2Synth.prototype.close = function() 94 | { 95 | console.log("consoleSf2Synth closed."); 96 | }; 97 | 98 | // This synth does not support timestamps 99 | ConsoleSf2Synth.prototype.send = function(message, ignoredTimestamp) 100 | { 101 | var 102 | command = message[0] & 0xF0, 103 | channel = message[0] & 0xF, 104 | data1 = message[1], 105 | data2 = message[2]; 106 | 107 | function checkCommandExport(command) 108 | { 109 | if(command === undefined) 110 | { 111 | console.warn("Illegal command"); 112 | } 113 | else 114 | { 115 | let cmd = commands.find(cmd => cmd === command); 116 | if(cmd === undefined) 117 | { 118 | console.warn("Command " + command.toString(10) + " (0x" + command.toString(16) + ") is not supported."); 119 | } 120 | } 121 | } 122 | function handleNoteOff(channel, data1, data2) 123 | { 124 | console.log("consoleSf2Synth NoteOff: channel:" + channel + " note:" + data1 + " velocity:" + data2); 125 | } 126 | function handleNoteOn(channel, data1, data2) 127 | { 128 | console.log("consoleSf2Synth NoteOn: channel:" + channel + " note:" + data1 + " velocity:" + data2); 129 | } 130 | 131 | function handleControl(channel, data1, data2) 132 | { 133 | function checkControlExport(control) 134 | { 135 | if(control === undefined) 136 | { 137 | console.warn("Illegal control"); 138 | } 139 | else 140 | { 141 | let ctl = controls.find(ctl => ctl === control); 142 | if(ctl === undefined) 143 | { 144 | console.warn("Controller " + control.toString(10) + " (0x" + control.toString(16) + ") is not supported."); 145 | } 146 | } 147 | } 148 | function setBank(channel, value) 149 | { 150 | bank = value; // this is the complete implementation! 151 | console.log("consoleSf2Synth Bank: channel:" + channel.toString(10) + " value:" + value.toString(10)); 152 | } 153 | function setModWheel(channel, value) 154 | { 155 | console.log("consoleSf2Synth ModWheel: channel:" + channel.toString(10) + " value:" + value.toString(10)); 156 | } 157 | 158 | function setPan(channel, value) 159 | { 160 | console.log("consoleSf2Synth Pan: channel:" + channel.toString(10) + " value:" + value.toString(10)); 161 | } 162 | function setAllControllersOff(channel) 163 | { 164 | console.log("consoleSf2Synth AllControllersOff: channel:" + channel.toString(10)); 165 | } 166 | function setAllNotesOff(channel) 167 | { 168 | console.log("consoleSf2Synth AllNotesOff: channel:" + channel.toString(10)); 169 | } 170 | function setRegisteredParameterCoarse(channel, value) 171 | { 172 | console.log("consoleSf2Synth RegisteredParameterCoarse: channel:" + channel.toString(10) + " value:" + value.toString(10)); 173 | } 174 | function setDataEntryCoarse(channel, value) 175 | { 176 | console.log("consoleSf2Synth DataEntryCoarse: channel:" + channel.toString(10) + " value:" + value.toString(10)); 177 | } 178 | // If the controller is not present in the controllers info array, it is ignored here 179 | switch(data1) 180 | { 181 | case CTL.BANK: 182 | checkControlExport(CTL.BANK); 183 | setBank(channel, data2); 184 | break; 185 | case CTL.MODWHEEL: 186 | checkControlExport(CTL.MODWHEEL); 187 | setModWheel(channel, data2); 188 | break; 189 | case CTL.PAN: 190 | checkControlExport(CTL.PAN); 191 | setPan(channel, data2); 192 | break; 193 | case CTL.ALL_CONTROLLERS_OFF: 194 | checkControlExport(CTL.ALL_CONTROLLERS_OFF); 195 | setAllControllersOff(channel); 196 | break; 197 | case CTL.ALL_NOTES_OFF: 198 | checkControlExport(CTL.ALL_NOTES_OFF); 199 | setAllNotesOff(channel); 200 | break; 201 | case CTL.REGISTERED_PARAMETER_COARSE: // coarse parameter is coarse pitchWheelDeviation (=semitones) 202 | checkControlExport(CTL.REGISTERED_PARAMETER_COARSE); 203 | setRegisteredParameterCoarse(channel, data2); 204 | break; 205 | case CTL.DATA_ENTRY_COARSE: // default coarse pitchWheelDeviation is 2 semitones 206 | checkControlExport(CTL.DATA_ENTRY_COARSE); 207 | setDataEntryCoarse(channel, data2); 208 | break; 209 | 210 | default: 211 | console.warn("Controller " + data1.toString(10) + " (0x" + data1.toString(16) + ") is not defined."); 212 | } 213 | } 214 | function handlePresetChange(channel, data1) 215 | { 216 | console.log("consoleSf2Synth Preset: channel:" + channel + " value:" + data1); 217 | } 218 | // CHANNEL_PRESSURE.data[1] is the amount of pressure 0..127. 219 | function handleChannelPressure(channel, data1) 220 | { 221 | console.log("consoleSf2Synth ChannelPressure: channel:" + channel + " value:" + data1); 222 | } 223 | function handlePitchWheel(channel, data1) 224 | { 225 | console.log("consoleSf2Synth PitchWheel: channel:" + channel + " value:" + data1); 226 | } 227 | 228 | switch(command) 229 | { 230 | case CMD.NOTE_OFF: 231 | checkCommandExport(CMD.NOTE_OFF); 232 | handleNoteOff(channel, data1, data2); 233 | break; 234 | case CMD.NOTE_ON: 235 | checkCommandExport(CMD.NOTE_ON); 236 | handleNoteOn(channel, data1, data2); 237 | break; 238 | case CMD.CONTROL_CHANGE: 239 | checkCommandExport(CMD.CONTROL_CHANGE); 240 | handleControl(channel, data1, data2); 241 | break; 242 | case CMD.PRESET: 243 | checkCommandExport(CMD.PRESET); 244 | handlePresetChange(channel, data1); 245 | break; 246 | case CMD.CHANNEL_PRESSURE: 247 | checkCommandExport(CMD.CHANNEL_PRESSURE); 248 | // CHANNEL_PRESSURE.data[1] is the amount of pressure 0..127. 249 | handleChannelPressure(channel, data1); 250 | break; 251 | case CMD.PITCHWHEEL: 252 | checkCommandExport(CMD.PITCHWHEEL); 253 | handlePitchWheel(channel, data1); 254 | break; 255 | 256 | default: 257 | console.warn("Error: Command "+ command.toString(10) + " (0x" + command.toString(16) + ") is not defined."); 258 | } 259 | }; 260 | 261 | ConsoleSf2Synth.prototype.setSoundFont = function(soundFont) 262 | { 263 | console.log("consoleSf2Synth soundFont set."); 264 | }; 265 | 266 | return API; 267 | 268 | }(document)); 269 | -------------------------------------------------------------------------------- /cwMIDISynth/cwConstants.js: -------------------------------------------------------------------------------- 1 | /* 2 | * copyright 2015 James Ingram 3 | * 4 | * Code licensed under MIT 5 | * 6 | * The WebMIDI.cwConstants namespace which defines read-only MIDI constants for Chris Wilson's cwMIDISynth. 7 | */ 8 | 9 | /*jslint white */ 10 | /*global WebMIDI */ 11 | 12 | WebMIDI.namespace('WebMIDI.cwConstants'); 13 | 14 | WebMIDI.cwConstants = (function() 15 | { 16 | "use strict"; 17 | var 18 | ALL_CONTROLLERS_OFF = WebMIDI.constants.CONTROL.ALL_CONTROLLERS_OFF, 19 | WAVEFORM = {}, 20 | OSC1_OCTAVE = {}, 21 | OSC2_OCTAVE = {}, 22 | CW_CCINDEX = {}, 23 | CW_DEFAULT = {}, 24 | CW_NITEMS = {}, 25 | 26 | API = 27 | { 28 | CW_CCINDEX: CW_CCINDEX, 29 | CW_DEFAULT: CW_DEFAULT, 30 | CW_NITEMS: CW_NITEMS 31 | }; 32 | 33 | // WAVEFORM 34 | // The values are the indices of options in the in the WAVEFORM select controls. 35 | Object.defineProperty(WAVEFORM, "SINE", { value: 0, writable: false }); 36 | Object.defineProperty(WAVEFORM, "SQUARE", { value: 1, writable: false }); 37 | Object.defineProperty(WAVEFORM, "SAW", { value: 2, writable: false }); 38 | Object.defineProperty(WAVEFORM, "TRIANGLE", { value: 3, writable: false }); 39 | 40 | // OSC1_OCTAVE 41 | // The values are the indices of options in the in the OSC1_OCTAVE select control. 42 | Object.defineProperty(OSC1_OCTAVE, "F32", { value: 0, writable: false }); 43 | Object.defineProperty(OSC1_OCTAVE, "F16", { value: 1, writable: false }); 44 | Object.defineProperty(OSC1_OCTAVE, "F8", { value: 2, writable: false }); 45 | 46 | // OSC2_OCTAVE 47 | // The values are the indices of options in the in the OSC2_OCTAVE select control. 48 | Object.defineProperty(OSC2_OCTAVE, "F16", { value: 0, writable: false }); 49 | Object.defineProperty(OSC2_OCTAVE, "F8", { value: 1, writable: false }); 50 | Object.defineProperty(OSC2_OCTAVE, "F4", { value: 2, writable: false }); 51 | 52 | /****************************************************************************************************************/ 53 | // CW_CCINDEX 54 | // These values are unique MIDI controller indices in the range 0..127. 55 | // Controls should be used with their original meaning where possible. 56 | 57 | Object.defineProperty(CW_CCINDEX, "RESET", { value: ALL_CONTROLLERS_OFF, writable: false }); 58 | 59 | Object.defineProperty(CW_CCINDEX, "MASTER_DRIVE", { value: 5, writable: false }); 60 | Object.defineProperty(CW_CCINDEX, "MASTER_REVERB", { value: 6, writable: false }); 61 | Object.defineProperty(CW_CCINDEX, "MASTER_VOLUME", { value: 91, writable: false }); 62 | 63 | Object.defineProperty(CW_CCINDEX, "MOD_WAVEFORM", { value: 9, writable: false }); 64 | Object.defineProperty(CW_CCINDEX, "MOD_FREQ", { value: 4, writable: false }); 65 | Object.defineProperty(CW_CCINDEX, "MOD_OSC1_TREMOLO", { value: 74, writable: false }); 66 | Object.defineProperty(CW_CCINDEX, "MOD_OSC2_TREMOLO", { value: 71, writable: false }); 67 | 68 | Object.defineProperty(CW_CCINDEX, "OSC1_WAVEFORM", { value: 20, writable: false }); 69 | Object.defineProperty(CW_CCINDEX, "OSC1_OCTAVE", { value: 21, writable: false }); 70 | Object.defineProperty(CW_CCINDEX, "OSC1_DETUNE", { value: 22, writable: false }); 71 | Object.defineProperty(CW_CCINDEX, "OSC1_MIX", { value: 23, writable: false }); 72 | 73 | Object.defineProperty(CW_CCINDEX, "OSC2_WAVEFORM", { value: 24, writable: false }); 74 | Object.defineProperty(CW_CCINDEX, "OSC2_OCTAVE", { value: 25, writable: false }); 75 | Object.defineProperty(CW_CCINDEX, "OSC2_DETUNE", { value: 26, writable: false }); 76 | Object.defineProperty(CW_CCINDEX, "OSC2_MIX", { value: 27, writable: false }); 77 | 78 | Object.defineProperty(CW_CCINDEX, "FILTER_CUTOFF", { value: 2, writable: false }); 79 | Object.defineProperty(CW_CCINDEX, "FILTER_Q", { value: 7, writable: false }); 80 | Object.defineProperty(CW_CCINDEX, "FILTER_MOD", { value: 1, writable: false }); 81 | Object.defineProperty(CW_CCINDEX, "FILTER_ENV", { value: 3, writable: false }); 82 | 83 | Object.defineProperty(CW_CCINDEX, "FILTERENV_ATTACK", { value: 28, writable: false }); 84 | Object.defineProperty(CW_CCINDEX, "FILTERENV_DECAY", { value: 29, writable: false }); 85 | Object.defineProperty(CW_CCINDEX, "FILTERENV_SUSTAIN", { value: 30, writable: false }); 86 | Object.defineProperty(CW_CCINDEX, "FILTERENV_RELEASE", { value: 31, writable: false }); 87 | 88 | Object.defineProperty(CW_CCINDEX, "VOLUMEENV_ATTACK", { value: 46, writable: false }); 89 | Object.defineProperty(CW_CCINDEX, "VOLUMEENV_DECAY", { value: 47, writable: false }); 90 | Object.defineProperty(CW_CCINDEX, "VOLUMEENV_SUSTAIN", { value: 48, writable: false }); 91 | Object.defineProperty(CW_CCINDEX, "VOLUMEENV_RELEASE", { value: 49, writable: false }); 92 | 93 | Object.defineProperty(CW_CCINDEX, "MULTIPLY_MOD_FREQ_BY_2_BUTTON", { value: 80, writable: false }); 94 | Object.defineProperty(CW_CCINDEX, "MULTIPLY_MOD_FREQ_BY_4_BUTTON", { value: 81, writable: false }); 95 | 96 | /****************************************************************************************************************/ 97 | // CW_DEFAULT 98 | // These values are all integral MIDI controller values in the range 0..127. // The "initial patch" 99 | Object.defineProperty(CW_DEFAULT, "MASTER_DRIVE", { value: 48, writable: false }); // currentDrive = 38; [0..100] 100 | Object.defineProperty(CW_DEFAULT, "MASTER_REVERB", { value: 41, writable: false }); // currentRev = 32; [0..100] 101 | Object.defineProperty(CW_DEFAULT, "MASTER_VOLUME", { value: 95, writable: false }); // currentVol = 75; [0..100] 102 | 103 | Object.defineProperty(CW_DEFAULT, "MOD_WAVEFORM", { value: WAVEFORM.SINE, writable: false }); // currentModWaveform = 0; [select4] // SINE 104 | Object.defineProperty(CW_DEFAULT, "MOD_FREQ", { value: 27, writable: false }); // currentModFrequency = 2.1; [0..10] // Hz * 10 = 2.1 105 | Object.defineProperty(CW_DEFAULT, "MOD_OSC1_TREMOLO", { value: 19, writable: false }); // currentModOsc1 = 15; [0..100] 106 | Object.defineProperty(CW_DEFAULT, "MOD_OSC2_TREMOLO", { value: 22, writable: false }); // currentModOsc2 = 17; [0..100] 107 | 108 | Object.defineProperty(CW_DEFAULT, "OSC1_WAVEFORM", { value: WAVEFORM.SAW, writable: false });// currentOsc1Waveform = 2;[select4] // SAW 109 | Object.defineProperty(CW_DEFAULT, "OSC1_OCTAVE", { value: OSC1_OCTAVE.F32, writable: false });// currentOsc1Octave = 0; [select3] // 32' 110 | Object.defineProperty(CW_DEFAULT, "OSC1_DETUNE", { value: 64, writable: false }); // currentOsc1Detune = 0; [-1200..1200] // 0 111 | Object.defineProperty(CW_DEFAULT, "OSC1_MIX", { value: 64, writable: false }); // currentOsc1Mix = 50.0; [0..100] // 50% 112 | 113 | Object.defineProperty(CW_DEFAULT, "OSC2_WAVEFORM", { value: WAVEFORM.SAW, writable: false });// currentOsc2Waveform = 2;[select4] // SAW 114 | Object.defineProperty(CW_DEFAULT, "OSC2_OCTAVE", { value: OSC2_OCTAVE.F16, writable: false });// currentOsc2Octave = 0; [select3] // 16' 115 | Object.defineProperty(CW_DEFAULT, "OSC2_DETUNE", { value: 62, writable: false }); // currentOsc2Detune = -25; [-1200..1200] // fat detune makes pretty analogue-y sound. :) 116 | Object.defineProperty(CW_DEFAULT, "OSC2_MIX", { value: 64, writable: false }); // currentOsc2Mix = 50.0; [0..100] // 0% 117 | 118 | Object.defineProperty(CW_DEFAULT, "FILTER_CUTOFF", { value: 10, writable: false }); // currentFilterCutoff = 8; [20..20000] : ji ((10/127) * 100) is ca. 8 119 | Object.defineProperty(CW_DEFAULT, "FILTER_Q", { value: 44, writable: false }); // currentFilterQ = 7.0; [0..20] 120 | Object.defineProperty(CW_DEFAULT, "FILTER_MOD", { value: 27, writable: false }); // currentFilterMod = 21; [0..100] 121 | Object.defineProperty(CW_DEFAULT, "FILTER_ENV", { value: 71, writable: false }); // currentFilterEnv = 56; [0..100] 122 | 123 | Object.defineProperty(CW_DEFAULT, "FILTERENV_ATTACK", { value: 6, writable: false }); // currentFilterEnvA = 5; [0..100] 124 | Object.defineProperty(CW_DEFAULT, "FILTERENV_DECAY", { value: 8, writable: false }); // currentFilterEnvD = 6; [0..100] 125 | Object.defineProperty(CW_DEFAULT, "FILTERENV_SUSTAIN", { value: 6, writable: false }); // currentFilterEnvS = 5; [0..100] 126 | Object.defineProperty(CW_DEFAULT, "FILTERENV_RELEASE", { value: 9, writable: false }); // currentFilterEnvR = 7; [0..100] 127 | 128 | Object.defineProperty(CW_DEFAULT, "VOLUMEENV_ATTACK", { value: 3, writable: false }); // currentEnvA = 2; [0..100] 129 | Object.defineProperty(CW_DEFAULT, "VOLUMEENV_DECAY", { value: 19, writable: false }); // currentEnvD = 15; [0..100] 130 | Object.defineProperty(CW_DEFAULT, "VOLUMEENV_SUSTAIN", { value: 86, writable: false }); // currentEnvS = 68; [0..100] 131 | Object.defineProperty(CW_DEFAULT, "VOLUMEENV_RELEASE", { value: 6, writable: false }); // currentEnvR = 5; [0..100] 132 | 133 | Object.defineProperty(CW_DEFAULT, "MULTIPLY_MOD_FREQ_BY_2_BUTTON", { value: 0, writable: false }); 134 | Object.defineProperty(CW_DEFAULT, "MULTIPLY_MOD_FREQ_BY_4_BUTTON", { value: 0, writable: false }); 135 | 136 | /****************************************************************************************************************/ 137 | // CW_NITEMS 138 | // These values are only defined for controllers (like switches or popup menus) that have a fixed number of values. 139 | // When controlled by a CC, an index (like a select.selectedIndex) is calculated by dividing the range 0..127 into parts 140 | // of nearly equal size, each correponding to a particular index. 141 | // For example: 142 | // if nItems is 2, values 0..63 -> index 0, values 64..127 -> index 1. 143 | // if nItems is 3, values 0..42 -> index 0, values 43..85 -> index 1, values 86..127 -> index 2. 144 | // if nItems is 4, values 0..31 -> index 0, values 32..63 -> index 1, values 64..95 -> index 2, values 96..127 -> index 3. 145 | Object.defineProperty(CW_NITEMS, "MOD_WAVEFORM", { value: 4, writable: false }); 146 | Object.defineProperty(CW_NITEMS, "OSC1_WAVEFORM", { value: 4, writable: false }); 147 | Object.defineProperty(CW_NITEMS, "OSC1_OCTAVE", { value: 3, writable: false }); 148 | Object.defineProperty(CW_NITEMS, "OSC2_WAVEFORM", { value: 4, writable: false }); 149 | Object.defineProperty(CW_NITEMS, "OSC2_OCTAVE", { value: 3, writable: false }); 150 | Object.defineProperty(CW_NITEMS, "MULTIPLY_MOD_FREQ_BY_2_BUTTON", { value: 2, writable: false }); 151 | Object.defineProperty(CW_NITEMS, "MULTIPLY_MOD_FREQ_BY_4_BUTTON", { value: 2, writable: false }); 152 | 153 | return API; 154 | 155 | } ()); 156 | 157 | 158 | -------------------------------------------------------------------------------- /cwMIDISynth/sounds/irHall.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notator/WebMIDISynthHost/eafcdbc4b4c36a3a12cc1be0cc3c724214fb8dce/cwMIDISynth/sounds/irHall.ogg -------------------------------------------------------------------------------- /cwMIDISynth/sounds/irRoom.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notator/WebMIDISynthHost/eafcdbc4b4c36a3a12cc1be0cc3c724214fb8dce/cwMIDISynth/sounds/irRoom.wav -------------------------------------------------------------------------------- /cwMIDISynth/waveShaper.js: -------------------------------------------------------------------------------- 1 |  2 | // Copyright 2011, Google Inc. 3 | // All rights reserved. 4 | // 5 | // Redistribution and use in source and binary forms, with or without 6 | // modification, are permitted provided that the following conditions are 7 | // met: 8 | // 9 | // * Redistributions of source code must retain the above copyright 10 | // notice, this list of conditions and the following disclaimer. 11 | // * Redistributions in binary form must reproduce the above 12 | // copyright notice, this list of conditions and the following disclaimer 13 | // in the documentation and/or other materials provided with the 14 | // distribution. 15 | // * Neither the name of Google Inc. nor the names of its 16 | // contributors may be used to endorse or promote products derived from 17 | // this software without specific prior written permission. 18 | // 19 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | 31 | /************************************************************************/ 32 | // This file encapsulates the file 33 | // https://github.com/cwilso/midi-synth/blob/master/js/waveshaper.js 34 | // in a namespace. The original file contans the above copyright notice. 35 | // Only the WaveShaper constructor and its setDrive(drive) function are exposed. 36 | /************************************************************************/ 37 | 38 | /*jslint white */ 39 | /*global WebMIDI */ 40 | 41 | WebMIDI.namespace('WebMIDI.waveShaper'); 42 | 43 | WebMIDI.waveShaper = (function() 44 | { 45 | "use strict"; 46 | 47 | var threshold = -27, // dB 48 | headroom = 21, // dB 49 | 50 | e4 = function(x, k) 51 | { 52 | return 1.0 - Math.exp(-k * x); 53 | }, 54 | 55 | dBToLinear = function(db) { 56 | return Math.pow(10.0, 0.05 * db); 57 | }, 58 | 59 | shape = function(x) { 60 | var 61 | linearThreshold = dBToLinear(threshold), 62 | linearHeadroom = dBToLinear(headroom), 63 | maximum = 1.05 * linearHeadroom * linearThreshold, 64 | kk = (maximum - linearThreshold), 65 | sign = x < 0 ? -1 : +1, 66 | absx = Math.abs(x), 67 | shapedInput = absx < linearThreshold ? absx : linearThreshold + kk * e4(absx - linearThreshold, 1.0 / kk); 68 | 69 | shapedInput *= sign; 70 | 71 | return shapedInput; 72 | }, 73 | 74 | generateColortouchCurve = function(curve) { 75 | var i, x, 76 | n = 65536, 77 | n2 = n / 2; 78 | 79 | for (i = 0; i < n2; ++i) { 80 | x = i / n2; 81 | x = shape(x); 82 | 83 | curve[n2 + i] = x; 84 | curve[n2 - i - 1] = -x; 85 | } 86 | 87 | return curve; 88 | }, 89 | 90 | generateMirrorCurve = function(curve) { 91 | var i, x, 92 | n = 65536, 93 | n2 = n / 2; 94 | 95 | for (i = 0; i < n2; ++i) { 96 | x = i / n2; 97 | x = shape(x); 98 | 99 | curve[n2 + i] = x; 100 | curve[n2 - i - 1] = x; 101 | } 102 | 103 | return curve; 104 | }, 105 | 106 | createShaperCurve = function () { 107 | var i, driveShaper = new Float32Array( 4096 ); 108 | 109 | for (i=0; i<1024; i++) { 110 | // "bottom" half of response curve is flat 111 | driveShaper[2048+i] = driveShaper[2047-i] = i/2048; 112 | // "top" half of response curve is log 113 | driveShaper[3072+i] = driveShaper[1023-i] = Math.sqrt((i+1024)/1024)/2; 114 | } 115 | return driveShaper; 116 | }, 117 | 118 | WaveShaper = function(context) 119 | { 120 | if(!(this instanceof WaveShaper)) 121 | { 122 | return new WaveShaper(context); 123 | } 124 | 125 | var waveshaper, preGain, postGain, curve; 126 | 127 | this.context = context; 128 | waveshaper = context.createWaveShaper(); 129 | preGain = context.createGain(); 130 | postGain = context.createGain(); 131 | preGain.connect(waveshaper); 132 | waveshaper.connect(postGain); 133 | this.input = preGain; 134 | this.output = postGain; 135 | this.waveshaper = waveshaper; 136 | 137 | curve = new Float32Array(65536); // FIXME: share across instances 138 | generateColortouchCurve(curve); 139 | waveshaper.curve = curve; 140 | // waveshaper.curve = createShaperCurve(); 141 | }, 142 | 143 | API = 144 | { 145 | WaveShaper: WaveShaper // constructor 146 | }; 147 | // end var 148 | 149 | WaveShaper.prototype.setDrive = function(drive) 150 | { 151 | this.input.gain.value = drive; 152 | var postDrive = Math.pow(1 / drive, 0.6); 153 | this.output.gain.value = postDrive; 154 | }; 155 | 156 | return API; 157 | 158 | }()); 159 | -------------------------------------------------------------------------------- /cwMonoSynth/cwMonoSynth.js: -------------------------------------------------------------------------------- 1 | /* 2 | * copyright 2015 Chris Wilson, James Ingram 3 | * https://github.com/cwilso 4 | * https://james-ingram-act-two.de/ 5 | * 6 | * Code licensed under MIT 7 | * 8 | * WebMIDI.cwMonosynth contains a CWMonosynth constructor. 9 | * 10 | * This encapsulates Chris Wilson's monosynth synthesizer from 11 | * https://github.com/cwilso/monosynth 12 | * making it usable on the web without having any attached MIDI hardware. 13 | */ 14 | 15 | /*jslint bitwise, white */ 16 | /*global WebMIDI, window */ 17 | 18 | WebMIDI.namespace('WebMIDI.cwMonosynth'); 19 | 20 | WebMIDI.cwMonosynth = (function() 21 | { 22 | "use strict"; 23 | 24 | var 25 | CMD = WebMIDI.constants.COMMAND, 26 | 27 | // cwMonosynth (private) 28 | context=null, // the Web Audio "context" object 29 | //midiAccess=null, // the MIDIAccess object. 30 | oscillator=null, // the single oscillator 31 | envelope=null, // the envelope for the single oscillator 32 | attack=0.05, // attack speed 33 | release=0.05, // release speed 34 | portamento=0.05, // portamento/glide speed 35 | activeNotes = [], // the stack of actively-pressed keys 36 | frequencyFromNoteNumber = function(note) 37 | { 38 | return 440 * Math.pow(2, (note - 69) / 12); 39 | }, 40 | 41 | // for host 42 | commands = 43 | [ 44 | CMD.NOTE_OFF, 45 | CMD.NOTE_ON 46 | ], 47 | controls = 48 | [ 49 | ], 50 | 51 | CWMonosynth = function() 52 | { 53 | if(!(this instanceof CWMonosynth)) 54 | { 55 | return new CWMonosynth(); 56 | } 57 | 58 | /** WebMIDIAPI §10 -- MIDIPort interface **/ 59 | Object.defineProperty(this, "id", { value: "CW_MonoSynth_v1", writable: false }); 60 | Object.defineProperty(this, "manufacturer", { value: "chris wilson & james ingram", writable: false }); 61 | Object.defineProperty(this, "name", { value: "CW_MonoSynth", writable: false }); 62 | Object.defineProperty(this, "type", { value: "output", writable: false }); 63 | Object.defineProperty(this, "version", { value: "1", writable: false }); 64 | Object.defineProperty(this, "ondisconnect", { value: null, writable: false }); // Do we need this at all? Is it correct to set it to null? 65 | 66 | /*** Is this necessary? See https://github.com/WebAudio/web-midi-api/issues/110 ***/ 67 | Object.defineProperty(this, "removable", { value: true, writable: false }); 68 | 69 | /*** Extensions for software synths ***/ 70 | Object.defineProperty(this, "url", { value: "http://webaudiodemos.appspot.com/monosynth/", writable: false }); // The synth author's webpage hosting the synth. 71 | Object.defineProperty(this, "commands", { value: commands, writable: false }); // The commands supported by this synth (see above). 72 | Object.defineProperty(this, "controls", { value: controls, writable: false }); // The controls supported by this synth (see above). 73 | Object.defineProperty(this, "isMultiChannel", { value: false, writable: false }); // If isMultiChannel is false, the synth ignores the channel nibble in MIDI messages 74 | Object.defineProperty(this, "isPolyphonic", { value: false, writable: false }); // If isPolyphonic is false, the synth can only play one note at a time 75 | }, 76 | 77 | API = 78 | { 79 | CWMonosynth: CWMonosynth // constructor 80 | }; 81 | // end var 82 | 83 | // WebMIDIAPI §4.6 -- MIDIPort interface 84 | // See https://github.com/notator/WebMIDISynthHost/issues/24 85 | CWMonosynth.prototype.open = function() 86 | { 87 | window.AudioContext = window.AudioContext || window.webkitAudioContext; 88 | 89 | context = new window.AudioContext(); 90 | 91 | // set up the basic oscillator chain, muted to begin with. 92 | oscillator = context.createOscillator(); 93 | oscillator.frequency.setValueAtTime(110, 0); 94 | envelope = context.createGain(); 95 | oscillator.connect(envelope); 96 | envelope.connect(context.destination); 97 | envelope.gain.value = 0.0; // Mute the sound 98 | oscillator.start(0); // Go ahead and start up the oscillator 99 | console.log("cwMonosynth opened."); 100 | }; 101 | 102 | // WebMIDIAPI §4.6 -- MIDIPort interface 103 | // See https://github.com/notator/WebMIDISynthHost/issues/24 104 | CWMonosynth.prototype.close = function() 105 | { 106 | console.log("cwMonosynth closed."); 107 | }; 108 | 109 | // WebMIDIAPI MIDIOutput send() 110 | // This synth does not support timestamps. 111 | // It also ignores both channel info and velocity. 112 | CWMonosynth.prototype.send = function(message, ignoredTimestamp) 113 | { 114 | var 115 | command = message[0] & 0xF0, 116 | channel = message[0] & 0xF, 117 | data1 = message[1], 118 | data2 = message[2], 119 | that = this; 120 | 121 | function checkCommandExport(command) 122 | { 123 | var index = commands.indexOf(command); 124 | if(index < 0) 125 | { 126 | console.warn("Command " + command.toString(10) + " (0x" + command.toString(16) + ") is not being exported."); 127 | } 128 | } 129 | function handleNoteOff(channel, data1, data2) 130 | { 131 | checkCommandExport(CMD.NOTE_OFF); 132 | that.noteOff(data1); 133 | console.log("cwMonosynth NoteOff: channel:" + channel + " note:" + data1 + " velocity:" + data2 + " (This synth ignores channel and velocity info.)"); 134 | } 135 | function handleNoteOn(channel, data1, data2) 136 | { 137 | checkCommandExport(CMD.NOTE_ON); 138 | that.noteOn(data1); 139 | console.log("cwMonosynth NoteOn: channel:" + channel + " note:" + data1 + " velocity:" + data2 + " (This synth ignores channel and velocity info.)"); 140 | } 141 | 142 | switch(command) 143 | { 144 | case CMD.NOTE_OFF: 145 | checkCommandExport(CMD.NOTE_OFF); 146 | handleNoteOff(channel, data1, data2); 147 | break; 148 | case CMD.NOTE_ON: 149 | checkCommandExport(CMD.NOTE_ON); 150 | handleNoteOn(channel, data1, data2); 151 | break; 152 | case CMD.CONTROL_CHANGE: 153 | console.log("cwMonosynth: this synth has no controls!"); 154 | break; 155 | default: 156 | console.warn("Command " + command.toString(10) + " (0x" + command.toString(16) + ") is not defined."); 157 | } 158 | }; 159 | 160 | CWMonosynth.prototype.noteOn = function(noteNumber) 161 | { 162 | activeNotes.push(noteNumber); 163 | oscillator.frequency.cancelScheduledValues(0); 164 | oscillator.frequency.setTargetAtTime(frequencyFromNoteNumber(noteNumber), 0, portamento); 165 | envelope.gain.cancelScheduledValues(0); 166 | envelope.gain.setTargetAtTime(1.0, 0, attack); 167 | }; 168 | 169 | CWMonosynth.prototype.noteOff = function(noteNumber) 170 | { 171 | var position = activeNotes.indexOf(noteNumber); 172 | if(position !== -1) 173 | { 174 | activeNotes.splice(position, 1); 175 | } 176 | if(activeNotes.length === 0) 177 | { // shut off the envelope 178 | envelope.gain.cancelScheduledValues(0); 179 | envelope.gain.setTargetAtTime(0.0, 0, release); 180 | } else 181 | { 182 | oscillator.frequency.cancelScheduledValues(0); 183 | oscillator.frequency.setTargetAtTime(frequencyFromNoteNumber(activeNotes[activeNotes.length - 1]), 0, portamento); 184 | } 185 | }; 186 | 187 | return API; 188 | 189 | }(document)); 190 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 |  2 | 4 | 5 | WebMIDISynthHost Docs 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Temporary file. 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/styleSheet.css: -------------------------------------------------------------------------------- 1 |  2 | /* links ********************************************/ 3 | a:link 4 | { 5 | color: #1010C6; 6 | } 7 | a:hover 8 | { 9 | color: #0088FF; 10 | } 11 | a:visited 12 | { 13 | color: #00AA00; 14 | } 15 | 16 | /* predefined classes (alphabetically) *************/ 17 | 18 | body 19 | { 20 | color: #444444; /* dark grey text */ 21 | background-color: #FFFFFF; 22 | font-family: Verdana, Arial, Geneva, Sans-Serif; 23 | font-size: 12px; 24 | line-height: 20px; 25 | margin: 30px; 26 | } 27 | 28 | .archive 29 | { 30 | background-image: url("https://james-ingram-act-two.de/moritz/images/archiveBackground.png"); 31 | } 32 | 33 | 34 | .body_oldPage /* body: used for pages which were in website 2005 */ 35 | { 36 | color: #202020; /* dark grey text */ 37 | background-color: #F8F8F8; 38 | } 39 | 40 | .note /* div: a note in a blue frame */ 41 | { 42 | font-size: 8.25pt; 43 | line-height: 150%; 44 | padding: 10px 20px 10px 20px; 45 | border: 1px solid #1010C6 46 | } 47 | 48 | .redNote /* div: a note in a red frame */ { 49 | font-size: 8.25pt; 50 | line-height: 150%; 51 | padding: 10px 20px 10px 20px; 52 | border: 1px solid #FF0000; 53 | margin: 20px 20px 20px 20px; 54 | } 55 | 56 | .hr_sectionDivider /* hr: should be used with the attribute noshade="noshade" */ 57 | { 58 | border-style: none; 59 | height: 4px; 60 | background-color: #1010C6; 61 | } 62 | .hrHeight1 /* hr: should be used with the attribute noshade="noshade" */ { 63 | border-style: none; 64 | height: 1px; 65 | background-color: #1010C6; 66 | } 67 | 68 | .hrHeight2 /* hr: should be used with the attribute noshade="noshade" */ { 69 | border-style: none; 70 | height: 2px; 71 | background-color: #1010C6; 72 | } 73 | 74 | .hrHeight3 /* hr: should be used with the attribute noshade="noshade" */ { 75 | border-style: none; 76 | height: 3px; 77 | background-color: #1010C6; 78 | } 79 | 80 | .olSmall /* ol */ 81 | { 82 | margin-top: 0; 83 | margin-bottom:0; 84 | font-size: 10px; 85 | line-height: 15px; 86 | } 87 | 88 | .olStandard /* ol */ { 89 | margin-top: 0; 90 | margin-bottom: 0; 91 | } 92 | 93 | .header1 /* p: used instead of h1 (which does what it likes with heights)*/ 94 | { 95 | font-family: Lucida Sans Unicode, Verdana, Arial, Geneva, Sans-Serif; 96 | font-size: 18px; 97 | font-weight: normal; 98 | margin-top:14px; 99 | margin-bottom:14px 100 | } 101 | 102 | .header2 /* p: used instead of h2 (which does what it likes with heights)*/ 103 | { 104 | font-family: Lucida Sans Unicode, Verdana, Arial, Geneva, Sans-Serif; 105 | font-size: 16px; 106 | font-weight: normal; 107 | margin-top:14px; 108 | margin-bottom:14px 109 | } 110 | 111 | .header3 /* p: used instead of h3 (which does what it likes with heights)*/ { 112 | font-family: Lucida Sans Unicode, Verdana, Arial, Geneva, Sans-Serif; 113 | font-size: 14px; 114 | font-weight: normal; 115 | margin-top: 14px; 116 | margin-bottom: 14px 117 | } 118 | 119 | .boldHeader1 /* p: used for the usual titles of subsections in an article. See e.g. stockhausenSoftware.htm */ { 120 | font-family: Verdana, Arial, Geneva, Sans-Serif; 121 | font-size: 13px; 122 | font-weight: bold; 123 | margin-top: 16px; 124 | margin-bottom: 10px 125 | } 126 | .boldHeader2 /* p: used for the usual subtitles of subsections in an article. See e.g. stockhausenSoftware.htm */ { 127 | font-family: Verdana, Arial, Geneva, Sans-Serif; 128 | font-size: 12px; 129 | font-weight: bold; 130 | margin-top: 16px; 131 | margin-bottom: 10px 132 | } 133 | 134 | .boldHeader3 /* p: used for the usual subtitles of subsections in an article. See e.g. stockhausenSoftware.htm */ { 135 | font-family: Verdana, Arial, Geneva, Sans-Serif; 136 | font-size: 11px; 137 | font-weight: bold; 138 | margin-top: 16px; 139 | margin-bottom: 10px 140 | } 141 | 142 | .pStandard /* p: a paragraph for running text containing a sequence of paragraphs -- use inside body class (12px text) */ { 143 | margin-top: 0; 144 | margin-bottom: 10px 145 | } 146 | 147 | .spanUnderline /* span */ 148 | { 149 | text-decoration: underline; 150 | } 151 | 152 | .menuItem /* span */ 153 | { 154 | background-color: #F4F4F4; 155 | padding: 1px 5px 1px 4px; 156 | border: solid; 157 | border-width: 1px; 158 | border-color: #444444; 159 | font-size: 11px; 160 | font-family: Arial, Helvetica, sans-serif; 161 | } 162 | 163 | 164 | .ulSmall /* ul */ 165 | { 166 | margin-top: 0; 167 | margin-bottom:0; 168 | font-size: 10px; 169 | line-height: 15px; 170 | } 171 | 172 | .ulStandard /* ul */ 173 | { 174 | margin-top: 0; 175 | margin-bottom: 0; 176 | } 177 | 178 | /* ji sub-classes (alphabetically) *****************/ 179 | 180 | .captionLucida /* captionLucida for music examples, diagrams, photos etc. */ 181 | { 182 | font-family: Lucida Sans Unicode, Verdana, Arial, Geneva, Sans-Serif; 183 | font-size: 9pt; 184 | line-height: 14pt; 185 | } 186 | 187 | .captionStandard /* used in stockhausenSoftware for FreeHand Xtras Examples*/ 188 | { 189 | font-size: 8.25pt; 190 | line-height: 12pt; 191 | padding: 0; 192 | margin: 0; 193 | } 194 | 195 | .clytemnestrasText /* used for all Clytemnestra's text */ 196 | { 197 | font-family: Verdana; 198 | font-size: 8pt; 199 | font-style: italic; 200 | color: #000000; 201 | } 202 | 203 | .indentA 204 | { 205 | padding: 0 0 0 15pt; 206 | line-height: 16pt; 207 | } 208 | 209 | .indent1 210 | { 211 | padding: 0 0 0 15pt; 212 | font-size: 8.25pt; 213 | line-height: 150%; 214 | margin: 0; 215 | } 216 | .indent2 217 | { 218 | padding: 0 0 0 30pt; 219 | font-size: 7.5pt; 220 | line-height: 150%; 221 | margin: 0; 222 | } 223 | .indent3 224 | { 225 | padding: 0 0 0 45pt; 226 | font-size: 7.5pt; 227 | line-height: 150%; 228 | margin: 0; 229 | } 230 | 231 | .indent1Size 232 | { 233 | font-size: 8.25pt; 234 | line-height: 150%; 235 | } 236 | 237 | .indent2Size 238 | { 239 | font-size: 7.5pt; 240 | line-height: 150%; 241 | } 242 | 243 | .indent3Size 244 | { 245 | font-size: 7.5pt; 246 | line-height: 150%; 247 | } 248 | 249 | .motto /* at the very top of a file: quotations etc */ 250 | { 251 | font-size: 7.5pt; 252 | font-family: Arial, Geneva, Verdana, Sans-Serif; 253 | } 254 | 255 | audio{ 256 | width:300px; 257 | height:20px; 258 | } 259 | 260 | .signature /* at the very bottom of each file. e.g. ji www August 2005; revised November 2008*/ 261 | { 262 | font-family: Arial, Geneva, Verdana, Sans-Serif; 263 | font-size: 7.5pt; 264 | } 265 | 266 | 267 | 268 | -------------------------------------------------------------------------------- /hostStyleSheet.css: -------------------------------------------------------------------------------- 1 |  2 | .app 3 | { 4 | font-family: Lucida Sans Unicode, Verdana, Arial, Geneva, Sans-Serif; 5 | font-size: 11px; 6 | width: 420px; 7 | margin:30px auto 0 auto; 8 | padding:25px; 9 | border:1px solid black; 10 | } 11 | 12 | .boldTitle 13 | { 14 | font-weight: bold; 15 | font-size:14px; 16 | } 17 | 18 | .boldSubtitle 19 | { 20 | font-weight: bold; 21 | } 22 | 23 | .midiMessagesTable 24 | { 25 | font-size: 11px; 26 | margin-left:auto; 27 | margin-right:auto; 28 | } 29 | 30 | .left 31 | { 32 | text-align:right; 33 | } 34 | 35 | .synthSelect 36 | { 37 | font-size: 11px; 38 | width: 300px; 39 | height: 18px; 40 | margin-left: 0; 41 | } 42 | 43 | .sf2OriginSelect { 44 | font-size: 11px; 45 | width: 160px; 46 | margin-left: 0; 47 | } 48 | 49 | .sf2Select { 50 | font-size: 11px; 51 | width: 135px; 52 | margin-left: 0; 53 | } 54 | 55 | .webAudioFontSelect 56 | { 57 | font-size: 11px; 58 | width: 275px; 59 | height: 18px; 60 | margin-left: 0; 61 | } 62 | 63 | .presetSelect 64 | { 65 | font-size: 11px; 66 | width: 270px; 67 | height: 18px; 68 | margin-left: 0; 69 | } 70 | 71 | .valueSelector 72 | { 73 | font-size: 11px; 74 | width: 45px; 75 | margin-left: 0; 76 | margin-right: 4px; 77 | } 78 | 79 | .number 80 | { 81 | font-size: 11px; 82 | width: 41px; 83 | margin-left: 0; 84 | margin-right: 4px; 85 | } 86 | 87 | .sendAgainButton 88 | { 89 | font-size: 11px; 90 | height:18px; 91 | } 92 | 93 | .sendButton 94 | { 95 | font-size: 11px; 96 | height:18px; 97 | width:45px; 98 | } 99 | 100 | .smallButton 101 | { 102 | font-size:11px; 103 | height:22px; 104 | } 105 | 106 | .largeButton 107 | { 108 | font-size:12px; 109 | height:24px; 110 | width:80px; 111 | margin-top:10px; 112 | } 113 | 114 | 115 | -------------------------------------------------------------------------------- /residentSf2Synth/riffParser.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 James Ingram 3 | * https://james-ingram-act-two.de/ 4 | * 5 | * This is almost entirely the riff parser code from 6 | * https://github.com/gree/sf2synth.js 7 | * 8 | * All this code licensed under MIT 9 | * 10 | * The WebMIDI.riffParser namespace containing: 11 | * 12 | * // RiffParser constructor 13 | * RiffParser(input, optParams) 14 | */ 15 | 16 | /*global WebMIDI */ 17 | 18 | WebMIDI.namespace('WebMIDI.riffParser'); 19 | 20 | WebMIDI.riffParser = (function() 21 | { 22 | "use strict"; 23 | var 24 | RiffParser = function(input, optParams) // input is a Uint8Array 25 | { 26 | optParams = optParams || {}; 27 | this.input = input; 28 | this.ip = optParams.index || 0; 29 | this.length = optParams.length || input.length - this.ip; 30 | this.chunkList = null; 31 | this.offset = this.ip; 32 | this.padding = (optParams.padding !== undefined) ? optParams.padding : true; 33 | this.bigEndian = (optParams.bigEndian !== undefined) ? optParams.bigEndian : false; 34 | }, 35 | 36 | API = 37 | { 38 | RiffParser: RiffParser // constructor 39 | }; 40 | // end var 41 | 42 | RiffParser.prototype.parse = function() 43 | { 44 | var length = this.length + this.offset; 45 | 46 | this.chunkList = []; 47 | 48 | while(this.ip < length) 49 | { 50 | this.parseChunk(); 51 | } 52 | }; 53 | 54 | RiffParser.prototype.parseChunk = function() 55 | { 56 | var 57 | input = this.input, 58 | ip = this.ip, 59 | type = String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), 60 | size = this.bigEndian ? 61 | (((input[ip++] << 24) | (input[ip++] << 16) | (input[ip++] << 8) | (input[ip++])) >>> 0) : 62 | (((input[ip++]) | (input[ip++] << 8) | (input[ip++] << 16) | (input[ip++] << 24)) >>> 0); 63 | 64 | this.chunkList.push({type: type, size: size, offset: ip}); 65 | 66 | ip += size; 67 | 68 | // padding 69 | if(this.padding && ((ip - this.offset) & 1) === 1) 70 | { 71 | ip++; 72 | } 73 | 74 | this.ip = ip; 75 | }; 76 | 77 | RiffParser.prototype.getChunk = function(index) 78 | { 79 | var chunk = this.chunkList[index]; 80 | 81 | if(chunk === undefined) 82 | { 83 | return null; 84 | } 85 | 86 | return chunk; 87 | }; 88 | 89 | RiffParser.prototype.getNumberOfChunks = function() 90 | { 91 | return this.chunkList.length; 92 | }; 93 | 94 | return API; 95 | 96 | }()); 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /residentSf2Synth/soundFont.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notator/WebMIDISynthHost/eafcdbc4b4c36a3a12cc1be0cc3c724214fb8dce/residentSf2Synth/soundFont.js -------------------------------------------------------------------------------- /residentSf2Synth/soundFontParser.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notator/WebMIDISynthHost/eafcdbc4b4c36a3a12cc1be0cc3c724214fb8dce/residentSf2Synth/soundFontParser.js -------------------------------------------------------------------------------- /residentSf2Synth/soundFontSynthNote.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 James Ingram 3 | * https://james-ingram-act-two.de/ 4 | * 5 | * This code is based on the gree soundFont synthesizer at 6 | * https://github.com/gree/sf2synth.js 7 | * 8 | * All this code is licensed under MIT 9 | * 10 | * The WebMIDI.soundFontSynthNote namespace containing the following constructor: 11 | * 12 | * SoundFontSynthNote(ctx, gainMaster, keyLayers) 13 | */ 14 | 15 | WebMIDI.namespace('WebMIDI.soundFontSynthNote'); 16 | 17 | WebMIDI.soundFontSynthNote = (function() 18 | { 19 | "use strict"; 20 | 21 | var 22 | // ji 15.01.2020: 23 | // The keyLayers argument is an array of length 2 containing left and right (i.e. stereo) "keyObjects". 24 | // Each "keyObject" has the lowest level attributes necessary for playing a sample using ctx audioContext. 25 | // The current code is however a *mono* implementation. It only uses keyLayers[0], and ignores its pan value. 26 | // The value of midi.pan is used instead. 27 | // TODO: Implement the playing of both keyLayers to produce an improved (stereo) sound. 28 | SoundFontSynthNote = function(ctx, gainMaster, keyLayers, midi) 29 | { 30 | this.ctx = ctx; 31 | this.gainMaster = gainMaster; 32 | this.keyLayers = keyLayers; 33 | 34 | this.channel = midi.channel; 35 | this.key = midi.key; 36 | this.velocity = midi.velocity; 37 | this.pan = midi.pan; 38 | this.volume = midi.volume; 39 | this.pitchBend = midi.pitchBend; 40 | this.pitchBendSensitivity = midi.pitchBendSensitivity; 41 | 42 | this.buffer = keyLayers[0].sample; 43 | 44 | this.startTime = null; 45 | 46 | // audio node 47 | this.audioBuffer = null; 48 | this.bufferSource = null; 49 | this.panner = null; 50 | this.gainOutput = null; 51 | }, 52 | 53 | API = 54 | { 55 | SoundFontSynthNote: SoundFontSynthNote // constructor 56 | }; 57 | 58 | SoundFontSynthNote.prototype.noteOn = function() 59 | { 60 | // KeyLayers are "subChannels" associated with a particular key in this preset, 61 | // i.e. they are "subChannels" associated with this particular Note. 62 | // All the keyLayers have been read correctly (as far as I know) from the SoundFont file, 63 | // but this file ignores all but the first (keyLayers[0]). 64 | // (The Arachno SoundFont's preset 0 -- Grand Piano -- has two layers, in which 65 | // keyLayer[0].pan is always -500 and keylayer[1].pan is always 500.) 66 | // This version of soundFontSynthNote.js: 67 | // 1) ignores all but the first keyLayer, and 68 | // 2) ignores the first keyLayer's *pan* attribute. 69 | // 3) plays the layer at the position set by the value of *this.pan* (see midi.pan above). 70 | // TODO 1: Implement the playing of stereo samples, using stereo Web Audio buffers. 71 | // 72 | // Each keyLayer has an entry for every soundFont "generator" in the spec, except those 73 | // whose value has been used to calculate the values of the other "generator"s and should 74 | // no longer be needed. 75 | // If a soundFont "generator" was not present in the soundFont, it will have its default 76 | // value in the keyLayer. 77 | // 78 | // The following "generator"s are present in the Arachno Grand Piano preset, and are 79 | // the same for every key in the preset, but are not used by this file: 80 | // chorusEffectsSend (soundfile amount: 50, value here: 0.05) 81 | // reverbEffectsSend (soundfile amount: 200, value here: 0.20) 82 | // pan (layer 0 (left) soundfile amount: -500, value here: 0 -- completely left 83 | // layer 1 (right)soundfile amount: 500, value here: 1 -- completely right) 84 | // delayModLFO (soundfile amount: -7973, value here: 0.01) 85 | // delayVibLFO (soundfile amount: -7973, value here: 0.01) 86 | // TODO 2: Implement the playing of *all* the soundFont "generator"s, especially these five. 87 | // N.B. the returned value of such unused generators is probably correct, but should be checked 88 | // in soundFont.js. The position of the decimal point should be specially carefully checked. 89 | 90 | let 91 | buffer, channelData, bufferSource, filter, panner, 92 | output, outputGain, 93 | ctx = this.ctx, 94 | keyLayers = this.keyLayers, 95 | sample = this.buffer, 96 | now = this.ctx.currentTime, 97 | doLoop = (keyLayers[0].loopFlags === 1 || keyLayers[0].loopFlags === 3), 98 | // All keyLayer attributes should have directly usable values here in this (runtime) file. 99 | // The conversions from the integer amounts in the soundFont have been done earlier (at load time). 100 | volDelayEndtime = now + keyLayers[0].volDelayDuration_sec, 101 | volAttackEndtime = volDelayEndtime + keyLayers[0].volAttackDuration_sec, 102 | volHoldEndtime = volAttackEndtime + keyLayers[0].volHoldDuration_sec, 103 | volDecayEndtime = volHoldEndtime + keyLayers[0].volDecayDuration_sec, 104 | 105 | modDelayEndtime = now + keyLayers[0].modDelayDuration_sec, 106 | modAttackEndtime = modDelayEndtime + keyLayers[0].modAttackDuration_sec, 107 | modHoldEndtime = modAttackEndtime + keyLayers[0].modHoldDuration_sec, 108 | modDecayEndtime = modHoldEndtime + keyLayers[0].modDecayDuration_sec, 109 | 110 | volLevel = this.volume * Math.pow((this.velocity / 127), 2) * keyLayers[0].initialAttenuation_factor, 111 | 112 | loopStart = 0, 113 | loopEnd = 0, 114 | bufferStartTime = keyLayers[0].bufferStartTime_sec; // keyLayers[0].bufferStartTime_sec is keyLayers[0].startAddressOffset / keyLayers[0].sampleRate; 115 | 116 | this.startTime = this.ctx.currentTime; 117 | 118 | if(doLoop === true) 119 | { 120 | loopStart = keyLayers[0].loopStart_sec; // = loopStart_samplePos / sampleRate; 121 | loopEnd = keyLayers[0].loopEnd_sec; // loopEnd_samplePos / sampleRate; 122 | } 123 | sample = sample.subarray(0, sample.length + keyLayers[0].endAddressOffset); 124 | this.audioBuffer = ctx.createBuffer(1, sample.length, keyLayers[0].sampleRate); 125 | buffer = this.audioBuffer; 126 | channelData = buffer.getChannelData(0); 127 | channelData.set(sample); 128 | 129 | // buffer source 130 | this.bufferSource = ctx.createBufferSource(); 131 | bufferSource = this.bufferSource; 132 | bufferSource.buffer = buffer; 133 | // The original gree code here was: 134 | // bufferSource.loop = (this.channel !== 9); 135 | bufferSource.loop = (this.channel !== 9 && doLoop ); // if there are any channel 9 instruments that loop, delete that condition! 136 | bufferSource.loopStart = loopStart; 137 | bufferSource.loopEnd = loopEnd; 138 | this.updatePlaybackRate(this.pitchBend); 139 | 140 | // audio node 141 | this.panner = ctx.createPanner(); 142 | panner = this.panner; 143 | this.gainOutput = ctx.createGain(); 144 | output = this.gainOutput; 145 | outputGain = output.gain; 146 | 147 | // filter 148 | this.filter = ctx.createBiquadFilter(); 149 | filter = this.filter; 150 | filter.type = 'lowpass'; 151 | 152 | // pan 153 | panner.panningModel = 'HRTF'; 154 | panner.setPosition( 155 | Math.sin(this.pan * Math.PI / 2), 156 | 0, 157 | Math.cos(this.pan * Math.PI / 2) 158 | ); 159 | 160 | //--------------------------------------------------------------------------- 161 | // Attack, Decay, Sustain 162 | //--------------------------------------------------------------------------- 163 | 164 | outputGain.setValueAtTime(0, now); 165 | if(volDelayEndtime > now) 166 | { 167 | outputGain.linearRampToValueAtTime(0, volDelayEndtime); 168 | } 169 | outputGain.linearRampToValueAtTime(volLevel, volAttackEndtime); 170 | outputGain.linearRampToValueAtTime(volLevel, volHoldEndtime); 171 | outputGain.linearRampToValueAtTime((volLevel * keyLayers[0].volSustainLevel_factor), volDecayEndtime); 172 | 173 | // https://www.w3.org/TR/webaudio/#the-biquadfilternode-interface 174 | // says that Q: 175 | // Controls how peaked the response will be at the cutoff frequency. 176 | // A large value makes the response more peaked. 177 | // Please note that for this filter type, this value is not a traditional Q, 178 | // but is a resonance value in decibels. 179 | // But is this what the soundFont spec is defining? 180 | // The following line seems to work, but is its conversion from the soundFont amount really correct? 181 | filter.Q.setValueAtTime(keyLayers[0].initialFilterQ_dB, now); 182 | 183 | // I think gree meant 'peak' where they wrote 'peek'. Took me a while to work out what they meant! 184 | filter.frequency.setValueAtTime(keyLayers[0].filterBaseFreq_Hz, now); 185 | if(modDelayEndtime > now) 186 | { 187 | filter.frequency.linearRampToValueAtTime(keyLayers[0].filterBaseFreq_Hz, modDelayEndtime); 188 | } 189 | filter.frequency.linearRampToValueAtTime(keyLayers[0].filterPeakFreq_Hz, modAttackEndtime); 190 | filter.frequency.linearRampToValueAtTime(keyLayers[0].filterPeakFreq_Hz, modHoldEndtime); 191 | filter.frequency.linearRampToValueAtTime(keyLayers[0].filterSustainFreq_Hz, modDecayEndtime); 192 | 193 | // connect 194 | bufferSource.connect(filter); 195 | filter.connect(panner); 196 | panner.connect(output); 197 | output.connect(this.gainMaster); 198 | 199 | // fire 200 | bufferSource.start(0, bufferStartTime); 201 | }; 202 | // current ji noteOff function 203 | SoundFontSynthNote.prototype.noteOff = function() 204 | { 205 | let 206 | output = this.gainOutput, 207 | volReleaseDuration_sec = this.keyLayers[0].volReleaseDuration_sec, 208 | volEndTime = this.ctx.currentTime + volReleaseDuration_sec; 209 | 210 | if(!this.audioBuffer) 211 | { 212 | return; 213 | } 214 | 215 | //--------------------------------------------------------------------------- 216 | // Release 217 | //--------------------------------------------------------------------------- 218 | output.gain.cancelScheduledValues(0); 219 | output.gain.linearRampToValueAtTime(0, volEndTime); 220 | 221 | this.bufferSource.stop(volEndTime); 222 | 223 | // disconnect 224 | setTimeout( 225 | (function(note) 226 | { 227 | return function() 228 | { 229 | note.bufferSource.disconnect(0); 230 | note.panner.disconnect(0); 231 | note.filter.disconnect(0); 232 | note.gainOutput.disconnect(0); 233 | }; 234 | }(this)), volReleaseDuration_sec + 0.1); 235 | }; 236 | 237 | // This function can be called by a note while it is playing. 238 | // The pitchBend argument is a 14-bit int value (in range [-8192..+8191]). 239 | SoundFontSynthNote.prototype.updatePlaybackRate = function(pitchBend) 240 | { 241 | let 242 | keyLayer = this.keyLayers[0]; 243 | 244 | if(pitchBend < -8192 || pitchBend > 8191) 245 | { 246 | throw "Illegal pitchBend value."; 247 | } 248 | 249 | this.playbackRate = keyLayer.basePlaybackRate * Math.pow(Math.pow(2, 1 / 12), 250 | (this.pitchBendSensitivity * (pitchBend / (pitchBend < 0 ? 8192 : 8191))) * keyLayer.scaleTuning_factor); 251 | 252 | this.bufferSource.playbackRate.value = this.playbackRate; 253 | }; 254 | 255 | return API; 256 | 257 | }()); 258 | -------------------------------------------------------------------------------- /residentWAFSynth/residentWAFSynthNote.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 James Ingram 3 | * https://james-ingram-act-two.de/ 4 | * 5 | * This code is based on the gree soundFont synthesizer at 6 | * https://github.com/gree/sf2synth.js 7 | * 8 | * All this code is licensed under MIT 9 | * 10 | * The WebMIDI.residentWAFSynthNote namespace containing the following constructor: 11 | * 12 | * ResidentWAFSynthNote(ctx, gainMaster, keyLayers) 13 | */ 14 | 15 | WebMIDI.namespace('WebMIDI.residentWAFSynthNote'); 16 | 17 | WebMIDI.residentWAFSynthNote = (function() 18 | { 19 | "use strict"; 20 | 21 | var 22 | ResidentWAFSynthNote = function(audioContext, noteGainNode, zone, midi) 23 | { 24 | if(!(this instanceof ResidentWAFSynthNote)) 25 | { 26 | return new ResidentWAFSynthNote(audioContext, noteGainNode, envelopeType, zone, midi); 27 | } 28 | 29 | this.audioContext = audioContext; 30 | this.noteGainNode = noteGainNode; // this node has been connected to a channel inputNode 31 | this.zone = zone; 32 | 33 | this.key = midi.key; 34 | this.velocityFactor = midi.velocity / 127; 35 | this.pitchBend14bit = midi.pitchBend14bit; // a value in range [-8192..+8191] 36 | this.pitchBendSensitivity = midi.pitchBendSensitivity; 37 | }, 38 | 39 | API = 40 | { 41 | ResidentWAFSynthNote: ResidentWAFSynthNote // constructor 42 | }; 43 | 44 | ResidentWAFSynthNote.prototype.noteOn = function() 45 | { 46 | function setNoteEnvelope(gain, now, velocityFactor, vEnvData) 47 | { 48 | // Surikov's WebAudioFontPlayer only uses volumes greater than 0.000001. 49 | // I think this may be to compensate for an old Web Audio bug that 50 | // produced clicks in the output, but that has since been corrected. 51 | // Using zero volume no longer seems to be a problem. 52 | // Note too, that I am using a basic attack-hold-decay envelope, without 53 | // Surikov's custom envelope capability. 54 | 55 | let volume = velocityFactor, // volume is always 1 * velocityFactor 56 | attackEndTime = now + vEnvData.attack, // attack max volume time 57 | holdEndTime = attackEndTime + vEnvData.hold, 58 | decayEndTime = holdEndTime + vEnvData.decay; 59 | 60 | gain.cancelScheduledValues(now); 61 | gain.setValueAtTime(0, now); // initialise volume 62 | gain.linearRampToValueAtTime(volume, attackEndTime); // attack 63 | gain.linearRampToValueAtTime(volume, holdEndTime); // hold 64 | gain.linearRampToValueAtTime(0, decayEndTime); // decay 65 | } 66 | 67 | function getBufferSourceNode(audioContext, key, zone) 68 | { 69 | let doLoop = (zone.loopStart < 1 || zone.loopStart >= zone.loopEnd) ? false : true, 70 | baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune, 71 | bufferSourceNode = audioContext.createBufferSource(); 72 | 73 | bufferSourceNode.buffer = zone.buffer; 74 | if(doLoop === true) 75 | { 76 | bufferSourceNode.loop = true; 77 | bufferSourceNode.loopStart = zone.loopStart / zone.sampleRate + zone.delay; 78 | bufferSourceNode.loopEnd = zone.loopEnd / zone.sampleRate + zone.delay; 79 | } 80 | else 81 | { 82 | bufferSourceNode.loop = false; 83 | } 84 | 85 | bufferSourceNode.standardPlaybackRate = Math.pow(2, (100.0 * key - baseDetune) / 1200.0); 86 | 87 | return bufferSourceNode; 88 | } 89 | 90 | let audioContext = this.audioContext, 91 | zone = this.zone, 92 | noteGainNode = this.noteGainNode, 93 | now = this.audioContext.currentTime; 94 | 95 | this.startTime = now; // used in updatePlaybackRate 96 | 97 | this.envelopeDuration = zone.vEnvData.envelopeDuration; // used in setTimeout below, and in updatePlaybackRate() 98 | this.noteOffReleaseDuration = zone.vEnvData.noteOffReleaseDuration; 99 | setNoteEnvelope(noteGainNode.gain, now, this.velocityFactor, zone.vEnvData); 100 | 101 | this.bufferSourceNode = getBufferSourceNode(audioContext, this.key, zone); 102 | this.updatePlaybackRate(this.pitchBend14bit); 103 | this.bufferSourceNode.onended = function() 104 | { 105 | // see https://stackoverflow.com/questions/46203191/should-i-disconnect-nodes-that-cant-be-used-anymore 106 | noteGainNode.disconnect(); 107 | console.log("The note's bufferSourceNode has stopped, and its noteGainNode has been disconnected."); 108 | }; 109 | this.bufferSourceNode.connect(noteGainNode); 110 | 111 | // see https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start 112 | // N.B. zone.delay is defined/set to 0 when loading/adjusting the zone, and never changes. 113 | this.bufferSourceNode.start(now, zone.delay, this.envelopeDuration + 0.5); 114 | }; 115 | 116 | ResidentWAFSynthNote.prototype.noteOff = function() 117 | { 118 | let 119 | noteGainNode = this.noteGainNode, 120 | stopTime = this.audioContext.currentTime + this.noteOffReleaseDuration; 121 | 122 | noteGainNode.gain.cancelScheduledValues(0); 123 | noteGainNode.gain.linearRampToValueAtTime(0, stopTime); 124 | 125 | this.bufferSourceNode.stop(stopTime + 0.5); 126 | }; 127 | 128 | // This function is called when the bufferSourceNode has just been created, and 129 | // can be called again to shift the pitch while the note is still playing. 130 | // The pitchBend argument is a 14-bit int value (in range [-8192..+8191]). 131 | ResidentWAFSynthNote.prototype.updatePlaybackRate = function(pitchBend14bit) 132 | { 133 | if(pitchBend14bit < -8192 || pitchBend14bit > 8191) 134 | { 135 | throw "Illegal pitchBend value."; 136 | } 137 | 138 | if((this.startTime + this.envelopeDuration) > this.audioContext.currentTime) 139 | { 140 | let factor = Math.pow(Math.pow(2, 1 / 12), (this.pitchBendSensitivity * (pitchBend14bit / (pitchBend14bit < 0 ? 8192 : 8191)))), 141 | bufferSourceNode = this.bufferSourceNode, 142 | newPlaybackRate = bufferSourceNode.standardPlaybackRate * factor; 143 | 144 | bufferSourceNode.playbackRate.setValueAtTime(newPlaybackRate, 0); 145 | } 146 | }; 147 | 148 | return API; 149 | 150 | }()); 151 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFont.js: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 James Ingram 2 | * https://james-ingram-act-two.de/ 3 | * This code has been developed from the code for my original ResidentSf2Synth: 4 | * https://github.com/notator/WebMIDISynthHost/residentSf2Synth/residentSf2Synth.js. 5 | * It uses both javascript preset files, cloned from 6 | * https://surikov.github.io/webaudiofontdata/sound/, and 7 | * other code that originated in the following repository: 8 | * https://github.com/surikov/webaudiofont 9 | * 10 | * All the code in this project is covered by an MIT license. 11 | * https://github.com/surikov/webaudiofont/blob/master/LICENSE.md 12 | * https://github.com/notator/WebMIDISynthHost/blob/master/License.md 13 | */ 14 | 15 | /* 16 | * WebMIDI.webAudioFont namespace containing a WebAudioFont constructor. 17 | */ 18 | 19 | /*global WebMIDI */ 20 | 21 | WebMIDI.namespace('WebMIDI.webAudioFont'); 22 | 23 | WebMIDI.webAudioFont = (function() 24 | { 25 | "use strict"; 26 | 27 | let 28 | // Returns a banks array. 29 | // Each bank is an array of presets. 30 | // Each preset has a 'zones' attribute that is an array of 'zone'. 31 | // A 'zone' is an object that has attributes used to when processing a single sample. 32 | getBanks = function(allPresetsPerBank, presetNamesPerBank) 33 | { 34 | // This function just corrrects errors in the WebAudioFont preset files. 35 | function correctWebAudioPresetErrors(presetIndex, zones) 36 | { 37 | function removeRedundantWebAudioFontGeneralUserGSGrandPianoZones(zones) 38 | { 39 | let zoneIndex = zones.findIndex(z => (z.keyRangeLow === 88 && z.keyRangeHigh === 90)), 40 | corrected = false; 41 | 42 | if(zoneIndex > -1) 43 | { 44 | zones.splice(zoneIndex, 1); 45 | corrected = true; 46 | } 47 | zoneIndex = zones.findIndex(z => (z.keyRangeLow === 61 && z.keyRangeHigh === 61)); 48 | if(zoneIndex > -1) 49 | { 50 | zones.splice(zoneIndex, 1); 51 | corrected = true; 52 | } 53 | if(corrected) 54 | { 55 | console.warn("WebAudioFont: corrected GeneralUserGS GrandPiano zones."); 56 | } 57 | } 58 | function removeRedundantWebAudioFontGeneralUserGSMusicBoxZones(zones) 59 | { 60 | let zoneIndex = zones.findIndex(z => (z.keyRangeLow === 0 && z.keyRangeHigh === 80)), 61 | corrected = false; 62 | 63 | if(zoneIndex > -1) 64 | { 65 | zones.splice(zoneIndex, 1); 66 | corrected = true; 67 | } 68 | zoneIndex = zones.findIndex(z => (z.keyRangeLow === 81 && z.keyRangeHigh === 113)); 69 | if(zoneIndex > -1) 70 | { 71 | zones.splice(zoneIndex, 1); 72 | corrected = true; 73 | } 74 | if(corrected) 75 | { 76 | console.warn("WebAudioFont: corrected GeneralUserGS MusicBox zones."); 77 | } 78 | } 79 | function resetHighFluidPadZone(zones, padNumber) 80 | { 81 | if(zones.length === 2 && zones[1].keyRangeLow === 0) 82 | { 83 | zones[1].keyRangeLow = zones[0].keyRangeHigh + 1; 84 | zones[1].keyRangeHigh = 127; 85 | console.warn("WebAudioFont: corrected Fluid Pad " + padNumber + " (top zone)."); 86 | } 87 | } 88 | function correctFluidPad5Zones(zones) 89 | { 90 | // remove the middle zone, and make the others contiguous 91 | if(zones.length === 3 && zones[1].keyRangeLow === 0) 92 | { 93 | zones.splice(1, 1); 94 | zones[1].keyRangeLow = zones[0].keyRangeHigh + 1; 95 | zones[1].keyRangeHigh = 127; 96 | console.warn("WebAudioFont: corrected Fluid Pad 5 zones."); 97 | } 98 | } 99 | 100 | switch(presetIndex) 101 | { 102 | case 0: 103 | removeRedundantWebAudioFontGeneralUserGSGrandPianoZones(zones); 104 | break; 105 | case 10: 106 | removeRedundantWebAudioFontGeneralUserGSMusicBoxZones(zones); 107 | break; 108 | case 89: 109 | resetHighFluidPadZone(zones, 2); 110 | break; 111 | case 92: 112 | correctFluidPad5Zones(zones); 113 | break; 114 | case 93: 115 | resetHighFluidPadZone(zones, 6); 116 | break; 117 | } 118 | } 119 | 120 | function checkZoneContiguity(presetName, presetIndex, zones) 121 | { 122 | for(var zoneIndex = 1; zoneIndex < zones.length; zoneIndex++) 123 | { 124 | if(zones[zoneIndex].keyRangeLow !== (zones[zoneIndex - 1].keyRangeHigh + 1)) 125 | { 126 | throw presetName + " (presetIndex:" + presetIndex + "): zoneIndex " + zoneIndex + " is not contiguous!"; 127 | } 128 | } 129 | } 130 | 131 | let banks = []; 132 | 133 | for(let bankIndex = 0; bankIndex < presetNamesPerBank.length; ++bankIndex) 134 | { 135 | let bank = [], 136 | presetNames = presetNamesPerBank[bankIndex], 137 | presetsPerBank = allPresetsPerBank[bankIndex]; 138 | 139 | for(let i = 0; i < presetNames.length; ++i) 140 | { 141 | let presetName = presetNames[i], 142 | presetIndex, 143 | presetVariable = window[presetName]; 144 | 145 | if(presetVariable !== undefined) 146 | { 147 | presetIndex = presetVariable.zones[0].midi; // Surikov's midi attribute 148 | } 149 | else // percussion preset 150 | { 151 | presetIndex = presetsPerBank[i].presetIndex; 152 | } 153 | 154 | let preset = presetsPerBank.find(obj => obj.presetIndex === presetIndex); 155 | 156 | if(preset === undefined) 157 | { 158 | throw "can't find preset"; 159 | } 160 | 161 | correctWebAudioPresetErrors(presetIndex, preset.zones); 162 | 163 | if(!presetName.includes("percussion")) 164 | { 165 | checkZoneContiguity(presetName, presetIndex, preset.zones); 166 | } 167 | 168 | preset.bankIndex = bankIndex; 169 | 170 | bank.push(preset); 171 | } 172 | banks.push(bank); 173 | } 174 | 175 | return banks; 176 | }, 177 | 178 | // Returns true if all the contained zones have a buffer attribute. 179 | // Otherwise false. 180 | isReady = function() 181 | { 182 | for(var bankIndex = 0; bankIndex < this.banks.length; bankIndex++) 183 | { 184 | let bank = this.banks[bankIndex]; 185 | for(var presetIndex = 0; presetIndex < bank.length; presetIndex++) 186 | { 187 | let zones = bank[presetIndex].zones; 188 | for(var zoneIndex = 0; zoneIndex < zones.length; zoneIndex++) 189 | { 190 | if(zones[zoneIndex].buffer === undefined) 191 | { 192 | return false; 193 | } 194 | } 195 | } 196 | } 197 | 198 | return true; 199 | }, 200 | 201 | // This constructor checks for (and if necesary corrects) errors in the WebAudioFont preset files, 202 | // and then returns a WebAudioFont containing presets whose format and attributes are the same as 203 | // those returned by Surikov's decodeAfterLoading() function (e.g. zone.ahdsr). 204 | // Enhancements are done later (in the ResidentWAFSynth code). 205 | WebAudioFont = function(name, allPresetsPerBank, presetNamesPerBank) 206 | { 207 | if(!(this instanceof WebAudioFont)) 208 | { 209 | return new WebAudioFont(name, allPresetsPerBank, presetNamesPerBank); 210 | } 211 | 212 | Object.defineProperty(this, "name", { value: name, writable: false }); 213 | Object.defineProperty(this, "banks", { value: getBanks(allPresetsPerBank, presetNamesPerBank), writable: false }); 214 | Object.defineProperty(this, "isReady", { value: isReady, writable: false }); 215 | }, 216 | 217 | API = 218 | { 219 | WebAudioFont: WebAudioFont // constructor 220 | }; 221 | // end var 222 | 223 | return API; 224 | }()); 225 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontDefs.js: -------------------------------------------------------------------------------- 1 | console.log('load webAudioFontDefs.js'); 2 | 3 | WebMIDI.namespace('webAudioFontDefs'); 4 | WebMIDI.namespace('percussionPresets'); // omit if there are no percussion presets 5 | 6 | // Each array contained in a webAudioFontDefs.presetNamesPerBank[] defines the content of a bank. 7 | // Banks do not have to contain the same set of midiPreset indices (that's application specific). 8 | // There can be up to 127 banks in a webAudioFontDef. 9 | WebMIDI.webAudioFontDefs = 10 | [ 11 | { 12 | name: "Study 2", 13 | presetNamesPerBank: 14 | [ 15 | [ // bank 0 16 | "_tone_0080_FluidR3_GM_sf2_file", // presetIndex:8, celesta 17 | "_tone_0090_FluidR3_GM_sf2_file", // presetIndex:9, glockenspiel 18 | "_tone_0100_FluidR3_GM_sf2_file", // presetIndex:10, musicBox 19 | "_tone_0110_FluidR3_GM_sf2_file", // presetIndex:11, vibraphone 20 | "_tone_0120_FluidR3_GM_sf2_file", // presetIndex:12, marimba 21 | "_tone_0130_FluidR3_GM_sf2_file", // presetIndex:13, xylophone 22 | "_tone_0140_FluidR3_GM_sf2_file", // presetIndex:14, tubularBells 23 | "_tone_0150_FluidR3_GM_sf2_file", // presetIndex:15, dulcimer 24 | "_tone_0240_FluidR3_GM_sf2_file", // presetIndex:24, nylonGuitar 25 | "_tone_0250_FluidR3_GM_sf2_file", // presetIndex:25, steelGuitar 26 | "_tone_0260_FluidR3_GM_sf2_file", // presetIndex:26, electricGuitarJazz 27 | "_tone_0270_FluidR3_GM_sf2_file" // presetIndex:27, electricGuitarClean 28 | ] 29 | ] 30 | }, 31 | { 32 | name: "interesting Fluid presets", 33 | presetNamesPerBank: 34 | [ 35 | [ // bank 0 36 | "_tone_0460_FluidR3_GM_sf2_file", // presetIndex:46, harp 37 | "_tone_0530_FluidR3_GM_sf2_file", // presetIndex:53, oohs 38 | "_tone_0580_FluidR3_GM_sf2_file", // presetIndex:58, tuba 39 | "_tone_0790_FluidR3_GM_sf2_file", // presetIndex:79, ocarina 40 | "_tone_0890_FluidR3_GM_sf2_file", // presetIndex:89, pad 2 41 | "_tone_0920_FluidR3_GM_sf2_file", // presetIndex:92, pad 5 42 | "_tone_0930_FluidR3_GM_sf2_file", // presetIndex:93, pad 6 43 | "_tone_0950_FluidR3_GM_sf2_file" // presetIndex:95, pad 8 44 | ] 45 | ] 46 | }, 47 | { 48 | name: "some Fluid winds", 49 | presetNamesPerBank: 50 | [ 51 | [ // bank 0 52 | "_tone_0600_FluidR3_GM_sf2_file", // presetIndex:60, horn 53 | "_tone_0660_FluidR3_GM_sf2_file", // presetIndex:66, tenor sax 54 | "_tone_0680_FluidR3_GM_sf2_file", // presetIndex:68, oboe 55 | "_tone_0700_FluidR3_GM_sf2_file", // presetIndex:70, bassoon 56 | "_tone_0710_FluidR3_GM_sf2_file", // presetIndex:71, clarinet 57 | "_tone_0730_FluidR3_GM_sf2_file" // presetIndex:73, flute 58 | ] 59 | ] 60 | }, 61 | { 62 | name: "ensemble (two banks)", 63 | presetNamesPerBank: 64 | [ 65 | [ // bank 0 66 | "_tone_0080_FluidR3_GM_sf2_file", // presetIndex:8, celesta 67 | "_tone_0090_FluidR3_GM_sf2_file", // presetIndex:9, glockenspiel 68 | "_tone_0100_FluidR3_GM_sf2_file", // presetIndex:10, musicBox 69 | "_tone_0110_FluidR3_GM_sf2_file", // presetIndex:11, vibraphone 70 | "_tone_0120_FluidR3_GM_sf2_file", // presetIndex:12, marimba 71 | "_tone_0130_FluidR3_GM_sf2_file", // presetIndex:13, xylophone 72 | "_tone_0140_FluidR3_GM_sf2_file", // presetIndex:14, tubularBells 73 | "_tone_0150_FluidR3_GM_sf2_file", // presetIndex:15, dulcimer 74 | "_tone_0160_FluidR3_GM_sf2_file", // presetIndex:16, drawbarOrgan 75 | "_tone_0240_FluidR3_GM_sf2_file", // presetIndex:24, nylonGuitar 76 | "_tone_0250_FluidR3_GM_sf2_file", // presetIndex:25, steelGuitar 77 | "_tone_0260_FluidR3_GM_sf2_file", // presetIndex:26, electricGuitarJazz 78 | "_tone_0270_FluidR3_GM_sf2_file", // presetIndex:27, electricGuitarClean 79 | "_tone_0460_FluidR3_GM_sf2_file", // presetIndex:46, Harp 80 | "percussion (FluidR3 metal and wood)",// presetIndex:126, (percussion preset defined below) 81 | "percussion (FluidR3 drums)" // presetIndex:127, (percussion preset defined below) 82 | ], 83 | [ // bank 1 84 | "_tone_0080_GeneralUserGS_sf2_file", // presetIndex:8, celesta 85 | "_tone_0090_GeneralUserGS_sf2_file", // presetIndex:9, glockenspiel 86 | "_tone_0100_GeneralUserGS_sf2_file", // presetIndex:10, musicBox 87 | "_tone_0110_GeneralUserGS_sf2_file", // presetIndex:11, vibraphone 88 | "_tone_0120_GeneralUserGS_sf2_file", // presetIndex:12, marimba 89 | "_tone_0130_GeneralUserGS_sf2_file", // presetIndex:13, xylophone 90 | "_tone_0140_GeneralUserGS_sf2_file", // presetIndex:14, tubularBells 91 | "_tone_0160_GeneralUserGS_sf2_file", // presetIndex:16, drawbarOrgan 92 | "percussion (FluidR3 drums)" // presetIndex:127, (percussion preset defined below) 93 | ] 94 | ] 95 | }, 96 | { 97 | name: "keyboards (two banks)", 98 | presetNamesPerBank: 99 | [ 100 | [ // bank 0 101 | "_tone_0000_FluidR3_GM_sf2_file", // presetIndex:0, piano 102 | "_tone_0060_FluidR3_GM_sf2_file", // presetIndex:6, harpsichord 103 | "_tone_0080_FluidR3_GM_sf2_file", // presetIndex:8, celesta 104 | "_tone_0160_FluidR3_GM_sf2_file" // presetIndex:16, drawbarOrgan 105 | ], 106 | [ // bank 1 107 | "_tone_0000_GeneralUserGS_sf2_file", // presetIndex:0, piano 108 | "_tone_0060_GeneralUserGS_sf2_file", // presetIndex:6, harpsichord 109 | "_tone_0080_GeneralUserGS_sf2_file", // presetIndex:8, celesta 110 | "_tone_0160_GeneralUserGS_sf2_file" // presetIndex:16, drawbarOrgan 111 | ] 112 | ] 113 | }, 114 | { 115 | name: "two Acoustic Grand Pianos (two banks)", 116 | presetNamesPerBank: 117 | [ 118 | [ // bank 0 119 | "_tone_0000_FluidR3_GM_sf2_file" // presetIndex:0, piano 120 | ], 121 | [ // bank 1 122 | "_tone_0000_GeneralUserGS_sf2_file" // presetIndex:0, piano 123 | ] 124 | ] 125 | }, 126 | { 127 | name: "one Acoustic Grand Piano (one bank)", 128 | presetNamesPerBank: 129 | [ 130 | [ // bank 0 131 | "_tone_0000_FluidR3_GM_sf2_file" // presetIndex:0, piano 132 | ] 133 | ] 134 | } 135 | ]; 136 | 137 | // WebMIDI.percussionPresets should only be defined if percussion presets are used in the above definitions. 138 | // 139 | // These percussion preset definitions are just examples. A General MIDI compatible implementation might have one 140 | // definition containing all the instruments from a particular source, with the preset assigned to channelIndex 9. 141 | // Each percussionPreset is created after these files have been adjusted (=unpacked). 142 | // The preset is given its defined .presetIndex attribute, and each zone's .midi attribute is set to the same value. 143 | // It is an error for two sounds to be assigned to the same key in the same preset. Not all keys have to be assigned (as here). 144 | WebMIDI.percussionPresets = 145 | [ 146 | { 147 | name: "percussion (FluidR3 metal and wood)", 148 | presetIndex: 126, // any index that is not otherwise used in the same bank 149 | keys: 150 | [ 151 | "_drum_56_0_FluidR3_GM_sf2_file", // keyIndex:56 Cowbell 152 | "_drum_59_0_FluidR3_GM_sf2_file", // keyIndex:59 Ride Cymbal 2 153 | "_drum_70_0_FluidR3_GM_sf2_file", // keyIndex:70 Maracas 154 | "_drum_73_0_FluidR3_GM_sf2_file", // keyIndex:73 Short Guiro 155 | "_drum_74_0_FluidR3_GM_sf2_file", // keyIndex:74 Long Guiro 156 | "_drum_75_0_FluidR3_GM_sf2_file", // keyIndex:75 Claves 157 | "_drum_76_0_FluidR3_GM_sf2_file", // keyIndex:76 Hi Wood Block 158 | "_drum_77_0_FluidR3_GM_sf2_file", // keyIndex:77 Low Wood Block 159 | "_drum_81_0_FluidR3_GM_sf2_file" // keyIndex:81 Open Triangle 160 | ] 161 | }, 162 | { 163 | name: "percussion (FluidR3 drums)", 164 | presetIndex: 127, // any index that is not otherwise used in the same bank 165 | keys: 166 | [ 167 | "_drum_41_0_FluidR3_GM_sf2_file", // keyIndex:41 Low Floor Tom 168 | "_drum_45_0_FluidR3_GM_sf2_file", // keyIndex:45 Low Tom 169 | "_drum_48_0_FluidR3_GM_sf2_file", // keyIndex:48 Hi-Mid Tom 170 | "_drum_60_0_FluidR3_GM_sf2_file", // keyIndex:60 Hi Bongo 171 | "_drum_61_0_FluidR3_GM_sf2_file", // keyIndex:61 Low Bongo 172 | "_drum_62_0_FluidR3_GM_sf2_file", // keyIndex:62 Mute Hi Conga 173 | "_drum_63_0_FluidR3_GM_sf2_file" // keyIndex:63 Open Hi Conga 174 | ] 175 | } 176 | ]; 177 | 178 | 179 | 180 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12848_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_48_0_FluidR3_GM_sf2_file'); 2 | var _drum_48_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:48 9 | ,keyRangeHigh:48 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:-5 13 | ,originalPitch:4800 14 | ,file:'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' 15 | ,anchor:0.00698413 16 | //'MdHi Studio(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12856_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_56_0_FluidR3_GM_sf2_file'); 2 | var _drum_56_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:56 9 | ,keyRangeHigh:56 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:5600 14 | ,file:'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vm9WzbvTn1yXqLro6elkgoSHF0xJ2pgAh6rNKZk5VtDIoZIWwe6VjcszACcqKjhvJMEqB/KBEM4LTAFHV9pZqZs9PVtPP/0hEfR6WErYcowc3ye7fXwJP3mRWoR5l1QnWmgSTiHAuHEDcCmlUDHgzGzhoXNRlJdMRG+RI53W0QgZVMu3AknYlAsJs0ERh+QSCHYZWy9stVLEMcqjivIi6IqicdSYRHp8zWxqtsbJHqxKlUaUzSgVTMWeaUnInWUy0kjLDV1c//uQxPSAFtGVH8ywc8saPWN5lg55FG37PNuZg1M63UjAkHiBa7iQnaGHBiydHXKucJw1HChcSCFmw01VVt5oNUYOxmqq0JnIOKDxwTlN3pvBZOCog8elTWpBRyxUMgUdiVSmQL0TAOd9AFdZSwrN9vK70i89DK8yTzDIRutJkgn4FmXGA0wgKBpU0DQeeQwPA13IJAKAlDc1Y4QrLYbBF2RS6rHKz4diUOw7QSd9nDSlkUugR5n6gyW0DtStCK/BrMeBIosaEG2wbTxE2SNG01GYNJxUYg9GBsnFAdUxtJcsKBIpVSW80MtOTUuE6w1mV2U2TEtbR+UIQh/DNjS81blPlwXSK0jJyp05SPeDYRmIP5DP5A3OBo4MYJuuDwdIzwYd4mGZfa5KxGUD3zIzh6grXkU1D8z3bWp6p2Ge05kg6jTdnl/1jZ1NKYiJVCMUNMSAQKwGpGcKZcAqkWnFBEU0fAwplqX0jcF8HTfKfnHe+nYdAcOSPHcwzqjumJnBcEccFixosTLCYhdtxoiPktKoerBEikRPZWJhCeajqHJK//uQxPwAGa3dG+0wdws1PmN9pI8puRLIkQqajn1CoGipLLSImIWYx9xhsaTZkttbEhc1fpZFq04NLKu2kUpNfYxqsVf+YIm8KhkYZmgZwEKAtqqxlXyDCgqVBLLHQ0Ai2on6JpH/AKivsZYbHtSVGh1dhQMZeNSq/xmNjilSbLCmKxKqTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tQxPSB2VIxFYykd4gDgCBAAAAFqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' 15 | ,anchor:0.00244898 16 | //'Cow Bell(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12860_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_60_0_FluidR3_GM_sf2_file'); 2 | var _drum_60_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:60 9 | ,keyRangeHigh:60 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:6000 14 | ,file:'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' 15 | ,anchor:0.00585034 16 | //'Bongo Rim(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12861_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_61_0_FluidR3_GM_sf2_file'); 2 | var _drum_61_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:61 9 | ,keyRangeHigh:61 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:6100 14 | ,file:'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LCVGSCh4JPKohUYOfLCUlwoFQkDICLZE67yQVGPYEgKn/1u/WAlMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7gMTugBlqOxXspHdB/hhhNYSY+FVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' 15 | ,anchor:0.00741497 16 | //'Low Bongo(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12862_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_62_0_FluidR3_GM_sf2_file'); 2 | var _drum_62_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:62 9 | ,keyRangeHigh:62 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:6200 14 | ,file:'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' 15 | ,anchor:0.00530612 16 | //'Closed Slap(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12863_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_63_0_FluidR3_GM_sf2_file'); 2 | var _drum_63_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:63 9 | ,keyRangeHigh:63 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:6300 14 | ,file:'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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kMTxABo2MRXtJHXKsCliPYSOMVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMTWA8AAAf4AAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' 15 | ,anchor:0.00385488 16 | //'High Conga(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12870_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_70_0_FluidR3_GM_sf2_file'); 2 | var _drum_70_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:70 9 | ,keyRangeHigh:70 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:7000 14 | ,file:'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' 15 | ,anchor:0.03045351 16 | //'Maracas(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12873_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_73_0_FluidR3_GM_sf2_file'); 2 | var _drum_73_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:73 9 | ,keyRangeHigh:73 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:7300 14 | ,file:'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' 15 | ,anchor:0.00387755 16 | //'Guiro Down(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12874_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_74_0_FluidR3_GM_sf2_file'); 2 | var _drum_74_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:74 9 | ,keyRangeHigh:74 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:7400 14 | ,file:'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' 15 | ,anchor:0.01290249 16 | //'Guiro Up(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12875_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_75_0_FluidR3_GM_sf2_file'); 2 | var _drum_75_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:75 9 | ,keyRangeHigh:75 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:7500 14 | ,file:'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KpzU6K1Dnzk4x5d3VWrYs59weTI+dlqHK5V1K6EFtSG2RLxV5JOEU9Qtqpz/+4DE/YAX8aEz7L2VIsCtZf2nmrWL5UY2yzO6B0N+XcYdG+fTwc3zWosrfuFe8eqvXRdSzM8PKhNvKkADNAAIKksMKE9oSWMaaiMmEYlTYFwgFgWCQpwhZpErNlUlZyWoRCZl/flvxaVWhyP6qk0Nb6l1WaW2NspItQilmoqoWZAURSRae3kSywkeCgNDzsKgISzu77MlTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7cMTxgBUdhTHsMNWpkBfjvPCkVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' 15 | ,anchor:0.00290249 16 | //'Clave(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12876_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_76_0_FluidR3_GM_sf2_file'); 2 | var _drum_76_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:76 9 | ,keyRangeHigh:76 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:7600 14 | ,file:'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QqGGiSh7LaZzK0IpBhw0lM9YEhedkE8OfFzWL4oo3hxSRwP2uWEE6cHEqRIfHLCo5bj8+ofFIqsMuVYyFRJaZAfYOAiYVCI4npEjXqSzzkN7Fn7FpB9lNC+WfDshT6kjl5cASKMmOnXp8hKIrmLmkC9pTWSt2mZaf/H+znzlV4wqGPNuKZnJqR3/KyHc/W1/dL/Dt8oV319c3eTm3wRJHV+vkd7v3yradz+yNupxoLmUbStw/JgRK8xPMoAUJH5i7LWZKbRNYWXQ1AaEkDNe0qkoyXQren0o5CM/Euvy5dXqrT2hKEoSjE4BsfiSi+rJKMl39zSIKDEqqtnKI4cSJa1eZ8kUSiQV//uQxPMAF621Hcykc+MbuKM5lhpp6fDkqJJPJpEi1bNHVWyzzVEkt/apz9q2c841V2qZ/aqolOJQVPREDQc/BrDSfiIDHoNCV7IiDn+yCvJflQaDtUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tAxPaD1A1HFaww0UAAAD/AAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' 15 | ,anchor:0.00324263 16 | //'High Woodblock(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/12877_0_FluidR3_GM_sf2_file.js: -------------------------------------------------------------------------------- 1 | console.log('load _drum_77_0_FluidR3_GM_sf2_file'); 2 | var _drum_77_0_FluidR3_GM_sf2_file={ 3 | zones:[ 4 | { 5 | midi:128 6 | ,loopStart:0 7 | ,loopEnd:0 8 | ,keyRangeLow:77 9 | ,keyRangeHigh:77 10 | ,sampleRate:44100 11 | ,coarseTune:0 12 | ,fineTune:0 13 | ,originalPitch:7700 14 | ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAOAAAV5QApKSkpKSkpPDw8PDw8PE1NTU1NTU1gYGBgYGBgcXFxcXFxcYGBgYGBgYGSkpKSkpKSpaWlpaWlpaW2tra2tra2xsbGxsbGxtfX19fX19fo6Ojo6Ojo+Pj4+Pj4+P////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJATAAAAAAAAAFeWZtYuxAAAAAAD/+8DEAAAHXE9RtBMAI7EyLH81kAHZEAAAAAAg3qNwARgBjHgu/GPd+7vYIEEDwAAEBOBAxDBcHy4PvEDgQ4Jn63h//BDiM//KHOH/8EP8MQjGQApjDgAgAAICIwqR23A5OXIYcQQkgDFwnbGiB2g4wHEv6sihhdALwDltSYGIzCk2VgsER+jwwZtQKjh1RRsyqMNJDJdIPl8THDT7BAqtBIJI2ERNSuGGSO3EAwOClUGVrA3mmqrNyWzLG1nX3gekuVaS1bgybibYJS5MOxKBrUnjE5fjGMhhFPS0uUMxGtk7XL/zc9DlHXt6pN6zo6azWzpa03Fce0lbKrLasENMpqtu3u3Xt3YjduWLcavSqer0ty/ErVaM43d3e95nLKljWHO//Pj07N2aW5KdU1fmWX/KabOg3TXc+VuzKmgAEAAAAAFIy9BCzVnydUdRtFgCBwOMl601/YzLS4I4UeTDsapuNSqni4ZajBUJuskJiG85MT652iwqJf72ln8WvzmJWLW2pG+BXNrWxjVp7SuwOi91LJozUooFpQxH/FNtx30wtOGouf/hQTk/wUKa6Cgz4opT+u1//4Kdj+R3/10WeQDMAAQAAJLnMtZXRpjAyd5zCVEKZ8emsQBjQcMsqdYMb9AgPOwF1HkjRc5dUWpqRzIlTPNA0GtNiOSPiiy4nNZeMAJDOwmjDDkrR1OUDDoczAgOEY9KslpWXVlYL8uFpKQYCweFpmE/g66WGyvn4X5/o7Qf8W0eYonaeVQRsUnX0Ja3tx4figevMjuEcw6XMZjKqVpQ25JdDmpYvRnpZqUtk7yHg5BtXDTUstRL1zIqKrXMw5INLc2AaAARAAAEK84wRGkHAQSmUgY8aYRGZcUEJwILMcMDBM82UwQ1MQmSwVHZUoK57BZfN4NXlD+OWyFZj9WXmBAlXz7XGhDAKOMrWjBw48KyRGhF8TwiPD1w1YVlc1ssnGSS1//7kMTPABBYl1v9h4Aq37NovZYjJbF6OHyiC1p/pEU8tFIYivBh6KLqdaQ5RE7J1OZrqPq3VvA1KaUqhNJmesmIdtwSOA4wgF8GEnJES1NZTsoubyNjSVIn79l63J+/M86y3f09HaVlOEByAAAAF8fRpjCLNciiFUSaYMoNoCRCJR2pW8IKCRqKAIzTbVNLXjbo9Ekbq1xjEUoU1H7ZOW7ARaIjzJFtqzpTGigKQYzjewa+9Lbf2KRGAo8wuM5v7K5RGs5VNDoJrEBmIpUaQFi74tHqtHEUQjIVxbLq1qCcCRo00IKQQSjcVUay3fdlA9jMbDknK1Rspe/uPqNmUkaZlSaxTHlHtjU38dnouO7ahFzm7exT/NeU2Pe0ECmRyK0gJDAAAAAAJ8PSMsIlZtULdhwmbA6YdWBmTeGLCrPS9Lag4AspMCBoYVWV6qendmXPszSs5bhPu4kPvMFgIUJSd3UJkvXGyUQiFU2aTbLHZh554zBzcGJNSFoAkBgESMGE9+Y0CJRHIGADlWWFyNu3/F270XuyLVSAhlR9RAibYf/7gMT3gJa9m0PtMNiq4DNn/ZSblZZahFVldUibpOLgTFgwes/aSxg2nrNz1aStIt3EwlJg1uohzcp0/S69rFznLNNKOGGo1zJNRCxKHH2hfoNDU9bQI4iJAACUXONswUqoRcqzCFI18DPAIr3PS4KCLEpU3RmQtf6USBiTftKiljOlkcOyqWQm5BzXFq00GUkA1ldxOxIY4BGXllKkWRtLBLKh2JpBXuTBOlo7ZJ+0jbeYjjpVmlejyfrWE1OzpnaQJcyq/H4rTt3bMa7WL+VcsTYqS3pOO3uyz2vdFe3jRRedVMjWwzJFTd+8EwWdoVGS/5/PLVuZOTSApp1QhxAAAAAoOce0tFM2JJpL4BwgzU04BAYODAAFLE4pqUlgJKRo5DdW2gildI7DwO098bT/hMBzkNrSBIJTBdMqcpFVCqFvy3jyCEsHSMNQdrgZEYCAtOYfNOKAoTxMhYjIGVGmQJUfAmkwKWhEKlBl//uQxOyAGAWLPe0lGyqfs+h9lg8tikxUJVtZcyugJhUidmqnF2YXZm0M49UaawaKJkKqHX9Smuyxb9jcUAI+c20YvdYlz3l21bbs+iXl6S2kYwi9L7eT0IZ71aEbhpYoGz2BlEAIAASi7wXRJixhoaa65DCiiYGaAOUMlMAuCalflIVAsaDgNBRYSpbDLlaW8g6XzTd5G6DkyxxkvigVQN2kylLMVxtGmKKy9IeHrFDE+bskE8cFIuQ6LjK9jb2kQ8HsR3Bs2f1BEm0Ek3Jky4oEZjsEsg2wSKNYYfnS2Ms0BS2omlGqJalj19e3ZvPNlEkZyis+ksL5CtyJbJ3+MyWz5vzNdqbdu218ptb95fEJvGFHEAAAAE1NykAmEyozyWVGCCgJSIQY87Z4LDi9XLKCBJZKGQztSeWpL4FjT7Nq+qQkWyiEblg4BVsrPK6byNAfqR08jIz5HWvRrlCVqgdefIrouT9TS0cLXD5AvjcNSzi5xO3jUBJHhk0vdUf4uZAkwbI6Fkxjj9KCUziarTo4komBr2xCoOoz5E6W77+6//uAxP6AF5mbO+0k2WrBNCe9phsUVnUAxhhL+0UyTo0zRR891/s8d2h231Pj/tNwpiNxLNWLVr4BmEQIAAAjLwyFNM0xjKHW4ZiRt8mu8bIoNdBUCtlmWl81DhoWZpXgSfYJHsH9Zg12egiNypmr3u5K1eJ4xVp7sIr0DsLwb9OdGRwqLbx6Hi545LhWcD5Wte2YYm46H2d/1YRMSdE88LR4uZsoRuUXp0P/fWWTxHF0rNnn6PRUditWiZ4vTMCVpDZt1UtVtb2zly/LIQagR86oSZSQVTRFpZ0wpqKtMyr2ZqNfvGO2yWgqcKFxxBfecEkhERAJLd3BBo5EDvQszBgc2YVoSgaBTCgakGIxaoREKoJE0kCyp9l+3JDDbtPxSOhLYJi0qf5paTLQDaMFhGCQbAsRRJyYcQDiDS4uaEwdeREBvZrZJJOjR/CLGiGNyedRlG5YwPZGKaBNXqEdakfR0RN6gmnctUSko8T/+4DE9AAWOZ877TDY6uCz5v2WIyzE7SgwqyoO0XPW0i1j5lxji6CqO8IxIVchEFuhkOSoYUw7qlMbQ00JWymbFBTjwCGUHDwr8knoiEiAJVm/CwRpsmQkvtpAVxHSjgrF4REkA3wYfSRAuMXmbfmUjbA5Kl1FE5x/7TPu1kj54HICiVc4hLYiiQqjeWndKPlmAfjcpHZVVIXn8VcyV8J9qdVR2ea37kuoGCm2YxL1p0mZcXomYXrKpWqrzcqNw21Uy9ObGRKBiIVT39dJyTyqnbTWMh9Ql3Dx0Li5PIUbOv5gv+aZmbM1t2Izt9edfGhZvx5ncKffYFpUNDATcm/AWIOVBzQfTDwgVQzFrhqODTSKQAQTEC9IMERqr5wC0t56KPO6sad5H5ZAM/hVZ+67roWxgYPkZpGLkZdqyHikelgNkaiYLl0Ir6LDQlT6aigUm6GRqRImCiLCFZ2ySWYUcfKZrK2aRwx70yiHIv/7gMTrABY5lTnspHeqtTQnfZYatCkCZJUCmhWVKeo4Unj09pW5k3tTtpr2bXrlVtJWV3Lneu4e4a4l3dv3f9mJbr7+xpXMokVwExQJMcuHnAZIaxIBEGCBiEapW6Rbq7BguMIROEYRKU3k1Ozb+rSgh5YIWFpqRdsRjUZc9uyagscmSIroICUTj4cYqk0UQrImFpzx5COqQd7snLLL+jhSzy1XvPQua34lkgd0NkrL1Dq9eflLX23bVOSo2TX4rInXGFTS5nHu1aI488wGKKKiyOy2SfMHqeav0edKsmcufOqv/dTQd770Y2dCzdMtW5BVmRO62bJHmAWB0Afu4YhBUyARTdtO4HNIZNEDXOAqRuSbnhCMYJDxEukDQkPqZjgdaShGD/MoY2yhsECNJan8sLhQxAMspaRlSAuW7jrX2jNSY1cx+BDPDeyGdBsXVpitqd9aJdvOLTheX4HXV6hlY53pHoH1RYY00dSv//uQxOeAFQGfO+yk1qrcM+Y9lhrtL9g1XpKyBNkk0S0aJYRw3EY4LwQL8mWTPbuaq+ZJVZUnjymXfbaKcpq5TWg+28GR23/+0pdm31T63r59djS7ZKr1aTv1GpjMxATkl2Pk4MgCMDIFQxCvN4WNEAFmQGYroMCDCDE+0BNJDtKJbM/AL3RRzH9lEgplHYq3Fbbbgs0ucMTpMXlJ+vXPvH1yyeE7z+IYlNYybw/RlmrRbLNccoYH3IVWDa0d1UuZaMxsciOKrCSSua6FSiY1zy+d5ctc7/2tUmLfuzHbR8YgkckfsuRRPtkGUczHwdT5++Nby+5m5r1T1TU82vLjxOnfo4pDIgALltuPoVIhRlSBnygAEmXCAIWICxE8LoCAeOkXeXiWqa0lZbtSFn0CutE5TBkdyqclVU4WS8RlFXTMS4DZBjbLi6sZYfejYULkEPVolm/HDUDKSiI22Jx5tmnmSY5ZKMB/JGUvMLany6y5aW/jZMX1ka1i1nPO19ke24rtdNsMZGajbMWXDFmR85jxqMlY/1ZPyaPoqfZcZfeS//uAxP4AFmmfMe0w2OqiMma9phql3s9sePu7rNtItR2o5GIOo5+AeCI0IpWba4DkUDNzTqt5AbkUknueAMlOYVh7foqwGprSzktTniCoYCsyMbIZGKt5ZFcZwRiyOYUD+TFtnllkerfhOowkEMHj4wEY6Q3J6Bl2FDbgbRt13rRmj2wZd+p2/Vt/HTw921CUQ7Ayh3CQQo9ExPlhy0p3nbyJpFX3XSNbZQ04xC4NLqDzuXLaUt2mUdaE8VOT0q+xbMl77IRufc7pM2sz4C87Fb/jrFVlEFya20WukggwKwyw4zYc6kkMZHnGGHfggEDgpgyDptwC5wUCvzMdcYSMLNTphqWzhvoFjdYqjXiaFIiwnLwoWis3hPj7k5QQvSKYRBicENQVI1R9FR4+bffOZrZZbG6okx8WF1tJ56uscpD15IrhpBxJjjIMKckwHmLGMTNzTGxdOo1jJo7OIZkogiIiCmJGjP7JvWCEoZL/+4DE/AAWAY0x7TDT6qk0Zn2GGjyUxtW7QxfMWzpVQbMZNT0dRTzHs1WUuWDwIkIpV3YkhT5z4jcJBAsDAcKkAbRmQkkvjSxAlGqjIKSL5pXuk3KRbjlM+kldiCIfizwNlQQURzYnhESRPKfHNCnF6xwSSPCGlFrDR9ks0pjjJSWllk6RnPfzPMXjZY2yHWHI1vHjGqwvdEUEJTwiwEMEBoBCKSBYBxA4jaCOIOZUG8UQVOBJQVLGCDuEnwOTlK4uDl4Yl0kFwRz2pgw8KvAwA/1qvpCYUiMg3f/tgWpWmaaGiInMFC4jFBhUzAmOICy6EPpbGAEJ6tWm7mbAYOhUCQfdsw9bn5VWs1pKxGxJZTKYrDUeZrJ5mDRVRPFkipgSAoVKhdsV5W6UtAuUVWDcERdlKYrFmSFYpBBGWEUEiCbCJ0WmlEksOIXaVqoQjcg4xUtyUVu+cZA9etBYkEiTsoTdFHJYkNHt7h9iJ//7gMT6gBZdozHtMROinjNk+YYO5IyJNHJwa1XGWpqqkREzgU3YzQGSEDLY44DypEGRaYoARgO2gQ2AmQKRF2TAEAMa1pdaU6zocwlUsYa3jOZuAYbmxyWj1CdIBKVGl3zYNiCYz6EcMOnBm2eq1BcCNQ+tNDJxU0UhxWxlYrIlyYvtnihcXkq2u9U29YtZbvVv7Kp7mU1Yktp+hTrdvMv5xmU0QAKy7MpHEGrLeEMWe7y0n3PRTop3VfuWQtvUUkXE7tTcNXf5nuN9mtcnrJF0yqp7gVZDFDBctskPQ1Xx2iGWIXVN/J3wigipW0rkIJkjZUJCSrEmm09d9mHNkgN+nTv7ZK98QP0pmOwsSOHVSSBAQ1ZeduUVED2rBxbEsuFFBQkMfTFt3erxZX0P0JuMnJTpAsWWTllMeidEIzjDGOLtsxBrR9gfNelSzef4ecjc2VNGNy7Z2ealvLG3/FTL7O3kM42p69NqM+qn//uAxPkAFSWhK+0keQK5tGU9php8z8Yu4/r52ai2lFG6Y3373aO29J3pt+KvVhEqRCTVaiBvqLRkVpUQmhJmglphGWHiBWZwcZESYUOwdgwGMwlLq5IpWu9UDkUNt92zRhkTvw3ajkYgBc9ReH506DVSVjM+oem6l1SjD4Sy6kMmkSqz9ncS1n0zzZaXKYnf9s6Oirq+KFZMf3YKySN+HmexutuSfNImtgurlpxdgZghTqjEbBHWo5gp3SYXvYPVU1BorpMjVoLpHODwtieZVbW4ZeJakFEl7LK/pYGe0Wvu/7J4ZGiFIhDVlsgBMDiQHCZG/IUeJFALBtyxjXwJMXlAwSoBgy0VBVzYIh6VhGVM9i5dCtdodPNE5sxit9vnLbXLXOfJJitiOj63y0ueqqqmFASjM3hgI1VV9VUgwE2zRjUBEkoVdmYVGCsQXhv8O4/8SXioR3P7/zUuhUxBTUUzLjk5LjVVVVVVVVX/+4DE+QAWLaMj7LDVAtmz5DmmDuxVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7MMTxA8886RvsMG+IAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' 15 | ,anchor:0.00401361 16 | //'Low Woodblock(L) 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /residentWAFSynth/webAudioFontFiles/LICENSE.txt: -------------------------------------------------------------------------------- 1 |  2 | LICENSE 3 | 4 | All the files in this application are covered by an MIT licence. 5 | 6 | The files that have "FluidR3" or "GeneralUserGS" in their names are clones of the eponymous files in 7 | https://surikov.github.io/webaudiofontdata/sound/ 8 | 9 | Licences for the original soundFonts are at: 10 | FluidR3: https://github.com/musescore/MuseScore/blob/master/share/sound/FluidR3Mono_License.md 11 | GeneralUserGS: http://www.schristiancollins.com/generaluser.php 12 | 13 | ji, 14th January 2020 --------------------------------------------------------------------------------