├── .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:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAQAAAZwwAjIyMjIyMzMzMzMzNDQ0NDQ0NUVFRUVFRkZGRkZGRkcnJycnJygICAgICAjo6Ojo6Onp6enp6enq2tra2trbu7u7u7u8nJycnJydfX19fX19fn5+fn5+f39/f39/f///////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAOAAAAAAAAAGcOhJv1CAAAAAAD/+8DEAAAGgANt9BAAA3Sxbj808Ai5djQjEiJRTBuA4Hwfh8QAg4HDiwfg/y7xAGIIf4PygYlAQdBByw//9Z+D7//w//Ln4IQQiEeBiWZlEwJRcYKBQQSV1hoAs3aIcMaBjM2ItDw6SxlYuJgFPsWWKYFx06S9yLAsEGHKOYJDIhxdRg4LYUCrBlBdp404Ity+Yheg614+SRqVWGnFJQrxephnYCEj8NNmNm+luGfjKxPjqzCqaaRXR0qpX+zK5sdqNsJpfw4sF0uwtRzn6woewqYsD2kJ5H8ZXIVZzjT26LYVY1wYEK+oKrV93UCPAzN8zLnbFPHhUr5EtFcYVZnvtuFHR7alWemK73fe6VhM0bM/19Y3n9temQzRmLb4Ch67//////Wq+mCWt0QyAAAHy7CO65UiXqEJkDXVOBS1TOmRLDPPWjUFw+fKJRHGwn5cPhcS8monEkFmJiMgeSNa2NnOpIorNa0UUjVlPrR0UTEseySKk3RedSQdYxT1aSbtZaqJgamqrLQTslTUzZdNW3S3ZN1JJMmbM1bS86NkkUa1VWQWut1oJWSMkjUEBlThEHBKk8oVV5V5AGVDAAAAAwcUV4EIdBg6SXBiOOJHFG4hBIQCFziwmViJgGr+hQ4MJhxPltwwBNbGQSXrEIVFhLGHlWczmHz+xByxopNYk63a1MMhQM7apWOr/ihAITExJOJ31yzycMNosQ0rG98qeZWFv3HryllK8mtvq1FhqWrBFh30jMBz7uyCMwQFh3kbm/Evdpx4vee1eD8zLgyN/nbj7tN7F3+lLrQU6zHHDZTZtSV+Xaks7L6N0oIqQxLa0aiNWvN3JTSW9Y1I/jqUaOMHj6rxhHfbJ+rmAbWlo0jkQccdruWUSo/fNcvN3s7lfv/Ycl/5Jk51RbTKq13jj1zp9tXbFPh3MDAAACXPMNMyqCg8KqHhGYhS7Dixhm5i3jdwCLBIBk+aDP/7kMTaABJBWWf9hoAj7LQn+cyauKkGXwPjAKrOTMnYSuGgjbq3IkYclECEDOaQonSceMCK7EmLw+PGWpIJUmRs6tMWQpdewJAmMlNF1A0hFTZQli1BpEH+dc81FCQowOR4NGmlyyxMZLnRLMlZXQoVCFkPGno1wqodSNjwQMlr1qCFLqTD4hmWWuSy8UEhFm+6uWxyMC043HCTcImrk0ylK0MUsxal4+FbO36nCG7iiKt5AuZlAYKgIq8JtCBhak7xoFAOwn/DyJoWSGBRCONCuOnIu5LsuDGJM1lpvztt8XdhboR9lVEXtgVxI1fobltue6S/elyplKiIiTRuMszoZapHX97Aqc+mxGDJPSTCBNHcIxIwyFmQ8XEEhQkws4jREyaT4KsHijAoKRREis4OuN9F7jCEW8GYxUUhNpbzaT1x1ChQmSRY8sudQL2xGM6nCVJS9SqnHEjMZBqm2UVD8qcP08jQEJXsMKZzMCAIABnD/BaMwRQy79gBka52TDITSLhJaj2ABaG7MmbPOhRMZxVgEDZRBoSjZN0SdKkNtv/7kMTZABhZo03tMTai3TRp/ZSPbNTzSPNIzvcJNCD/ZVe8gzpcPKs7x1AixlmiKfpRcKpFRkWZCrQlR4UkjEoZn7JPOfqG7VDxnULK1wtLSuY2Fxg6TTAiL6cTpP4maeTrK8onoWp6UgnBK3AwAtIjcIoNxZtJ84u3xX9PZFSKOFyfOk3va2oyQrs88kmpjovi5rPOMZRju1Jm19hHXLe8ctid7gM9OqAIAAAV58hpkhpCWCzmSEDsEpg5kCBCUxnRZkgZMBdJuL7J2sdct8mRQRnDD3Wm+q36afaI7zoyaS2kzUKxhgzRGzJ6GyHSrVVtzwSVEZ2bJEURJPx6BCB2sZLLYgUWIZZH3C+hAohtuV6HmXV7VkxkhtIkj6NWPwfXsy12KtTUtYnqXfau1VqNthLVldeW0sE1Wl+KHz+q3lqlbVhmvHC9fLL1nqMyKUKGjChw1EmVNyZBspFJPVLAiPhV3hC4iFEQiAAZziBgUNMeON4ljQWXnCHXTLhxGbUyBQAmGxdH5LhBMjU2Bgi6ZuvAHGUPfx9YdqTCaDR4Zf/7kMTiABjlo0XtPTPi/bRofaYO/F/CCuaEQg4ObpJueBUyRiz5fKp8hhwobXHVrpmXTWxHgOrVO0VzmcLg1EKO5COiYWHo9fWVWWpIwYJcWFQ+BSHyqWUMPROrYszTOE9THLOqDumVes9TktS9B/wqRyTMRNzxS5KJvCtZkNc8o9/Tsw95m7gg8deGDvLqAgghBXjylDQWFmaGM7MUoO0FTgMKRAoMRACQkFAIiAMAZijzBMcijwNrSxTrYp3koh6XUiDMjLApOqQRemHl25TKXng5rNcO4W3nCs6ifOYB9ev1D8trWkbjY+KYrtEGymBeDw2i0mGNqlRksrserb+QqmLhKrL3XatmRViTDrJCsZmNx9oieSSuVol9lJMdpRtLR4226N7MTkXH5rfz83qTiU6Ot/f37D81p3P8pKGrI6eWQyBJBM3EkCaBe8VKQaSxDEQ3+KoUHJ1hQMGGhY8Ab885hCyqbC+mtHLs5qtGMTEyJBVGEhYi7ZET1J0RO4rtlgshMzgbL2ep3gkUNoTsEpMNsioWYqyF8W4h5rJClf/7kMTkgBZNo0PtMRci0bRoPaYa7AtNIKgqiShp+E7cvideBAVZFSOdyjFdW/U3zGjgkLEKRcwtNGjZeYm1Buot+CT9G5MwXIbQeo7XY+f0zC5yrwqpRxjavbryq637D7GtY3NUplfvMb2VUxBCCEvO0jNGGMcVOG8dkCvA8VKCAiMmjIA1aE6lUmUumPBIFJ0+L8rG40pSwvIE6dbFeisLlR7X6yREfAerutW8hlHuNYrFDqRK2GhSlB2CIV7j1EZWp+ZGQuXISYCRITEXs1KQpt9PVfDkBYsR4r57CtvLZPiZUwqUNpE8TEHycyxPzWrJTPby3d1k41929udSvPCe90IxzvjTv7jDPUNy88IPSx3XzFZJFc9CyblDIMgpTcBWCYULMTKpXQBqE8INxTWBiRIk2ICY0hREXk/4NBsOgGzE1y4OtLsnUpZ6kn8VizzdHPrzN27HYDgp4oJtalCoZRvcxbvtPQLHFvUQW5WBKcbZSvieUK2eoXTCcJB565d7zMroFq05gu5AydeTnklrJmJ6F2+XO1rmukz/9msFrP/7gMT3ABaBo0HtPS2ivTPn/ael7bkJzPemlZ8wJQAUSGAykRs7yCZA4JUFGaMhVGgmMsURS3IeKZCS3FkgQdmCmTbIRAkBqbDWBIiXAEMcGFVk5UGsm4eaDAYOHKF3AWCCSmuKyPO9cgfZm1Z9Li+35vwS5GENQ1YadErs12nuUO6KV5QW2BoNNjVvfS1fZEl4qrT52rpOXRPsNRyqj5tMmOzaRcbQkscS2xH60k4PzbajVKiCjQ1lq8fsJrLt6PdJ5qQYFNIJItrG8q91oTjWIkpC8o2gknLmSRjl4HZK5t8ok1a2d7i/V7tV2ZFL93lrp6Kmlc8w+YVRIohJ3co4BwszJo6DV9hFDA4CSmOIDJkGFhGLMMDbEyJHd9WktLfFlroVHjooBt3KePu9T0ztEIOHKopSRAMVNgwJUALkiFU/QxWG2yGPS+DKG1AoPoVcD52JKSu58qJp2IR0ohW8UGCqUvJuSW4hiRpi//uAxPEAFo2XPe0weyrYs+c9lhtdGGsfqpfU+WlkHTTRWlBvIdOWxZl4ZuTB186hH2Jk5EbrHbUOCDcR6gbtCPkTvYvDFwNsEMxZ97nNQzKYJJSsxgEIMAEh4xBZU5gF50BpMAGiRIFSqKBpMBdBecMxhbCxX2n35eWGYvai+sYbbBRr0ij6ybt4ZB0ggKDjyEGXtkyac5piRh5ovEkNLZVBkGV1SSYKG6OIF6BGKxwSCI8TmW3yQrP+Sxxh61ERuaVN+0McujAoItcwHjmFXuNU5mmsRmpd/mzOYzziWq3P5OLTr5TF/Zt32aaLiu6LMW2lOc+T8cs933G2hFQQSk9vjiJzQBzKCzbIk/zJPCkIhYYlMRC7pYAEIMvqMAkpHdgCA3AVNNxZJli8Nmz8RFWsAmZD0eHUPHaw/Qi83VtByynnYXsEn0bp2JC2+2OPQbW6qt3aTZYW7XZYCE0M3mnq1catTzaFKhLsMyn/+4DE54AVpaMz7SR3gra0Zv2kmuTA+iU1PUDYfsuj3AIZTtvdzTHZzTMTIm4XTlW7qq63Ieod8hM8N48r/W75u9qjpecaU5MzvPa02epM5LfZKt3UyDitv/NouBwglSmHaN1EdAwSNIEVBByMqijAmFRNnsp1KmU+9VI+rK32d7OKyevUf6tcEohpvXYXT0wSIScskEyJ5aLLlKmzBbQlLGl4/t1U5FOIFbCxovH6LnrIb9lK4fYwNPLtOR4Xkp2jrSW7FmHnyZuX5Z2Vtecx+jeHWrTFZkPXpq2Nu3X+DFUjkj5KYMUehm0ciayuqzI5FIPKVBFxxa+OLV2fUS86vkOsl2MhYpN9gOoYTJgEgkWWjsRKuXrCgyeRuKnTyCyEMV6wKz51nidVs8Pyh0r8BQM7NStKqr8xVhkjvTUW3Bb1T8rwfeYaMpzXl9aP5y5oqgORIhUTTTZEQBQLe0RpkQiQNtyIRSTpWhIUZv/7kMTmABXpoTHtMNPCvbPmfaYOuaYqNzbfWVFz/qAsWNCchQdHRtbt05p813E0IOLrOejqCUIeRTI1xs6LBK645nDGvJCcDgsqxgkGhxngPbcdsAKV6wnDfSEuz3olVMOhity/7mpcYT5wsGKtiWEjYGIihqNJJI0YHGiWcussZrSirIHRc1w7HCAQD6EtnnQB+giO7UpVTCTYwWnKwqCoZ1pbv/Uz2FKN2l1VoRrKftIePesvZDibMI2RUomgowqqkycQNCeYiEhIxMXhhNDcDpo7edWyKsvOSeWQT6F4r+Xt++u1Tjfxm1rPnbd7Uz2+X9vPfecZmV2hGi0fv+EkCFXOc7n8ZUDjcllEjDXKBkQBCdkKqB28BFUptEFQSCga7ZVDRRDjS7kue9+3aaNCaNF6lovLqCBgwpck29NHdMytWEkMjyKD3qr1k60XJifTzchD8uitReVm4oXYHi7xy8ZCWcsrbZ7D/NdaUEoMCkzSYe1EU4Ko7BBJkzBZNEpaHLxHkyz03cmtar2cObxExFNLahmde30NZ4Rk6O9ui//7gMT8gBaVny/spHsKljPmfZYaMW1E3sS896hF4Rbuy0F9D3V2yGLbd/+ewIRWcTRdV7R2EO+Cgo2SWoR7MRUHEpZtwRKLgiIB46zMYYfR2Z14EpwHTFE5gLO4ew6PHl0jK2GiYSmD40baKkYDkZIj6FlQlGpTgwwpzqcHspaZs8HnlsLE8DKcZbGifTJTg4LSRNImxXpz6698rN3Mmyqq53mOyYSrTWbr9UkbbnPtKrar7JhGYT14z40OzHvjHqXSLTLtEbbpE+aOrnbKmpZRLZdrQjAFPmM6MVw0Q7nKshslohgoCACBIN9GqJAJjPMuZR9rVqG5fBUBv5FaOUST4dsOne22VKmCJMPC5IikduhF2iyUhKTsisQBKLDB7XZ96K14LrCwsaR6QsoibCa2X2lGUE4QI6chJjMVEO6RrNPaYVtlhWbBQ4mhbUbO1fkmkWnkYO0px0NFZNYaHNDHc1MHPV90IwaOfpZa//uAxPsAFV2fM+yw0eqks+Y9lJpxY2YT5GLAg9jXS5mXRbbIAnoEHCEaInrKjCRybQr8aSEzx+wqOWw1dGVQAtYlWsO6MccdeDp0TSOrJJVOKA2VCAW7iCfkqA1PCobCUX3R2ourAyuKgijuoeKr6VY48tfh+rlX51bb+oWkjRPGA8LKPOw9utrbzp94ckY7RZKC2PSTLJollk5MwFwlWr3ClPmGUaTvtj5Z3bWdE3S4d2p3ra9crTXz9UGRkFRM4Y2Sm71FfWdNa1/vpu//tcqdYbvIc0Gtlt0D7RYgTXKpMBiJ4PU0LTJrLwMkkmUWO8YoAwx/nhgCOss7do41A8xFoW/GpTWer+vtJZmC2aRGpVD51KSIfTQrzovGR0VDlUWCSzEuqX0DKzF5lR5b6yCShQKMBiesi1ZR5WzM042tzxaChkl2VZKe6BNsMKAZn0jut0uxh5gWSSRJGLdqgvDj8rp/6kmN1zTlQ27/+4DE/QCVMaMt7KR3gs+0ZP2mGjg/z74LmWbtuZqumR9T2s80l7df/pV/6Is1rLlmQWORtsDlQiSZlAFxEFlQ8BDaPxE/aqCiiWqYw0MUCZolAhE6cZaU0mFMud9mglc6mKkkKgJ1kknK4OV1lbSwqDhZfEvhcJDic71EytJ7/ehoTrt0xcjVc9Lyw5eZe9QcKoWGnu5dfm68PVFGthToN6ah+gyDETrhHs24KC6211SZan6bOIUTDB2sNgqR3mJWekjd93L8GODRkrgjtuXZju238BJLLZP+5liKaQeZpYQTquY5EgQUKCGUFXKoBKSYpanFKFgyoCHCMkdBmDMqJKtlcNtipWCwRy6xddw5bXgZQXywZRnA9LjonUk/jY5tQmcYOI8ZcRlui73FTjNcSVs7EtP7cwula3aqh3oZ61Zx2znWb+h/Fma3SiRXOLHICyCcoY5CBEeLuc3Mps57y9hHw9bR8Wn8Z3Rkj//7gMT6ABZhnynssNiCvjPkvaYOcDbCsaoFcaJGQSQqJEsZz/AWX2we/epPH/bHn/Dte6h2ofcjdgu1lBl4VWJ75RE/WbGpWgklYNiAU7H0dgSIxsVDAQRQMKDMESRrqqvw3Jfidj+v67Xrkx0XUwYNEpCRdczGkR1BoIpu8lQ+PqNUaUEIeY3TxYXCqusugHVe0v4nnKdZWNskLLXScoH6NTscHPLcvm9WzbvTn1yXqLro6elkgoSHF0xJ2pgAh6rNKZk5VtDIoZIWwe6VjcszACcqKjhvJMEqB/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:'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z6EcMOnBm2eq1BcCNQ+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
--------------------------------------------------------------------------------