diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index ff5da74d..ef5bd33f 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -23,6 +23,15 @@ const generic_params = [ * */ [['s', 'n', 'gain'], 'sound'], + /** + * Define a custom webaudio node to use as a sound source. + * + * @name source + * @param {function} getSource + * @synonyms src + * + */ + ['source', 'src'], /** * Selects the given index from the sample map. * Numbers too high will wrap around. diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index 9f88b0fe..c28dfb2f 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -1,4 +1,6 @@ import { toMidi } from '@strudel.cycles/core'; +import { getAudioContext, registerSound, getEnvelope } from '@strudel.cycles/webaudio'; +import gm from './gm.mjs'; let loadCache = {}; async function loadFont(name) { @@ -8,7 +10,6 @@ async function loadFont(name) { const load = async () => { // TODO: make soundfont source configurable const url = `https://felixroos.github.io/webaudiofontdata/sound/${name}.js`; - console.log('load font', name, url); const preset = await fetch(url).then((res) => res.text()); let [_, data] = preset.split('={'); return eval('{' + data); @@ -114,3 +115,34 @@ async function getBuffer(zone, audioContext) { } } } + +export function registerSoundfonts() { + Object.entries(gm).forEach(([name, fonts]) => { + registerSound( + name, + async (time, value, onended) => { + const { note = 'c3', n = 0 } = value; + const { attack = 0.001, decay = 0.001, sustain = 1, release = 0.001 } = value; + const font = fonts[n % fonts.length]; + const ctx = getAudioContext(); + const bufferSource = await getFontBufferSource(font, note, ctx); + bufferSource.start(time); + const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 0.3, time); + bufferSource.connect(envelope); + const stop = (releaseTime) => { + bufferSource.stop(releaseTime + release); + releaseEnvelope(releaseTime); + }; + bufferSource.onended = () => { + bufferSource.disconnect(); + envelope.disconnect(); + onended(); + }; + return { node: envelope, stop }; + }, + { type: 'soundfont', prebake: true, fonts }, + ); + }); +} + +registerSoundfonts(); diff --git a/packages/soundfonts/gm.mjs b/packages/soundfonts/gm.mjs new file mode 100644 index 00000000..c0e57dcb --- /dev/null +++ b/packages/soundfonts/gm.mjs @@ -0,0 +1,1787 @@ +export default { + gm_piano: [ + //'gm_acoustic_piano': [ + // Acoustic Grand Piano: Piano + '0000_JCLive_sf2_file', + '0000_FluidR3_GM_sf2_file', + '0000_Aspirin_sf2_file', + '0000_Chaos_sf2_file', + '0000_GeneralUserGS_sf2_file', + //0000_SBLive_sf2 + //0000_SoundBlasterOld_sf2 + '0001_FluidR3_GM_sf2_file', + '0001_GeneralUserGS_sf2_file', + //], + //'gm_bright_acoustic_piano': [ + // Bright Acoustic Piano: Piano + '0010_Aspirin_sf2_file', + '0010_Chaos_sf2_file', + '0010_FluidR3_GM_sf2_file', + '0010_GeneralUserGS_sf2_file', + '0010_JCLive_sf2_file', + //0010_SBLive_sf2 + //0010_SoundBlasterOld_sf2 + '0011_Aspirin_sf2_file', + '0011_FluidR3_GM_sf2_file', + '0011_GeneralUserGS_sf2_file', + '0012_GeneralUserGS_sf2_file', + //], + //'gm_electric_grand_piano': [ + // Electric Grand Piano: Piano + '0020_Aspirin_sf2_file', + '0020_Chaos_sf2_file', + '0020_FluidR3_GM_sf2_file', + '0020_GeneralUserGS_sf2_file', + '0020_JCLive_sf2_file', + //0020_SBLive_sf2 + //0020_SoundBlasterOld_sf2 + '0021_Aspirin_sf2_file', + '0021_GeneralUserGS_sf2_file', + // ? + '0022_Aspirin_sf2_file', + //], + //'gm_honky_tonk_piano': [ + // Honky_tonk Piano: Piano + '0030_Aspirin_sf2_file', + '0030_Chaos_sf2_file', + '0030_FluidR3_GM_sf2_file', + '0030_GeneralUserGS_sf2_file', + '0030_JCLive_sf2_file', + //0030_SBLive_sf2 + //0030_SoundBlasterOld_sf2 + '0031_Aspirin_sf2_file', + '0031_FluidR3_GM_sf2_file', + '0031_GeneralUserGS_sf2_file', + //0031_SoundBlasterOld_sf2 // pianos until her + ], + gm_epiano1: [ + // Electric Piano 1: Piano + '0040_JCLive_sf2_file', + '0040_FluidR3_GM_sf2_file', + '0040_Aspirin_sf2_file', + '0040_Chaos_sf2_file', + '0040_GeneralUserGS_sf2_file', + //0040_SBLive_sf2 // ? + //0040_SoundBlasterOld_sf2 // ? + '0041_FluidR3_GM_sf2_file', + '0041_GeneralUserGS_sf2_file', + //0041_SoundBlasterOld_sf2 // ? + '0042_GeneralUserGS_sf2_file', + '0043_GeneralUserGS_sf2_file', + '0044_GeneralUserGS_sf2_file', + //0045_GeneralUserGS_sf2_file // ? + '0046_GeneralUserGS_sf2_file', + ], + gm_epiano2: [ + // Electric Piano 2: Piano + '0050_JCLive_sf2_file', + '0050_FluidR3_GM_sf2_file', + '0050_Aspirin_sf2_file', + '0050_Chaos_sf2_file', + // ? + '0050_GeneralUserGS_sf2_file', + // cont + //0050_SBLive_sf2 // ? + //0050_SoundBlasterOld_sf2 // ? + '0051_FluidR3_GM_sf2_file', + '0051_GeneralUserGS_sf2_file', + //0052_GeneralUserGS_sf2_file // ? + '0053_GeneralUserGS_sf2_file', + // normal piano... + '0054_GeneralUserGS_sf2_file', + ], + gm_harpsichord: [ + // Harpsichord: Piano + '0060_JCLive_sf2_file', + '0060_FluidR3_GM_sf2_file', + '0060_Aspirin_sf2_file', + '0060_Chaos_sf2_file', + '0060_GeneralUserGS_sf2_file', + //0060_SBLive_sf2 + //0060_SoundBlasterOld_sf2 + '0061_Aspirin_sf2_file', + '0061_GeneralUserGS_sf2_file', + //0061_SoundBlasterOld_sf2 + '0062_GeneralUserGS_sf2_file', + ], + gm_clavinet: [ + // Clavinet: Piano + '0070_JCLive_sf2_file', + '0070_FluidR3_GM_sf2_file', + '0070_Aspirin_sf2_file', + '0070_Chaos_sf2_file', + // 0070_GeneralUserGS_sf2_file // half broken + //0070_SBLive_sf2 + //0070_SoundBlasterOld_sf2 + // 0071_GeneralUserGS_sf2_file // half broke + ], + gm_celesta: [ + // Celesta: Chromatic Percussion + '0080_JCLive_sf2_file', + '0080_Aspirin_sf2_file', + '0080_Chaos_sf2_file', + '0080_FluidR3_GM_sf2_file', + '0080_GeneralUserGS_sf2_file', + //0080_SBLive_sf2 + //0080_SoundBlasterOld_sf2 + '0081_FluidR3_GM_sf2_file', + // 0081_GeneralUserGS_sf2_file // weird detuned + //0081_SoundBlasterOld_sf + ], + gm_glockenspiel: [ + // Glockenspiel: Chromatic Percussion + '0090_JCLive_sf2_file', + '0090_Aspirin_sf2_file', + '0090_Chaos_sf2_file', + '0090_FluidR3_GM_sf2_file', + '0090_GeneralUserGS_sf2_file', + //0090_SBLive_sf2 + //0090_SoundBlasterOld_sf2 + //0091_SoundBlasterOld_sf + ], + gm_music_box: [ + // Music Box: Chromatic Percussion + '0100_JCLive_sf2_file', + '0100_Aspirin_sf2_file', + '0100_Chaos_sf2_file', + '0100_FluidR3_GM_sf2_file', + '0100_GeneralUserGS_sf2_file', + //0100_SBLive_sf2 + //0100_SoundBlasterOld_sf2 + // 0101_GeneralUserGS_sf2_file // weird detuned + //0101_SoundBlasterOld_sf + ], + gm_vibraphone: [ + // Vibraphone: Chromatic Percussion + '0110_JCLive_sf2_file', + '0110_Aspirin_sf2_file', + '0110_Chaos_sf2_file', + '0110_FluidR3_GM_sf2_file', + '0110_GeneralUserGS_sf2_file', + //0110_SBLive_sf2 + //0110_SoundBlasterOld_sf2 + '0111_FluidR3_GM_sf2_file', + ], + gm_marimba: [ + // Marimba: Chromatic Percussion + '0120_JCLive_sf2_file', + '0120_Aspirin_sf2_file', + '0120_Chaos_sf2_file', + '0120_FluidR3_GM_sf2_file', + '0120_GeneralUserGS_sf2_file', + //0120_SBLive_sf2 + //0120_SoundBlasterOld_sf2 + '0121_FluidR3_GM_sf2_file', + '0121_GeneralUserGS_sf2_file', + ], + gm_xylophone: [ + // Xylophone: Chromatic Percussion + '0130_JCLive_sf2_file', + '0130_Aspirin_sf2_file', + '0130_Chaos_sf2_file', + '0130_FluidR3_GM_sf2_file', + '0130_GeneralUserGS_sf2_file', + //0130_SBLive_sf2 + //0130_SoundBlasterOld_sf2 + '0131_FluidR3_GM_sf2_file', + ], + gm_tubular_bells: [ + // Tubular Bells: Chromatic Percussion + '0140_JCLive_sf2_file', + '0140_Aspirin_sf2_file', + // 0140_Chaos_sf2_file // same as aspirin? + '0140_FluidR3_GM_sf2_file', + '0140_GeneralUserGS_sf2_file', + //0140_SBLive_sf2 + //0140_SoundBlasterOld_sf2 + '0141_FluidR3_GM_sf2_file', + //0141_GeneralUserGS_sf2_file + '0142_GeneralUserGS_sf2_file', + // 0143_GeneralUserGS_sf2_file // bugg + ], + gm_dulcimer: [ + // Dulcimer: Chromatic Percussion + '0150_Aspirin_sf2_file', + '0150_Chaos_sf2_file', + '0150_FluidR3_GM_sf2_file', + '0150_GeneralUserGS_sf2_file', + // 0150_JCLive_sf2_file // detuned??? + //0150_SBLive_sf2 + //0150_SoundBlasterOld_sf2 + '0151_FluidR3_GM_sf2_file', + ], + gm_drawbar_organ: [ + // Drawbar Organ: Organ + '0160_JCLive_sf2_file', + '0160_Aspirin_sf2_file', + '0160_Chaos_sf2_file', + '0160_FluidR3_GM_sf2_file', + '0160_GeneralUserGS_sf2_file', + //0160_SBLive_sf2 + //0160_SoundBlasterOld_sf2 + '0161_Aspirin_sf2_file', + '0161_FluidR3_GM_sf2_file', + //0161_SoundBlasterOld_sf + ], + gm_percussive_organ: [ + // Percussive Organ: Organ + '0170_JCLive_sf2_file', + '0170_Aspirin_sf2_file', + '0170_Chaos_sf2_file', + '0170_FluidR3_GM_sf2_file', + // 0170_GeneralUserGS_sf2_file // repitched + //0170_SBLive_sf2 + //0170_SoundBlasterOld_sf2 + '0171_FluidR3_GM_sf2_file', + // 0171_GeneralUserGS_sf2_file // repitched + '0172_FluidR3_GM_sf2_file', + ], + gm_rock_organ: [ + // Rock Organ: Organ + '0180_JCLive_sf2_file', + '0180_Aspirin_sf2_file', + '0180_Chaos_sf2_file', + '0180_FluidR3_GM_sf2_file', + '0180_GeneralUserGS_sf2_file', + //0180_SBLive_sf2 + //0180_SoundBlasterOld_sf2 + //0181_Aspirin_sf2_file // flute + //0181_GeneralUserGS_sf2_file // marimbalike + //0181_SoundBlasterOld_sf + ], + gm_church_organ: [ + // Church Organ: Organ + '0190_JCLive_sf2_file', + '0190_Aspirin_sf2_file', + '0190_Chaos_sf2_file', + '0190_FluidR3_GM_sf2_file', + '0190_GeneralUserGS_sf2_file', + //0190_SBLive_sf2 + //0190_SoundBlasterOld_sf2 + //0191_Aspirin_sf2_file // string?? + //0191_GeneralUserGS_sf2_file // weird organ + //0191_SoundBlasterOld_sf + ], + gm_reed_organ: [ + // Reed Organ: Organ + '0200_JCLive_sf2_file', + '0200_Aspirin_sf2_file', + '0200_Chaos_sf2_file', + '0200_FluidR3_GM_sf2_file', + '0200_GeneralUserGS_sf2_file', + //0200_SBLive_sf2 + //0200_SoundBlasterOld_sf2 + '0201_Aspirin_sf2_file', + '0201_FluidR3_GM_sf2_file', + '0201_GeneralUserGS_sf2_file', + //0201_SoundBlasterOld_sf2 + //0210_Aspirin_sf2_file // buggy + //0210_Chaos_sf2_file // bugg + ], + gm_accordion: [ + // Accordion: Organ + '0210_JCLive_sf2_file', + '0210_FluidR3_GM_sf2_file', + '0210_GeneralUserGS_sf2_file', + //0210_SBLive_sf2 + //0210_SoundBlasterOld_sf2 + '0211_Aspirin_sf2_file', + '0211_FluidR3_GM_sf2_file', + '0211_GeneralUserGS_sf2_file', + //0211_SoundBlasterOld_sf2 + '0212_GeneralUserGS_sf2_file', + ], + gm_harmonica: [ + // Harmonica: Organ + '0220_FluidR3_GM_sf2_file', + '0220_JCLive_sf2_file', + '0220_Aspirin_sf2_file', + '0220_Chaos_sf2_file', + '0220_GeneralUserGS_sf2_file', + //0220_SBLive_sf2 + //0220_SoundBlasterOld_sf2 + '0221_FluidR3_GM_sf2_file', + ], + gm_bandoneon: [ + // Tango Accordion: Organ + '0230_Aspirin_sf2_file', + '0230_JCLive_sf2_file', + '0230_Chaos_sf2_file', + '0230_FluidR3_GM_sf2_file', + '0230_GeneralUserGS_sf2_file', + //0230_SBLive_sf2 + //0230_SoundBlasterOld_sf2 + '0231_FluidR3_GM_sf2_file', + '0231_GeneralUserGS_sf2_file', + '0231_JCLive_sf2_file', + //0231_SoundBlasterOld_sf2 + '0232_FluidR3_GM_sf2_file', + '0233_FluidR3_GM_sf2_file', + ], + gm_acoustic_guitar_nylon: [ + // Acoustic Guitar (nylon): Guitar + '0240_JCLive_sf2_file', + '0240_Aspirin_sf2_file', + '0240_Chaos_sf2_file', + '0240_FluidR3_GM_sf2_file', + '0240_GeneralUserGS_sf2_file', + '0240_LK_Godin_Nylon_SF2_file', + //0240_SBLive_sf2 + //0240_SoundBlasterOld_sf2 + // 0241_GeneralUserGS_sf2_file // organ like + '0241_JCLive_sf2_file', + '0242_JCLive_sf2_file', + '0243_JCLive_sf2_file', + ], + gm_acoustic_guitar_steel: [ + // Acoustic Guitar (steel): Guitar + '0253_Acoustic_Guitar_sf2_file', + '0250_Aspirin_sf2_file', + '0250_Chaos_sf2_file', + '0250_FluidR3_GM_sf2_file', + '0250_GeneralUserGS_sf2_file', + // 0250_JCLive_sf2_file // detuned + '0250_LK_AcousticSteel_SF2_file', + //0250_SBLive_sf2 + //0250_SoundBlasterOld_sf2 + //0251_Acoustic_Guitar_sf2_file // detuned? + // 0251_GeneralUserGS_sf2_file // broken: missing pitches + // 0252_Acoustic_Guitar_sf2_file // detuned.. + // 0252_GeneralUserGS_sf2_file // broken: missing pitches + '0253_Acoustic_Guitar_sf2_file', + '0253_GeneralUserGS_sf2_file', + '0254_Acoustic_Guitar_sf2_file', + '0254_GeneralUserGS_sf2_file', + //0255_GeneralUserGS_sf2_file // no guitar. + ], + gm_electric_guitar_jazz: [ + // Electric Guitar (jazz): Guitar + '0260_JCLive_sf2_file', + '0260_Aspirin_sf2_file', + '0260_Chaos_sf2_file', + '0260_FluidR3_GM_sf2_file', + '0260_GeneralUserGS_sf2_file', + //0260_SBLive_sf2 + //0260_SoundBlasterOld_sf2 + '0260_Stratocaster_sf2_file', + '0261_GeneralUserGS_sf2_file', + //0261_SoundBlasterOld_sf2 + '0261_Stratocaster_sf2_file', + '0262_Stratocaster_sf2_file', + ], + gm_electric_guitar_clean: [ + // Electric Guitar (clean): Guitar + '0270_Aspirin_sf2_file', + '0270_Chaos_sf2_file', + '0270_FluidR3_GM_sf2_file', + '0270_GeneralUserGS_sf2_file', + //0270_Gibson_Les_Paul_sf2_file // detuned + // 0270_JCLive_sf2_file // broken: missing notes + '0270_SBAWE32_sf2_file', + //0270_SBLive_sf2 + //0270_SoundBlasterOld_sf2 + '0270_Stratocaster_sf2_file', + '0271_GeneralUserGS_sf2_file', + '0271_Stratocaster_sf2_file', + '0272_Stratocaster_sf2_file', + ], + gm_electric_guitar_muted: [ + // Electric Guitar (muted): Guitar + '0280_Aspirin_sf2_file', + '0280_Chaos_sf2_file', + // 0280_FluidR3_GM_sf2_file // broken: wrong notes + '0280_GeneralUserGS_sf2_file', + '0280_JCLive_sf2_file', + //0280_LesPaul_sf2 // missing + '0280_LesPaul_sf2_file', + '0280_SBAWE32_sf2_file', + //0280_SBLive_sf2 + //0280_SoundBlasterOld_sf2 + '0281_Aspirin_sf2_file', + '0281_FluidR3_GM_sf2_file', + '0281_GeneralUserGS_sf2_file', + '0282_FluidR3_GM_sf2_file', + // 0282_GeneralUserGS_sf2_file // broken: missing notes + // 0283_GeneralUserGS_sf2_file // missin + ], + gm_overdriven_guitar: [ + // Overdriven Guitar: Guitar + '0290_FluidR3_GM_sf2_file', + '0290_Aspirin_sf2_file', + '0290_Chaos_sf2_file', + '0290_GeneralUserGS_sf2_file', + //0290_JCLive_sf2_file // detuned.... + //0290_LesPaul_sf2 // broken + '0290_LesPaul_sf2_file', + '0290_SBAWE32_sf2_file', + //0290_SBLive_sf2 + //0290_SoundBlasterOld_sf2 + // 0291_Aspirin_sf2_file // broken + // 0291_LesPaul_sf2 // broken + '0291_LesPaul_sf2_file', + '0291_SBAWE32_sf2_file', + //0291_SoundBlasterOld_sf2 + '0292_Aspirin_sf2_file', + // 0292_LesPaul_sf2 // broken + '0292_LesPaul_sf2_file', + ], + gm_distortion_guitar: [ + // Distortion Guitar: Guitar + '0300_FluidR3_GM_sf2_file', + '0300_Aspirin_sf2_file', + '0300_Chaos_sf2_file', + '0300_GeneralUserGS_sf2_file', + // 0300_JCLive_sf2_file // broken + // 0300_LesPaul_sf2 // broken + '0300_LesPaul_sf2_file', + //0300_SBAWE32_sf2_file // _2 octave + //0300_SBLive_sf2 + //0300_SoundBlasterOld_sf2 + // 0301_Aspirin_sf2_file // missing + //0301_FluidR3_GM_sf2_file // weird broken bell + // 0301_GeneralUserGS_sf2_file // broken + // 0301_JCLive_sf2_file // broken + // 0301_LesPaul_sf2 // missing + // 0301_LesPaul_sf2_file // + 1 oct? + '0302_Aspirin_sf2_file', + // 0302_GeneralUserGS_sf2_file // not a guitar.. + //0302_JCLive_sf2_file // broken... + // 0303_Aspirin_sf2_file // guitar harmonic?? + '0304_Aspirin_sf2_file', + ], + gm_guitar_harmonics: [ + // Guitar Harmonics: Guitar + '0310_Aspirin_sf2_file', + '0310_FluidR3_GM_sf2_file', + '0310_Chaos_sf2_file', + //0310_GeneralUserGS_sf2_file // weird.. + // 0310_JCLive_sf2_file // weird + //0310_LesPaul_sf2 // missing + //0310_LesPaul_sf2_file // wrong pitches + //0310_SBAWE32_sf2_file // wrong pitches + //0310_SBLive_sf2 + //0310_SoundBlasterOld_sf2 + //0311_FluidR3_GM_sf2_file // knackt + //0311_GeneralUserGS_sf2_file // wrong note + ], + gm_acoustic_bass: [ + // Acoustic Bass: Bass + '0320_JCLive_sf2_file', + '0320_FluidR3_GM_sf2_file', + '0320_Aspirin_sf2_file', + '0320_Chaos_sf2_file', + // 0320_GeneralUserGS_sf2_file // missing notes + //0320_SBLive_sf2 + //0320_SoundBlasterOld_sf2 + // 0321_GeneralUserGS_sf2_file // nice sound but missing notes + // 0322_GeneralUserGS_sf2_file // missing note + ], + gm_electric_bass_finger: [ + // Electric Bass (finger): Bass + '0330_JCLive_sf2_file', + '0330_FluidR3_GM_sf2_fible', + '0330_Aspirin_sf2_file', + //0330_Chaos_sf2_file // same as last + '0330_GeneralUserGS_sf2_file', + //0330_SBLive_sf2 + //0330_SoundBlasterOld_sf2 + //0331_GeneralUserGS_sf2_file // knackt + // 0332_GeneralUserGS_sf2_file // missin + ], + gm_electric_bass_pick: [ + // Electric Bass (pick): Bass + '0340_JCLive_sf2_file', + '0340_FluidR3_GM_sf2_file', + '0340_Aspirin_sf2_file', + //0340_Chaos_sf2_file // same as last + '0340_GeneralUserGS_sf2_file', + //0340_SBLive_sf2 + //0340_SoundBlasterOld_sf2 + '0341_Aspirin_sf2_file', + //0341_GeneralUserGS_sf2_file // knack + ], + gm_fretless_bass: [ + // Fretless Bass: Bass + '0350_Aspirin_sf2_file', + // 0350_Chaos_sf2_file // same as last + //0350_FluidR3_GM_sf2_file // knackt + //0350_GeneralUserGS_sf2_file // _1 oct + knackt + '0350_JCLive_sf2_file', + //0350_SBLive_sf2 + //0350_SoundBlasterOld_sf2 + //0351_GeneralUserGS_sf2_file // missin + ], + gm_slap_bass_1: [ + // Slap Bass 1: Bass + '0360_Aspirin_sf2_file', + '0360_JCLive_sf2_file', + '0360_FluidR3_GM_sf2_file', + '0360_Chaos_sf2_file', + //0360_GeneralUserGS_sf2_file // _1 oct + //0360_SBLive_sf2 + //0360_SoundBlasterOld_sf2 + //0361_GeneralUserGS_sf2_file // missin + ], + gm_slap_bass_2: [ + // Slap Bass 2: Bass + '0370_Aspirin_sf2_file', + // 0370_Chaos_sf2_file // same as last + '0370_FluidR3_GM_sf2_file', + '0370_GeneralUserGS_sf2_fil e', + '0370_JCLive_sf2_file', + //0370_SBLive_sf2 + //0370_SoundBlasterOld_sf2 + //0371_GeneralUserGS_sf2_file // missing + //0372_GeneralUserGS_sf2_file // detuned + //0385_GeneralUserGS_sf2_file // missin + ], + gm_synth_bass_1: [ + // Synth Bass 1: Bass + '0380_Aspirin_sf2_file', + '0380_Chaos_sf2_file', + '0380_FluidR3_GM_sf2_file', + // 0380_GeneralUserGS_sf2_file // laut + '0380_JCLive_sf2_file', + //0380_SBLive_sf2 + //0380_SoundBlasterOld_sf2 + '0381_FluidR3_GM_sf2_file', + '0381_GeneralUserGS_sf2_file', + //0382_FluidR3_GM_sf2_file // kein synth bass + '0382_GeneralUserGS_sf2_file', + '0383_GeneralUserGS_sf2_file', + '0384_GeneralUserGS_sf2_file', + //0386_GeneralUserGS_sf2_file // knackt + '0387_GeneralUserGS_sf2_file', + ], + gm_synth_bass_2: [ + // Synth Bass 2: Bass + '0390_Aspirin_sf2_file', + // 0390_Chaos_sf2_file // same as last + '0390_FluidR3_GM_sf2_file', + '0390_GeneralUserGS_sf2_file', + '0390_JCLive_sf2_file', + //0390_SBLive_sf2 + //0390_SoundBlasterOld_sf2 + '0391_FluidR3_GM_sf2_file', + // 0391_GeneralUserGS_sf2_file // missing + //0391_SoundBlasterOld_sf2 + '0392_FluidR3_GM_sf2_file', + //0392_GeneralUserGS_sf2_file // kein synth und _1oct + '0393_GeneralUserGS_sf2_file', + ], + gm_violin: [ + // Violin: Strings + '0400_Aspirin_sf2_file', + '0400_Chaos_sf2_file', + '0400_JCLive_sf2_file', + '0400_FluidR3_GM_sf2_file', + '0400_GeneralUserGS_sf2_file', + //0400_SBLive_sf2 + //0400_SoundBlasterOld_sf2 + '0401_Aspirin_sf2_file', + '0401_FluidR3_GM_sf2_file', + '0401_GeneralUserGS_sf2_file', + '0402_GeneralUserGS_sf2_file', + ], + gm_viola: [ + // Viola: Strings + '0410_Aspirin_sf2_file', + // 0410_Chaos_sf2_file // laut und sehr unstringy + '0410_FluidR3_GM_sf2_file', + '0410_GeneralUserGS_sf2_file', + '0410_JCLive_sf2_file', + //0410_SBLive_sf2 + //0410_SoundBlasterOld_sf2 + '0411_FluidR3_GM_sf2_file', + ], + gm_cello: [ + // Cello: Strings + '0420_Aspirin_sf2_file', + // 0420_Chaos_sf2_file // kein cello und laut + '0420_FluidR3_GM_sf2_file', + '0420_GeneralUserGS_sf2_file', + '0420_JCLive_sf2_file', + //0420_SBLive_sf2 + //0420_SoundBlasterOld_sf2 + '0421_FluidR3_GM_sf2_file', + '0421_GeneralUserGS_sf2_file', + ], + gm_contrabass: [ + // Contrabass: Strings + '0430_Aspirin_sf2_file', + '0430_Chaos_sf2_file', + // 0430_FluidR3_GM_sf2_file // missing notes + '0430_GeneralUserGS_sf2_file', + //0430_JCLive_sf2_file // _1 oct und meh + //0430_SBLive_sf2 + //0430_SoundBlasterOld_sf2 + // 0431_FluidR3_GM_sf2_file // missing note + ], + gm_tremolo_strings: [ + // Tremolo Strings: Strings + '0440_Aspirin_sf2_file', + '0440_Chaos_sf2_file', + //0440_FluidR3_GM_sf2_file // huuuge + '0440_GeneralUserGS_sf2_file', + '0440_JCLive_sf2_file', + //0440_SBLive_sf2 + //0440_SoundBlasterOld_sf2 + '0441_GeneralUserGS_sf2_file', + '0442_GeneralUserGS_sf2_file', + ], + gm_pizzicato_strings: [ + // Pizzicato Strings: Strings + '0450_Aspirin_sf2_file', + '0450_Chaos_sf2_file', + '0450_FluidR3_GM_sf2_file', + '0450_GeneralUserGS_sf2_file', + '0450_JCLive_sf2_file', + //0450_SBLive_sf2 + //0450_SoundBlasterOld_sf2 + '0451_FluidR3_GM_sf2_file', + ], + gm_orchestral_harp: [ + // Orchestral Harp: Strings + '0460_Aspirin_sf2_file', + // 0460_Chaos_sf2_file // knackt + '0460_FluidR3_GM_sf2_file', + '0460_GeneralUserGS_sf2_file', + '0460_JCLive_sf2_file', + //0460_SBLive_sf2 + //0460_SoundBlasterOld_sf2 + '0461_FluidR3_GM_sf2_file', + ], + gm_timpani: [ + // Timpani: Strings + '0470_Aspirin_sf2_file', + '0470_Chaos_sf2_file', + '0470_FluidR3_GM_sf2_file', + '0470_GeneralUserGS_sf2_file', + // 0470_JCLive_sf2_file // wrong pitches + //0470_SBLive_sf2 + //0470_SoundBlasterOld_sf2 + '0471_FluidR3_GM_sf2_file', + '0471_GeneralUserGS_sf2_file', + ], + gm_string_ensemble_1: [ + // String Ensemble 1: Ensemble + '0480_Aspirin_sf2_file', + '0480_Chaos_sf2_file', + '0480_FluidR3_GM_sf2_file', + '0480_GeneralUserGS_sf2_file', + '0480_JCLive_sf2_file', + //0480_SBLive_sf2 + //0480_SoundBlasterOld_sf2 + // these dont work.. + //04810_GeneralUserGS_sf2_file // missing notes + brass + //04811_GeneralUserGS_sf2_file // missing notes + brass + //04812_GeneralUserGS_sf2_file + //04813_GeneralUserGS_sf2_file + //04814_GeneralUserGS_sf2_file + //04815_GeneralUserGS_sf2_file + //04816_GeneralUserGS_sf2_file + //04817_GeneralUserGS_sf2_file + '0481_Aspirin_sf2_file', + '0481_FluidR3_GM_sf2_file', + '0481_GeneralUserGS_sf2_file', + '0482_Aspirin_sf2_file', + '0482_GeneralUserGS_sf2_file', + '0483_GeneralUserGS_sf2_file', + // another block of buggyness: + //0484_GeneralUserGS_sf2_file // keys?! + knackt + //0485_GeneralUserGS_sf2_file // missing notes + //0486_GeneralUserGS_sf2_file + //0487_GeneralUserGS_sf2_file + //0488_GeneralUserGS_sf2_file + //0489_GeneralUserGS_sf2_fil + ], + gm_string_ensemble_2: [ + // String Ensemble 2: Ensemble + '0490_Aspirin_sf2_file', + '0490_Chaos_sf2_file', + '0490_FluidR3_GM_sf2_file', + '0490_GeneralUserGS_sf2_file', + '0490_JCLive_sf2_file', + //0490_SBLive_sf2 + //0490_SoundBlasterOld_sf2 + '0491_GeneralUserGS_sf2_file', + '0492_GeneralUserGS_sf2_file', + ], + gm_synth_strings_1: [ + // Synth Strings 1: Ensemble + '0500_Aspirin_sf2_file', + // 0500_Chaos_sf2_file // same as above + //0500_FluidR3_GM_sf2_file // detune + knack + '0500_GeneralUserGS_sf2_file', + '0500_JCLive_sf2_file', + //0500_SBLive_sf2 + //0500_SoundBlasterOld_sf2 + '0501_FluidR3_GM_sf2_file', + // 0501_GeneralUserGS_sf2_file // crackles + // 0502_FluidR3_GM_sf2_file // missing + '0502_GeneralUserGS_sf2_file', + '0503_FluidR3_GM_sf2_file', + // 0504_FluidR3_GM_sf2_file // missing + '0505_FluidR3_GM_sf2_file', + ], + gm_synth_strings_2: [ + // Synth Strings 2: Ensemble + '0510_Aspirin_sf2_file', + '0510_Chaos_sf2_file', + // 0510_FluidR3_GM_sf2_file // detune + crackle + '0510_GeneralUserGS_sf2_file', + //0510_JCLive_sf2_file // laarge and meh + //0510_SBLive_sf2 // missing + //0510_SoundBlasterOld_sf2 + '0511_GeneralUserGS_sf2_file', + //0511_SoundBlasterOld_sf + ], + gm_choir_aahs: [ + // Choir Aahs: Ensemble + '0520_Aspirin_sf2_file', + '0520_Chaos_sf2_file', + '0520_FluidR3_GM_sf2_file', + '0520_GeneralUserGS_sf2_file', + '0520_JCLive_sf2_file', + //0520_SBLive_sf2 + '0520_Soul_Ahhs_sf2_file', + //0520_SoundBlasterOld_sf2 + '0521_FluidR3_GM_sf2_file', + '0521_Soul_Ahhs_sf2_file', + //0521_SoundBlasterOld_sf2 + '0522_Soul_Ahhs_sf2_file', + ], + gm_voice_oohs: [ + // Voice Oohs: Ensemble + '0530_Aspirin_sf2_file', + '0530_Chaos_sf2_file', + '0530_FluidR3_GM_sf2_file', + '0530_GeneralUserGS_sf2_file', + //0530_JCLive_sf2_file // same as above + //0530_SBLive_sf2 + // 0530_Soul_Ahhs_sf2_file // not ooh + //0530_SoundBlasterOld_sf2 + '0531_FluidR3_GM_sf2_file', + // 0531_GeneralUserGS_sf2_file // ends crackle + '0531_JCLive_sf2_file', + //0531_SoundBlasterOld_sf + ], + gm_synth_choir: [ + // Synth Choir: Ensemble + '0540_Aspirin_sf2_file', + '0540_Chaos_sf2_file', + '0540_FluidR3_GM_sf2_file', + '0540_GeneralUserGS_sf2_file', + //0540_JCLive_sf2_file // large + crackles + //0540_SBLive_sf2 + //0540_SoundBlasterOld_sf2 + '0541_FluidR3_GM_sf2_file', + ], + gm_orchestra_hit: [ + // Orchestra Hit: Ensemble + '0550_Aspirin_sf2_file', + '0550_Chaos_sf2_file', + '0550_FluidR3_GM_sf2_file', + '0550_GeneralUserGS_sf2_file', + //0550_JCLive_sf2_file // same as above + //0550_SBLive_sf2 + //0550_SoundBlasterOld_sf2 + //0551_Aspirin_sf2_file // not an orch hit.. + '0551_FluidR3_GM_sf2_file', + ], + gm_trumpet: [ + // Trumpet: Brass + '0560_FluidR3_GM_sf2_file', + '0560_JCLive_sf2_file', + '0560_Aspirin_sf2_file', + '0560_Chaos_sf2_file', + //0560_GeneralUserGS_sf2_file // _1 oct + //0560_SBLive_sf2 + //0560_SoundBlasterOld_sf + ], + gm_trombone: [ + // Trombone: Brass + '0570_Aspirin_sf2_file', + '0570_Chaos_sf2_file', + '0570_FluidR3_GM_sf2_file', + '0570_GeneralUserGS_sf2_file', + //0570_JCLive_sf2_file // _1oct + //0570_SBLive_sf2 + //0570_SoundBlasterOld_sf2 + '0571_GeneralUserGS_sf2_file', + ], + gm_tuba: [ + // Tuba: Brass + '0580_FluidR3_GM_sf2_file', + '0580_Aspirin_sf2_file', + '0580_Chaos_sf2_file', + '0580_GeneralUserGS_sf2_file', + //0580_JCLive_sf2_file // _1oct + //0580_SBLive_sf2 + //0580_SoundBlasterOld_sf2 + //0581_GeneralUserGS_sf2_file // missin + ], + gm_muted_trumpet: [ + // Muted Trumpet: Brass + '0590_JCLive_sf2_file', + '0590_Aspirin_sf2_file', + '0590_Chaos_sf2_file', + '0590_FluidR3_GM_sf2_file', + '0590_GeneralUserGS_sf2_file', + //0590_SBLive_sf2 + //0590_SoundBlasterOld_sf2 + // 0591_GeneralUserGS_sf2_file // missin + ], + gm_french_horn: [ + // French Horn: Brass + '0600_Aspirin_sf2_file', + //0600_Chaos_sf2_file // weird jumps + '0600_FluidR3_GM_sf2_file', + '0600_GeneralUserGS_sf2_file', + '0600_JCLive_sf2_file', + //0600_SBLive_sf2 + //0600_SoundBlasterOld_sf2 + '0601_FluidR3_GM_sf2_file', + //0601_GeneralUserGS_sf2_file // tiny crackles + // 0602_GeneralUserGS_sf2_file // bad gain diffs + // 0603_GeneralUserGS_sf2_file // tiny crackle + ], + gm_brass_section: [ + // Brass Section: Brass + '0610_JCLive_sf2_file', + '0610_Aspirin_sf2_file', + '0610_Chaos_sf2_file', + '0610_FluidR3_GM_sf2_file', + '0610_GeneralUserGS_sf2_file', + //0610_SBLive_sf2 + //0610_SoundBlasterOld_sf2 + // 0611_GeneralUserGS_sf2_file // missing sounds + // 0612_GeneralUserGS_sf2_file + //0613_GeneralUserGS_sf2_file // _1 oct + // 0614_GeneralUserGS_sf2_file // missing sounds + // 0615_GeneralUserGS_sf2_file // missing sound + ], + gm_synth_brass_1: [ + // Synth Brass 1: Brass + '0620_Aspirin_sf2_file', + //0620_Chaos_sf2_file // weird gain diff + '0620_FluidR3_GM_sf2_file', + //0620_GeneralUserGS_sf2_file // loooud + // 0620_JCLive_sf2_file // weird gain diff + //0620_SBLive_sf2 + //0620_SoundBlasterOld_sf2 + '0621_Aspirin_sf2_file', + '0621_FluidR3_GM_sf2_file', + // 0621_GeneralUserGS_sf2_file // detune + loooud + //0622_FluidR3_GM_sf2_file // loud.. + //0622_GeneralUserGS_sf2_file // loud + crackle + ], + gm_synth_brass_2: [ + // Synth Brass 2: Brass + '0630_Aspirin_sf2_file', + '0630_Chaos_sf2_file', + '0630_FluidR3_GM_sf2_file', + //0630_GeneralUserGS_sf2_file // detune + looud + '0630_JCLive_sf2_file', + //0630_SBLive_sf2 + //0630_SoundBlasterOld_sf2 + // 0631_Aspirin_sf2_file // looud + detune + gain diffs + '0631_FluidR3_GM_sf2_file', + //0631_GeneralUserGS_sf2_file // crackles + '0632_FluidR3_GM_sf2_file', + '0633_FluidR3_GM_sf2_file', + ], + gm_soprano_sax: [ + // Soprano Sax: Reed + '0640_JCLive_sf2_file', + '0640_Aspirin_sf2_file', + '0640_Chaos_sf2_file', + '0640_FluidR3_GM_sf2_file', + // 0640_GeneralUserGS_sf2_file // crackles + //0640_SBLive_sf2 + //0640_SoundBlasterOld_sf2 + '0641_FluidR3_GM_sf2_file', + ], + gm_alto_sax: [ + // Alto Sax: Reed + //0650_Aspirin_sf2_file // this is not an alto sax + '0650_JCLive_sf2_file', + '0650_Chaos_sf2_file', + '0650_FluidR3_GM_sf2_file', + '0650_GeneralUserGS_sf2_file', + //0650_SBLive_sf2 + //0650_SoundBlasterOld_sf2 + '0651_Aspirin_sf2_file', + '0651_FluidR3_GM_sf2_file', + ], + gm_tenor_sax: [ + // Tenor Sax: Reed + '0660_JCLive_sf2_file', + '0660_Aspirin_sf2_file', + '0660_Chaos_sf2_file', + //0660_FluidR3_GM_sf2_file // weird pitches + '0660_GeneralUserGS_sf2_file', + //0660_SBLive_sf2 + //0660_SoundBlasterOld_sf2 + // 0661_FluidR3_GM_sf2_file // weird pitches + // 0661_GeneralUserGS_sf2_file // missin + ], + gm_baritone_sax: [ + // Baritone Sax: Reed + '0670_JCLive_sf2_file', + '0670_Aspirin_sf2_file', + '0670_Chaos_sf2_file', + '0670_FluidR3_GM_sf2_file', + '0670_GeneralUserGS_sf2_file', + //0670_SBLive_sf2 + //0670_SoundBlasterOld_sf2 + '0671_FluidR3_GM_sf2_file', + ], + gm_oboe: [ + // Oboe: Reed + //0680_Aspirin_sf2_file // tiny crackles + '0680_JCLive_sf2_file', + '0680_Chaos_sf2_file', + '0680_FluidR3_GM_sf2_file', + '0680_GeneralUserGS_sf2_file', + //0680_SBLive_sf2 + //0680_SoundBlasterOld_sf2 + '0681_FluidR3_GM_sf2_file', + ], + gm_english_horn: [ + // English Horn: Reed + '0690_JCLive_sf2_file', + '0690_Aspirin_sf2_file', + //0690_Chaos_sf2_file // detuned + '0690_FluidR3_GM_sf2_file', + //0690_GeneralUserGS_sf2_file // +1 oct + //0690_SBLive_sf2 + //0690_SoundBlasterOld_sf2 + '0691_FluidR3_GM_sf2_file', + ], + gm_bassoon: [ + // Bassoon: Reed + '0700_JCLive_sf2_file', + //0700_Aspirin_sf2_file // detune + gain diffs + // 0700_Chaos_sf2_file // detune + crackles + '0700_FluidR3_GM_sf2_file', + '0700_GeneralUserGS_sf2_file', + //0700_SBLive_sf2 + //0700_SoundBlasterOld_sf2 + '0701_FluidR3_GM_sf2_file', + //0701_GeneralUserGS_sf2_file // missin + ], + gm_clarinet: [ + // Clarinet: Reed + '0710_JCLive_sf2_file', + '0710_Aspirin_sf2_file', + '0710_Chaos_sf2_file', + '0710_FluidR3_GM_sf2_file', + '0710_GeneralUserGS_sf2_file', + //0710_SBLive_sf2 + //0710_SoundBlasterOld_sf2 + '0711_FluidR3_GM_sf2_file', + ], + gm_piccolo: [ + // Piccolo: Pipe + '0720_JCLive_sf2_file', + '0720_Aspirin_sf2_file', + // 0720_Chaos_sf2_file // not a piccolo + '0720_FluidR3_GM_sf2_file', + '0720_GeneralUserGS_sf2_file', + //0720_SBLive_sf2 + //0720_SoundBlasterOld_sf2 + '0721_FluidR3_GM_sf2_file', + //0721_SoundBlasterOld_sf + ], + gm_flute: [ + // Flute: Pipe + '0730_JCLive_sf2_file', + '0730_Aspirin_sf2_file', + //0730_Chaos_sf2_file // etune + '0730_FluidR3_GM_sf2_file', + '0730_GeneralUserGS_sf2_file', + //0730_SBLive_sf2 + //0730_SoundBlasterOld_sf2 + //0731_Aspirin_sf2_file // not a flute + '0731_FluidR3_GM_sf2_file', + //0731_SoundBlasterOld_sf + ], + gm_recorder: [ + // Recorder: Pipe + '0740_JCLive_sf2_file', + '0740_Aspirin_sf2_file', + '0740_Chaos_sf2_file', + '0740_FluidR3_GM_sf2_file', + '0740_GeneralUserGS_sf2_file', + //0740_SBLive_sf2 + //0740_SoundBlasterOld_sf2 + // 0741_GeneralUserGS_sf2_file // missin + ], + gm_pan_flute: [ + // Pan Flute: Pipe + '0750_JCLive_sf2_file', + '0750_FluidR3_GM_sf2_file', + '0750_Aspirin_sf2_file', + '0750_Chaos_sf2_file', + '0750_GeneralUserGS_sf2_file', + //0750_SBLive_sf2 + //0750_SoundBlasterOld_sf2 + '0751_Aspirin_sf2_file', + '0751_FluidR3_GM_sf2_file', + '0751_GeneralUserGS_sf2_file', + //0751_SoundBlasterOld_sf + ], + gm_blown_bottle: [ + // Blown bottle: Pipe + '0760_FluidR3_GM_sf2_file', + '0760_JCLive_sf2_file', + // 0760_Aspirin_sf2_file // same as below w crackle + '0760_Chaos_sf2_file', + '0760_GeneralUserGS_sf2_file', + //0760_SBLive_sf2 + //0760_SoundBlasterOld_sf2 + '0761_FluidR3_GM_sf2_file', + // 0761_GeneralUserGS_sf2_file // missing + //0761_SoundBlasterOld_sf2 + // 0762_GeneralUserGS_sf2_file // missin + ], + gm_shakuhachi: [ + // Shakuhachi: Pipe + '0770_JCLive_sf2_file', + '0771_FluidR3_GM_sf2_file', + '0770_Aspirin_sf2_file', + //0770_Chaos_sf2_file // not shakuhachi + '0770_FluidR3_GM_sf2_file', + '0770_GeneralUserGS_sf2_file', + //0770_SBLive_sf2 + //0770_SoundBlasterOld_sf2 + // 0771_GeneralUserGS_sf2_file // missing + // 0772_GeneralUserGS_sf2_file // missin + ], + gm_whistle: [ + // Whistle: Pipe + '0780_FluidR3_GM_sf2_file', + '0780_JCLive_sf2_file', + '0780_Aspirin_sf2_file', + '0780_Chaos_sf2_file', + //0780_GeneralUserGS_sf2_file // loud.. + //0780_SBLive_sf2 + //0780_SoundBlasterOld_sf2 + // 0781_GeneralUserGS_sf2_file // detune + crackle + ], + gm_ocarina: [ + // Ocarina: Pipe + '0790_FluidR3_GM_sf2_file', + '0790_JCLive_sf2_file', + '0790_Aspirin_sf2_file', + //0790_Chaos_sf2_file // same as above + '0790_GeneralUserGS_sf2_file', + //0790_SBLive_sf2 + //0790_SoundBlasterOld_sf2 + //0791_GeneralUserGS_sf2_file // missin + ], + gm_lead_1_square: [ + // Lead 1 (square): Synth Lead + '0800_Aspirin_sf2_file', + '0800_Chaos_sf2_file', + '0800_FluidR3_GM_sf2_file', + // 0800_GeneralUserGS_sf2_file // detuned + // 0800_JCLive_sf2_file // detuned + //0800_SBLive_sf2 + //0800_SoundBlasterOld_sf2 + //0801_FluidR3_GM_sf2_file // detune + // 0801_GeneralUserGS_sf2_file // detun + ], + gm_lead_2_sawtooth: [ + // Lead 2 (sawtooth): Synth Lead + '0810_JCLive_sf2_file', + '0810_Aspirin_sf2_file', + '0810_Chaos_sf2_file', + '0810_FluidR3_GM_sf2_file', + '0810_GeneralUserGS_sf2_file', + //0810_SBLive_sf2 + //0810_SoundBlasterOld_sf2 + '0811_Aspirin_sf2_file', + '0811_GeneralUserGS_sf2_file', + //0811_SoundBlasterOld_sf + ], + gm_lead_3_calliope: [ + // Lead 3 (calliope): Synth Lead + '0820_JCLive_sf2_file', + '0820_Aspirin_sf2_file', + '0820_Chaos_sf2_file', + '0820_FluidR3_GM_sf2_file', + '0820_GeneralUserGS_sf2_file', + //0820_SBLive_sf2 + //0820_SoundBlasterOld_sf2 + '0821_FluidR3_GM_sf2_file', + '0821_GeneralUserGS_sf2_file', + //0821_SoundBlasterOld_sf2 + // 0822_GeneralUserGS_sf2_file // missing + //0823_GeneralUserGS_sf2_file // missin + ], + gm_lead_4_chiff: [ + // Lead 4 (chiff): Synth Lead + '0830_JCLive_sf2_file', + '0830_Aspirin_sf2_file', + // 0830_Chaos_sf2_file // same as above + '0830_FluidR3_GM_sf2_file', + '0830_GeneralUserGS_sf2_file', + //0830_SBLive_sf2 + //0830_SoundBlasterOld_sf2 + '0831_FluidR3_GM_sf2_file', + '0831_GeneralUserGS_sf2_file', + //0831_SoundBlasterOld_sf + ], + gm_lead_5_charang: [ + // Lead 5 (charang): Synth Lead + '0840_JCLive_sf2_file', + '0840_FluidR3_GM_sf2_file', + '0840_Aspirin_sf2_file', + '0840_Chaos_sf2_file', + '0840_GeneralUserGS_sf2_file', + //0840_SBLive_sf2 + //0840_SoundBlasterOld_sf2 + '0841_Aspirin_sf2_file', + '0841_Chaos_sf2_file', + '0841_FluidR3_GM_sf2_file', + '0841_GeneralUserGS_sf2_file', + //0841_JCLive_sf2_file // +1oct + detune + //0841_SoundBlasterOld_sf2 + '0842_FluidR3_GM_sf2_file', + ], + gm_lead_6_voice: [ + // Lead 6 (voice): Synth Lead + '0850_JCLive_sf2_file', + '0850_Aspirin_sf2_file', + // 0850_Chaos_sf2_file // same as above + '0850_FluidR3_GM_sf2_file', + // 0850_GeneralUserGS_sf2_file // no voice + //0850_SBLive_sf2 + //0850_SoundBlasterOld_sf2 + '0851_FluidR3_GM_sf2_file', + '0851_GeneralUserGS_sf2_file', + '0851_JCLive_sf2_file', + //0851_SoundBlasterOld_sf + ], + gm_lead_7_fifths: [ + // Lead 7 (fifths): Synth Lead + '0860_JCLive_sf2_file', + '0860_Aspirin_sf2_file', + '0860_Chaos_sf2_file', + // 0860_FluidR3_GM_sf2_file // loud and not fitting + '0860_GeneralUserGS_sf2_file', + //0860_SBLive_sf2 + //0860_SoundBlasterOld_sf2 + '0861_Aspirin_sf2_file', + // 0861_FluidR3_GM_sf2_file // lout and not fitting + //0861_SoundBlasterOld_sf + ], + gm_lead_8_bass_lead: [ + // Lead 8 (bass + lead): Synth Lead + '0870_JCLive_sf2_file', + '0870_Aspirin_sf2_file', + '0870_Chaos_sf2_file', + '0870_FluidR3_GM_sf2_file', + '0870_GeneralUserGS_sf2_file', + //0870_SBLive_sf2 + //0870_SoundBlasterOld_sf2 + // 0871_GeneralUserGS_sf2_file // loud + detune + //0872_GeneralUserGS_sf2_file // loud + //0873_GeneralUserGS_sf2_file // lou + ], + gm_pad_new_age: [ + // Pad 1 (new age): Synth Pad + '0880_JCLive_sf2_file', + '0880_Aspirin_sf2_file', + '0880_Chaos_sf2_file', + '0880_FluidR3_GM_sf2_file', + '0880_GeneralUserGS_sf2_file', + //0880_SBLive_sf2 + //0880_SoundBlasterOld_sf2 + '0881_Aspirin_sf2_file', + '0881_FluidR3_GM_sf2_file', + '0881_GeneralUserGS_sf2_file', + //0881_SoundBlasterOld_sf2 + '0882_Aspirin_sf2_file', + // 0882_FluidR3_GM_sf2_file // missing + '0882_GeneralUserGS_sf2_file', + //0883_GeneralUserGS_sf2_file // missing + // 0884_GeneralUserGS_sf2_file // broken + '0885_GeneralUserGS_sf2_file', + //0886_GeneralUserGS_sf2_file // not a pad + '0887_GeneralUserGS_sf2_file', + //0888_GeneralUserGS_sf2_file // not a pad + //0889_GeneralUserGS_sf2_file // not a pa + ], + gm_pad_warm: [ + // Pad 2 (warm): Synth Pad + '0890_JCLive_sf2_file', + '0890_Aspirin_sf2_file', + '0890_Chaos_sf2_file', + '0890_FluidR3_GM_sf2_file', + '0890_GeneralUserGS_sf2_file', + //0890_SBLive_sf2 + //0890_SoundBlasterOld_sf2 + '0891_Aspirin_sf2_file', + '0891_FluidR3_GM_sf2_file', + // 0891_GeneralUserGS_sf2_file // nois + ], + gm_pad_poly: [ + // Pad 3 (polysynth): Synth Pad + //0900_Aspirin_sf2_file // same as belo + '0900_JCLive_sf2_file', + '0900_Chaos_sf2_file', + '0900_FluidR3_GM_sf2_file', + '0900_GeneralUserGS_sf2_file', + //0900_SBLive_sf2 + //0900_SoundBlasterOld_sf2 + '0901_Aspirin_sf2_file', + '0901_FluidR3_GM_sf2_file', + '0901_GeneralUserGS_sf2_file', + //0901_SoundBlasterOld_sf + ], + gm_pad_choir: [ + // Pad 4 (choir): Synth Pad + '0910_FluidR3_GM_sf2_file', + '0910_JCLive_sf2_file', + '0910_Aspirin_sf2_file', + //0910_Chaos_sf2_file // +1oct + '0910_GeneralUserGS_sf2_file', + //0910_SBLive_sf2 + //0910_SoundBlasterOld_sf2 + // 0911_Aspirin_sf2_file // fluty crackles + '0911_GeneralUserGS_sf2_file', + '0911_JCLive_sf2_file', + //0911_SoundBlasterOld_sf + ], + gm_pad_bowed: [ + // Pad 5 (bowed): Synth Pad + '0920_JCLive_sf2_file', + '0920_Aspirin_sf2_file', + //0920_Chaos_sf2_file // same as above + //0920_FluidR3_GM_sf2_file // detuned? + '0920_GeneralUserGS_sf2_file', + //0920_SBLive_sf2 + //0920_SoundBlasterOld_sf2 + '0921_Aspirin_sf2_file', + '0921_GeneralUserGS_sf2_file', + //0921_SoundBlasterOld_sf + ], + gm_pad_metallic: [ + // Pad 6 (metallic): Synth Pad + '0930_Aspirin_sf2_file', + '0930_Chaos_sf2_file', + '0930_FluidR3_GM_sf2_file', + '0930_GeneralUserGS_sf2_file', + // 0930_JCLive_sf2_file // buggy zones: guitar / synth + //0930_SBLive_sf2 + //0930_SoundBlasterOld_sf2 + '0931_Aspirin_sf2_file', + '0931_FluidR3_GM_sf2_file', + '0931_GeneralUserGS_sf2_file', + //0931_SoundBlasterOld_sf + ], + gm_pad_halo: [ + // Pad 7 (halo): Synth Pad + // 0940_Aspirin_sf2_file // same as below + '0940_Chaos_sf2_file', + '0940_FluidR3_GM_sf2_file', + '0940_GeneralUserGS_sf2_file', + '0940_JCLive_sf2_file', + //0940_SBLive_sf2 + //0940_SoundBlasterOld_sf2 + '0941_Aspirin_sf2_file', + '0941_FluidR3_GM_sf2_file', + '0941_GeneralUserGS_sf2_file', + '0941_JCLive_sf2_file', + ], + gm_pad_sweep: [ + // Pad 8 (sweep): Synth Pad + '0950_Aspirin_sf2_file', + '0950_Chaos_sf2_file', + '0950_FluidR3_GM_sf2_file', + '0950_GeneralUserGS_sf2_file', + '0950_JCLive_sf2_file', + //0950_SBLive_sf2 + //0950_SoundBlasterOld_sf2 + '0951_FluidR3_GM_sf2_file', + '0951_GeneralUserGS_sf2_file', + ], + gm_fx_rain: [ + // FX 1 (rain): Synth Effects + //0960_Aspirin_sf2_file //mixed samples? + '0960_FluidR3_GM_sf2_file', + '0960_Chaos_sf2_file', + '0960_GeneralUserGS_sf2_file', + // 0960_JCLive_sf2_file // mixed samples? + //0960_SBLive_sf2 + //0960_SoundBlasterOld_sf2 + '0961_Aspirin_sf2_file', + '0961_FluidR3_GM_sf2_file', + // 0961_GeneralUserGS_sf2_file // ?!?! + //0961_SoundBlasterOld_sf2 + '0962_GeneralUserGS_sf2_file', + ], + gm_fx_soundtrack: [ + // FX 2 (soundtrack): Synth Effects + '0970_FluidR3_GM_sf2_file', + '0970_Aspirin_sf2_file', + //0970_Chaos_sf2_file // wrong pitch + '0970_GeneralUserGS_sf2_file', + //0970_JCLive_sf2_file // wrong pitch + //0970_SBLive_sf2 + //0970_SoundBlasterOld_sf2 + '0971_FluidR3_GM_sf2_file', + '0971_GeneralUserGS_sf2_file', + //0971_SoundBlasterOld_sf + ], + gm_fx_crystal: [ + // FX 3 (crystal): Synth Effects + '0980_Aspirin_sf2_file', + '0980_JCLive_sf2_file', + '0980_Chaos_sf2_file', + // 0980_FluidR3_GM_sf2_file // some notes are weird + '0980_GeneralUserGS_sf2_file', + '0981_FluidR3_GM_sf2_file', + //0980_SBLive_sf2 + //0980_SoundBlasterOld_sf2 + '0981_Aspirin_sf2_file', + '0981_GeneralUserGS_sf2_file', + //0981_SoundBlasterOld_sf2 + '0982_GeneralUserGS_sf2_file', + '0983_GeneralUserGS_sf2_file', + '0984_GeneralUserGS_sf2_file', + ], + gm_fx_atmosphere: [ + // FX 4 (atmosphere): Synth Effects + '0990_JCLive_sf2_file', + '0990_Aspirin_sf2_file', + '0990_Chaos_sf2_file', + '0990_FluidR3_GM_sf2_file', + '0990_GeneralUserGS_sf2_file', + //0990_SBLive_sf2 + //0990_SoundBlasterOld_sf2 + '0991_Aspirin_sf2_file', + '0991_FluidR3_GM_sf2_file', + '0991_GeneralUserGS_sf2_file', + '0991_JCLive_sf2_file', + //0991_SoundBlasterOld_sf2 + '0992_FluidR3_GM_sf2_file', + '0992_JCLive_sf2_file', + '0993_JCLive_sf2_file', + '0994_JCLive_sf2_file', + ], + gm_fx_brightness: [ + // FX 5 (brightness): Synth Effects + '1000_JCLive_sf2_file', + '1000_Aspirin_sf2_file', + '1000_Chaos_sf2_file', + '1000_FluidR3_GM_sf2_file', + '1000_GeneralUserGS_sf2_file', + //1000_SBLive_sf2 + //1000_SoundBlasterOld_sf2 + '1001_Aspirin_sf2_file', + '1001_FluidR3_GM_sf2_file', + '1001_GeneralUserGS_sf2_file', + '1001_JCLive_sf2_file', + //1001_SoundBlasterOld_sf2 + '1002_Aspirin_sf2_file', + '1002_FluidR3_GM_sf2_file', + '1002_GeneralUserGS_sf2_file', + ], + gm_fx_goblins: [ + // FX 6 (goblins): Synth Effects + '1010_FluidR3_GM_sf2_file', + '1010_JCLive_sf2_file', + '1010_Aspirin_sf2_file', + '1010_Chaos_sf2_file', + '1010_GeneralUserGS_sf2_file', + //1010_SBLive_sf2 + //1010_SoundBlasterOld_sf2 + '1011_Aspirin_sf2_file', + '1011_FluidR3_GM_sf2_file', + '1011_JCLive_sf2_file', + '1012_Aspirin_sf2_file', + ], + gm_fx_echoes: [ + // FX 7 (echoes): Synth Effects + '1020_FluidR3_GM_sf2_file', + '1020_JCLive_sf2_file', + '1020_Aspirin_sf2_file', + '1020_Chaos_sf2_file', + '1020_GeneralUserGS_sf2_file', + //1020_SBLive_sf2 + //1020_SoundBlasterOld_sf2 + '1021_Aspirin_sf2_file', + '1021_FluidR3_GM_sf2_file', + '1021_GeneralUserGS_sf2_file', + '1021_JCLive_sf2_file', + //1021_SoundBlasterOld_sf2 + '1022_GeneralUserGS_sf2_file', + ], + gm_fx_sci_fi: [ + // FX 8 (sci_fi): Synth Effects + '1030_FluidR3_GM_sf2_file', + '1030_Aspirin_sf2_file', + '1030_Chaos_sf2_file', + '1030_GeneralUserGS_sf2_file', + '1030_JCLive_sf2_file', + //1030_SBLive_sf2 + //1030_SoundBlasterOld_sf2 + '1031_Aspirin_sf2_file', + '1031_FluidR3_GM_sf2_file', + '1031_GeneralUserGS_sf2_file', + //1031_SoundBlasterOld_sf2 + '1032_FluidR3_GM_sf2_file', + ], + gm_sitar: [ + // Sitar: Ethnic + '1040_Aspirin_sf2_file', + '1040_FluidR3_GM_sf2_file', + '1040_JCLive_sf2_file', + '1040_Chaos_sf2_file', + '1040_GeneralUserGS_sf2_file', + //1040_SBLive_sf2 + //1040_SoundBlasterOld_sf2 + '1041_FluidR3_GM_sf2_file', + '1041_GeneralUserGS_sf2_file', + ], + gm_banjo: [ + // Banjo: Ethnic + '1050_FluidR3_GM_sf2_file', + '1050_JCLive_sf2_file', + '1050_Aspirin_sf2_file', + '1050_Chaos_sf2_file', + '1050_GeneralUserGS_sf2_file', + //1050_SBLive_sf2 + //1050_SoundBlasterOld_sf2 + '1051_GeneralUserGS_sf2_file', + ], + gm_shamisen: [ + // Shamisen: Ethnic + '1060_JCLive_sf2_file', + '1060_FluidR3_GM_sf2_file', + '1060_Aspirin_sf2_file', + '1060_Chaos_sf2_file', + '1060_GeneralUserGS_sf2_file', + //1060_SBLive_sf2 + //1060_SoundBlasterOld_sf2 + '1061_FluidR3_GM_sf2_file', + '1061_GeneralUserGS_sf2_file', + //1061_SoundBlasterOld_sf + ], + gm_koto: [ + // Koto: Ethnic + '1070_FluidR3_GM_sf2_file', + '1070_JCLive_sf2_file', + '1070_Aspirin_sf2_file', + '1070_Chaos_sf2_file', + '1070_GeneralUserGS_sf2_file', + //1070_SBLive_sf2 + //1070_SoundBlasterOld_sf2 + '1071_FluidR3_GM_sf2_file', + '1071_GeneralUserGS_sf2_file', + '1072_GeneralUserGS_sf2_file', + '1073_GeneralUserGS_sf2_file', + ], + gm_kalimba: [ + // Kalimba: Ethnic + '1080_JCLive_sf2_file', + '1080_FluidR3_GM_sf2_file', + '1080_Aspirin_sf2_file', + '1080_Chaos_sf2_file', + '1080_GeneralUserGS_sf2_file', + //1080_SBLive_sf2 + //1080_SoundBlasterOld_sf2 + //1081_SoundBlasterOld_sf + ], + gm_bagpipe: [ + // Bagpipe: Ethnic + '1090_Aspirin_sf2_file', + // '1090_Chaos_sf2_file', // broken pitches + // '1090_GeneralUserGS_sf2_file', // broken pitches + // '1090_FluidR3_GM_sf2_file', // broken pitches ? + // '1090_JCLive_sf2_file', // broken pitches ? + //1090_SBLive_sf2 + //1090_SoundBlasterOld_sf2 + //1091_SoundBlasterOld_sf + ], + gm_fiddle: [ + // Fiddle: Ethnic + '1100_JCLive_sf2_file', + '1100_Aspirin_sf2_file', + '1100_Chaos_sf2_file', + '1100_FluidR3_GM_sf2_file', + '1100_GeneralUserGS_sf2_file', + //1100_SBLive_sf2 + //1100_SoundBlasterOld_sf2 + '1101_Aspirin_sf2_file', + '1101_FluidR3_GM_sf2_file', + '1101_GeneralUserGS_sf2_file', + '1102_GeneralUserGS_sf2_file', + ], + gm_shanai: [ + // Shanai: Ethnic + '1110_Aspirin_sf2_file', + '1110_FluidR3_GM_sf2_file', + '1110_JCLive_sf2_file', + '1110_Chaos_sf2_file', + '1110_GeneralUserGS_sf2_file', + //1110_SBLive_sf2 + //1110_SoundBlasterOld_sf + ], + gm_tinkle_bell: [ + // Tinkle Bell: Percussive + '1120_Aspirin_sf2_file', + // '1120_Chaos_sf2_file', // same as above + // '1120_GeneralUserGS_sf2_file', // sounds exactly as Aspirin + // '1120_FluidR3_GM_sf2_file', // +1oct + // '1120_JCLive_sf2_file', // +1oct + //1120_SBLive_sf2 + //1120_SoundBlasterOld_sf2 + //1121_SoundBlasterOld_sf + ], + gm_agogo: [ + // Agogo: Percussive + '1130_JCLive_sf2_file', + '1130_Aspirin_sf2_file', + '1130_Chaos_sf2_file', + '1130_FluidR3_GM_sf2_file', + '1130_GeneralUserGS_sf2_file', + //1130_SBLive_sf2 + //1130_SoundBlasterOld_sf2 + '1131_FluidR3_GM_sf2_file', + //1131_SoundBlasterOld_sf + ], + gm_steel_drums: [ + // Steel Drums: Percussive + '1140_FluidR3_GM_sf2_file', + '1140_Aspirin_sf2_file', + '1140_JCLive_sf2_file', + '1140_Chaos_sf2_file', + '1140_GeneralUserGS_sf2_file', + //1140_SBLive_sf2 + //1140_SoundBlasterOld_sf2 + '1141_FluidR3_GM_sf2_file', + ], + gm_woodblock: [ + // Woodblock: Percussive + '1150_JCLive_sf2_file', + '1150_Aspirin_sf2_file', + '1150_Chaos_sf2_file', + '1150_FluidR3_GM_sf2_file', + '1150_GeneralUserGS_sf2_file', + //1150_SBLive_sf2 + //1150_SoundBlasterOld_sf2 + '1151_FluidR3_GM_sf2_file', + '1151_GeneralUserGS_sf2_file', + '1152_FluidR3_GM_sf2_file', + '1152_GeneralUserGS_sf2_file', + ], + gm_taiko_drum: [ + // Taiko Drum: Percussive + '1160_JCLive_sf2_file', + '1160_FluidR3_GM_sf2_file', + '1160_Aspirin_sf2_file', + '1160_Chaos_sf2_file', + '1160_GeneralUserGS_sf2_file', + //1160_SBLive_sf2 + //1160_SoundBlasterOld_sf2 + '1161_FluidR3_GM_sf2_file', + '1161_GeneralUserGS_sf2_file', + //1161_SoundBlasterOld_sf2 + '1162_FluidR3_GM_sf2_file', + '1162_GeneralUserGS_sf2_file', + '1163_FluidR3_GM_sf2_file', + ], + gm_melodic_tom: [ + // Melodic Tom: Percussive + '1170_JCLive_sf2_file', + '1170_Aspirin_sf2_file', + '1170_Chaos_sf2_file', + '1170_FluidR3_GM_sf2_file', + '1170_GeneralUserGS_sf2_file', + //1170_SBLive_sf2 + //1170_SoundBlasterOld_sf2 + '1171_FluidR3_GM_sf2_file', + '1171_GeneralUserGS_sf2_file', + '1172_FluidR3_GM_sf2_file', + '1173_FluidR3_GM_sf2_file', + ], + gm_synth_drum: [ + // Synth Drum: Percussive + '1180_JCLive_sf2_file', + '1180_Aspirin_sf2_file', + '1180_Chaos_sf2_file', + '1180_FluidR3_GM_sf2_file', + '1180_GeneralUserGS_sf2_file', + //1180_SBLive_sf2 + //1180_SoundBlasterOld_sf2 + '1181_FluidR3_GM_sf2_file', + '1181_GeneralUserGS_sf2_file', + //1181_SoundBlasterOld_sf + ], + gm_reverse_cymbal: [ + // Reverse Cymbal: Percussive + '1190_JCLive_sf2_file', + '1190_Aspirin_sf2_file', + '1190_Chaos_sf2_file', + '1190_FluidR3_GM_sf2_file', + '1190_GeneralUserGS_sf2_file', + //1190_SBLive_sf2 + //1190_SoundBlasterOld_sf2 + '1191_GeneralUserGS_sf2_file', + '1192_GeneralUserGS_sf2_file', + '1193_GeneralUserGS_sf2_file', + '1194_GeneralUserGS_sf2_file', + ], + gm_guitar_fret_noise: [ + // Guitar Fret Noise: Sound effects + '1200_JCLive_sf2_file', + '1200_Aspirin_sf2_file', + '1200_Chaos_sf2_file', + '1200_FluidR3_GM_sf2_file', + '1200_GeneralUserGS_sf2_file', + //1200_SBLive_sf2 + //1200_SoundBlasterOld_sf2 + '1201_Aspirin_sf2_file', + '1201_GeneralUserGS_sf2_file', + '1202_GeneralUserGS_sf2_file', + ], + gm_breath_noise: [ + // Breath Noise: Sound effects + '1210_FluidR3_GM_sf2_file', + '1210_JCLive_sf2_file', + '1210_Aspirin_sf2_file', + '1210_Chaos_sf2_file', + '1210_GeneralUserGS_sf2_file', + //1210_SBLive_sf2 + //1210_SoundBlasterOld_sf2 + '1211_Aspirin_sf2_file', + '1211_GeneralUserGS_sf2_file', + '1212_GeneralUserGS_sf2_file', + ], + gm_seashore: [ + // Seashore: Sound effects + '1220_JCLive_sf2_file', + '1220_Aspirin_sf2_file', + '1220_Chaos_sf2_file', + '1220_FluidR3_GM_sf2_file', + '1220_GeneralUserGS_sf2_file', + //1220_SBLive_sf2 + //1220_SoundBlasterOld_sf2 + '1221_Aspirin_sf2_file', + '1221_GeneralUserGS_sf2_file', + '1221_JCLive_sf2_file', + '1222_Aspirin_sf2_file', + '1222_GeneralUserGS_sf2_file', + '1223_Aspirin_sf2_file', + '1223_GeneralUserGS_sf2_file', + '1224_Aspirin_sf2_file', + '1224_GeneralUserGS_sf2_file', + '1225_GeneralUserGS_sf2_file', + '1226_GeneralUserGS_sf2_file', + ], + gm_bird_tweet: [ + // Bird Tweet: Sound effects + '1230_FluidR3_GM_sf2_file', + '1230_JCLive_sf2_file', + '1230_Aspirin_sf2_file', + // '1230_Chaos_sf2_file', + '1230_GeneralUserGS_sf2_file', + //1230_SBLive_sf2 + //1230_SoundBlasterOld_sf2 + //'1231_Aspirin_sf2_file', + '1231_GeneralUserGS_sf2_file', // dog + // '1232_Aspirin_sf2_file',// ? + '1232_GeneralUserGS_sf2_file', // horse + // '1233_GeneralUserGS_sf2_file', // + '1234_GeneralUserGS_sf2_file', // scratch + ], + gm_telephone: [ + // Telephone Ring: Sound effects + '1240_JCLive_sf2_file', + '1240_Aspirin_sf2_file', + '1240_Chaos_sf2_file', + '1240_FluidR3_GM_sf2_file', + // '1240_GeneralUserGS_sf2_file', + //1240_SBLive_sf2 + //1240_SoundBlasterOld_sf2 + '1241_Aspirin_sf2_file', // door? + //'1241_GeneralUserGS_sf2_file', + // '1242_Aspirin_sf2_file', // ? + '1242_GeneralUserGS_sf2_file', // door + '1243_Aspirin_sf2_file', // scratch + '1243_GeneralUserGS_sf2_file', // door close? + '1244_Aspirin_sf2_file', // bells + '1244_GeneralUserGS_sf2_file', // bells + ], + gm_helicopter: [ + // Helicopter: Sound effects + '1250_JCLive_sf2_file', + '1250_Aspirin_sf2_file', + // '1250_Chaos_sf2_file', // same as above + '1250_FluidR3_GM_sf2_file', + '1250_GeneralUserGS_sf2_file', + //1250_SBLive_sf2 + //1250_SoundBlasterOld_sf2 + // '1251_Aspirin_sf2_file', // slooow + '1251_FluidR3_GM_sf2_file', // guitar + '1251_GeneralUserGS_sf2_file', // engine start with loop at end.. + '1252_Aspirin_sf2_file', // alien + '1252_FluidR3_GM_sf2_file', // seashore + '1252_GeneralUserGS_sf2_file', // carbreak + // '1253_Aspirin_sf2_file', // plane + '1253_GeneralUserGS_sf2_file', // racing car + // '1254_Aspirin_sf2_file', + '1254_GeneralUserGS_sf2_file', // breaking + // '1255_Aspirin_sf2_file', + '1255_GeneralUserGS_sf2_file', // siren + // '1256_Aspirin_sf2_file', + '1256_GeneralUserGS_sf2_file', // hmm + // '1257_Aspirin_sf2_file', + '1257_GeneralUserGS_sf2_file', // noise + // '1258_Aspirin_sf2_file', + '1258_GeneralUserGS_sf2_file', // metallic noise + '1259_GeneralUserGS_sf2_file', // watery nosie + ], + gm_applause: [ + // Applause: Sound effects + '1260_JCLive_sf2_file', + '1260_Aspirin_sf2_file', + '1260_Chaos_sf2_file', + '1260_FluidR3_GM_sf2_file', + '1260_GeneralUserGS_sf2_file', + //1260_SBLive_sf2 + //1260_SoundBlasterOld_sf2 + '1261_Aspirin_sf2_file', + '1261_GeneralUserGS_sf2_file', + '1262_Aspirin_sf2_file', + '1262_GeneralUserGS_sf2_file', + '1263_Aspirin_sf2_file', + '1263_GeneralUserGS_sf2_file', + '1264_Aspirin_sf2_file', + '1264_GeneralUserGS_sf2_file', + '1265_Aspirin_sf2_file', + '1265_GeneralUserGS_sf2_file', + ], + gm_gunshot: [ + // Gunshot: Sound effects + '1270_JCLive_sf2_file', + '1270_Aspirin_sf2_file', + '1270_Chaos_sf2_file', + '1270_FluidR3_GM_sf2_file', + '1270_GeneralUserGS_sf2_file', + //1270_SBLive_sf2 + //1270_SoundBlasterOld_sf2 + '1271_Aspirin_sf2_file', + '1271_GeneralUserGS_sf2_file', + '1272_Aspirin_sf2_file', + '1272_GeneralUserGS_sf2_file', + '1273_GeneralUserGS_sf2_file', + '1274_GeneralUserGS_sf2_file', + '', + ], +}; diff --git a/packages/soundfonts/index.mjs b/packages/soundfonts/index.mjs index 3c5c226c..c54297b5 100644 --- a/packages/soundfonts/index.mjs +++ b/packages/soundfonts/index.mjs @@ -1,6 +1,6 @@ -import { getFontBufferSource } from './fontloader.mjs'; +import { getFontBufferSource, registerSoundfonts } from './fontloader.mjs'; import * as soundfontList from './list.mjs'; import { startPresetNote } from 'sfumato'; import { loadSoundfont } from './sfumato.mjs'; -export { loadSoundfont, startPresetNote, getFontBufferSource, soundfontList }; +export { loadSoundfont, startPresetNote, getFontBufferSource, soundfontList, registerSoundfonts }; diff --git a/packages/soundfonts/list.mjs b/packages/soundfonts/list.mjs index 527ef024..116eecf9 100644 --- a/packages/soundfonts/list.mjs +++ b/packages/soundfonts/list.mjs @@ -1,1304 +1,1555 @@ +// this list is not used anymore.. + export const instruments = [ + // Acoustic Grand Piano: Piano '0000_JCLive_sf2_file', '0000_Aspirin_sf2_file', '0000_Chaos_sf2_file', '0000_FluidR3_GM_sf2_file', '0000_GeneralUserGS_sf2_file', - '0000_SBLive_sf2', - '0000_SoundBlasterOld_sf2', + //'0000_SBLive_sf2', + //'0000_SoundBlasterOld_sf2', '0001_FluidR3_GM_sf2_file', '0001_GeneralUserGS_sf2_file', - '0002_GeneralUserGS_sf2_file', - '0003_GeneralUserGS_sf2_file', + + // Bright Acoustic Piano: Piano '0010_Aspirin_sf2_file', '0010_Chaos_sf2_file', '0010_FluidR3_GM_sf2_file', '0010_GeneralUserGS_sf2_file', '0010_JCLive_sf2_file', - '0010_SBLive_sf2', - '0010_SoundBlasterOld_sf2', + //'0010_SBLive_sf2', + //'0010_SoundBlasterOld_sf2', '0011_Aspirin_sf2_file', '0011_FluidR3_GM_sf2_file', '0011_GeneralUserGS_sf2_file', - '0012_GeneralUserGS_sf2_file', + '0012_GeneralUserGS_sf2_file', // string?? + + // Electric Grand Piano: Piano '0020_Aspirin_sf2_file', '0020_Chaos_sf2_file', '0020_FluidR3_GM_sf2_file', '0020_GeneralUserGS_sf2_file', '0020_JCLive_sf2_file', - '0020_SBLive_sf2', - '0020_SoundBlasterOld_sf2', + //'0020_SBLive_sf2', + //'0020_SoundBlasterOld_sf2', '0021_Aspirin_sf2_file', '0021_GeneralUserGS_sf2_file', - '0022_Aspirin_sf2_file', + // ? + '0022_Aspirin_sf2_file', // dx7 epiano like + + // Honky-tonk Piano: Piano '0030_Aspirin_sf2_file', '0030_Chaos_sf2_file', '0030_FluidR3_GM_sf2_file', '0030_GeneralUserGS_sf2_file', '0030_JCLive_sf2_file', - '0030_SBLive_sf2', - '0030_SoundBlasterOld_sf2', + //'0030_SBLive_sf2', + //'0030_SoundBlasterOld_sf2', '0031_Aspirin_sf2_file', '0031_FluidR3_GM_sf2_file', '0031_GeneralUserGS_sf2_file', - '0031_SoundBlasterOld_sf2', // pianos until here + //'0031_SoundBlasterOld_sf2', // pianos until here + + // Electric Piano 1: Piano '0040_Aspirin_sf2_file', '0040_Chaos_sf2_file', '0040_FluidR3_GM_sf2_file', // rhodes '0040_GeneralUserGS_sf2_file', // staccato rhodes '0040_JCLive_sf2_file', // warbly rhodes - '0040_SBLive_sf2', // ? - '0040_SoundBlasterOld_sf2', // ? + //'0040_SBLive_sf2', // ? + //'0040_SoundBlasterOld_sf2', // ? '0041_FluidR3_GM_sf2_file', // rhodes '0041_GeneralUserGS_sf2_file', // staccato rhodes - '0041_SoundBlasterOld_sf2', // ? + //'0041_SoundBlasterOld_sf2', // ? '0042_GeneralUserGS_sf2_file', // staccato wurly '0043_GeneralUserGS_sf2_file', // high bell '0044_GeneralUserGS_sf2_file', // reed organ - '0045_GeneralUserGS_sf2_file', // ? - '0046_GeneralUserGS_sf2_file', // ? - '0050_Aspirin_sf2_file', // glass organ - '0050_Chaos_sf2_file', // short glass organ - '0050_FluidR3_GM_sf2_file', // long glass organ ! - '0050_GeneralUserGS_sf2_file', // short glass organ - '0050_JCLive_sf2_file', // glass organ - '0050_SBLive_sf2', // ? - '0050_SoundBlasterOld_sf2', // ? + //'0045_GeneralUserGS_sf2_file', // ? + '0046_GeneralUserGS_sf2_file', // reed organ + + // Electric Piano 2: Piano + '0050_Aspirin_sf2_file', // glass piano + '0050_Chaos_sf2_file', // short glass piano + '0050_FluidR3_GM_sf2_file', // long glass piano ! + // ? + '0050_GeneralUserGS_sf2_file', // short glass piano + // cont + '0050_JCLive_sf2_file', // glass piano + //'0050_SBLive_sf2', // ? + //'0050_SoundBlasterOld_sf2', // ? '0051_FluidR3_GM_sf2_file', // long lass organ '0051_GeneralUserGS_sf2_file', - '0052_GeneralUserGS_sf2_file', // ? + //'0052_GeneralUserGS_sf2_file', // ? '0053_GeneralUserGS_sf2_file', + // normal piano... '0054_GeneralUserGS_sf2_file', // piano + + // Harpsichord: Piano '0060_Aspirin_sf2_file', // harpsichord '0060_Chaos_sf2_file', '0060_FluidR3_GM_sf2_file', // harpsichord ! '0060_GeneralUserGS_sf2_file', '0060_JCLive_sf2_file', - '0060_SBLive_sf2', - '0060_SoundBlasterOld_sf2', + //'0060_SBLive_sf2', + //'0060_SoundBlasterOld_sf2', '0061_Aspirin_sf2_file', '0061_GeneralUserGS_sf2_file', - '0061_SoundBlasterOld_sf2', + //'0061_SoundBlasterOld_sf2', '0062_GeneralUserGS_sf2_file', + + // Clavinet: Piano '0070_Aspirin_sf2_file', '0070_Chaos_sf2_file', '0070_FluidR3_GM_sf2_file', - '0070_GeneralUserGS_sf2_file', + // '0070_GeneralUserGS_sf2_file', // half broken '0070_JCLive_sf2_file', - '0070_SBLive_sf2', - '0070_SoundBlasterOld_sf2', - '0071_GeneralUserGS_sf2_file', + //'0070_SBLive_sf2', + //'0070_SoundBlasterOld_sf2', + // '0071_GeneralUserGS_sf2_file', // half broken + + // Celesta: Chromatic Percussion '0080_Aspirin_sf2_file', '0080_Chaos_sf2_file', '0080_FluidR3_GM_sf2_file', '0080_GeneralUserGS_sf2_file', '0080_JCLive_sf2_file', - '0080_SBLive_sf2', - '0080_SoundBlasterOld_sf2', + //'0080_SBLive_sf2', + //'0080_SoundBlasterOld_sf2', '0081_FluidR3_GM_sf2_file', - '0081_GeneralUserGS_sf2_file', - '0081_SoundBlasterOld_sf2', + // '0081_GeneralUserGS_sf2_file', // weird detuned + //'0081_SoundBlasterOld_sf2', + + // Glockenspiel: Chromatic Percussion '0090_Aspirin_sf2_file', '0090_Chaos_sf2_file', '0090_FluidR3_GM_sf2_file', '0090_GeneralUserGS_sf2_file', '0090_JCLive_sf2_file', - '0090_SBLive_sf2', - '0090_SoundBlasterOld_sf2', - '0091_SoundBlasterOld_sf2', + //'0090_SBLive_sf2', + //'0090_SoundBlasterOld_sf2', + //'0091_SoundBlasterOld_sf2', + + // Music Box: Chromatic Percussion '0100_Aspirin_sf2_file', '0100_Chaos_sf2_file', '0100_FluidR3_GM_sf2_file', '0100_GeneralUserGS_sf2_file', '0100_JCLive_sf2_file', - '0100_SBLive_sf2', - '0100_SoundBlasterOld_sf2', - '0101_GeneralUserGS_sf2_file', - '0101_SoundBlasterOld_sf2', + //'0100_SBLive_sf2', + //'0100_SoundBlasterOld_sf2', + // '0101_GeneralUserGS_sf2_file', // weird detuned + //'0101_SoundBlasterOld_sf2', + + // Vibraphone: Chromatic Percussion '0110_Aspirin_sf2_file', '0110_Chaos_sf2_file', '0110_FluidR3_GM_sf2_file', '0110_GeneralUserGS_sf2_file', '0110_JCLive_sf2_file', - '0110_SBLive_sf2', - '0110_SoundBlasterOld_sf2', + //'0110_SBLive_sf2', + //'0110_SoundBlasterOld_sf2', '0111_FluidR3_GM_sf2_file', + + // Marimba: Chromatic Percussion '0120_Aspirin_sf2_file', '0120_Chaos_sf2_file', '0120_FluidR3_GM_sf2_file', '0120_GeneralUserGS_sf2_file', '0120_JCLive_sf2_file', - '0120_SBLive_sf2', - '0120_SoundBlasterOld_sf2', + //'0120_SBLive_sf2', + //'0120_SoundBlasterOld_sf2', '0121_FluidR3_GM_sf2_file', - '0121_GeneralUserGS_sf2_file', + '0121_GeneralUserGS_sf2_file', // not really a marimba + + // Xylophone: Chromatic Percussion '0130_Aspirin_sf2_file', '0130_Chaos_sf2_file', '0130_FluidR3_GM_sf2_file', '0130_GeneralUserGS_sf2_file', '0130_JCLive_sf2_file', - '0130_SBLive_sf2', - '0130_SoundBlasterOld_sf2', + //'0130_SBLive_sf2', + //'0130_SoundBlasterOld_sf2', '0131_FluidR3_GM_sf2_file', + + // Tubular Bells: Chromatic Percussion '0140_Aspirin_sf2_file', - '0140_Chaos_sf2_file', + // '0140_Chaos_sf2_file', // same as aspirin? '0140_FluidR3_GM_sf2_file', '0140_GeneralUserGS_sf2_file', '0140_JCLive_sf2_file', - '0140_SBLive_sf2', - '0140_SoundBlasterOld_sf2', + //'0140_SBLive_sf2', + //'0140_SoundBlasterOld_sf2', '0141_FluidR3_GM_sf2_file', - '0141_GeneralUserGS_sf2_file', - '0142_GeneralUserGS_sf2_file', - '0143_GeneralUserGS_sf2_file', + //'0141_GeneralUserGS_sf2_file', + '0142_GeneralUserGS_sf2_file', // epiano.. + // '0143_GeneralUserGS_sf2_file', // buggy + + // Dulcimer: Chromatic Percussion '0150_Aspirin_sf2_file', - '0150_Chaos_sf2_file', + '0150_Chaos_sf2_file', // long load? '0150_FluidR3_GM_sf2_file', '0150_GeneralUserGS_sf2_file', - '0150_JCLive_sf2_file', - '0150_SBLive_sf2', - '0150_SoundBlasterOld_sf2', + // '0150_JCLive_sf2_file', // detuned??? + //'0150_SBLive_sf2', + //'0150_SoundBlasterOld_sf2', '0151_FluidR3_GM_sf2_file', + + // Drawbar Organ: Organ '0160_Aspirin_sf2_file', '0160_Chaos_sf2_file', '0160_FluidR3_GM_sf2_file', '0160_GeneralUserGS_sf2_file', '0160_JCLive_sf2_file', - '0160_SBLive_sf2', - '0160_SoundBlasterOld_sf2', + //'0160_SBLive_sf2', + //'0160_SoundBlasterOld_sf2', '0161_Aspirin_sf2_file', '0161_FluidR3_GM_sf2_file', - '0161_SoundBlasterOld_sf2', + //'0161_SoundBlasterOld_sf2', + + // Percussive Organ: Organ '0170_Aspirin_sf2_file', '0170_Chaos_sf2_file', '0170_FluidR3_GM_sf2_file', - '0170_GeneralUserGS_sf2_file', + // '0170_GeneralUserGS_sf2_file', // repitched '0170_JCLive_sf2_file', - '0170_SBLive_sf2', - '0170_SoundBlasterOld_sf2', + //'0170_SBLive_sf2', + //'0170_SoundBlasterOld_sf2', '0171_FluidR3_GM_sf2_file', - '0171_GeneralUserGS_sf2_file', + // '0171_GeneralUserGS_sf2_file', // repitched '0172_FluidR3_GM_sf2_file', + + // Rock Organ: Organ '0180_Aspirin_sf2_file', '0180_Chaos_sf2_file', '0180_FluidR3_GM_sf2_file', '0180_GeneralUserGS_sf2_file', '0180_JCLive_sf2_file', - '0180_SBLive_sf2', - '0180_SoundBlasterOld_sf2', - '0181_Aspirin_sf2_file', - '0181_GeneralUserGS_sf2_file', - '0181_SoundBlasterOld_sf2', + //'0180_SBLive_sf2', + //'0180_SoundBlasterOld_sf2', + //'0181_Aspirin_sf2_file', // flute + //'0181_GeneralUserGS_sf2_file', // marimbalike + //'0181_SoundBlasterOld_sf2', + + // Church Organ: Organ '0190_Aspirin_sf2_file', '0190_Chaos_sf2_file', '0190_FluidR3_GM_sf2_file', '0190_GeneralUserGS_sf2_file', '0190_JCLive_sf2_file', - '0190_SBLive_sf2', - '0190_SoundBlasterOld_sf2', - '0191_Aspirin_sf2_file', - '0191_GeneralUserGS_sf2_file', - '0191_SoundBlasterOld_sf2', + //'0190_SBLive_sf2', + //'0190_SoundBlasterOld_sf2', + //'0191_Aspirin_sf2_file', // string?? + //'0191_GeneralUserGS_sf2_file', // weird organ + //'0191_SoundBlasterOld_sf2', + + // Reed Organ: Organ '0200_Aspirin_sf2_file', '0200_Chaos_sf2_file', '0200_FluidR3_GM_sf2_file', '0200_GeneralUserGS_sf2_file', - '0200_JCLive_sf2_file', - '0200_SBLive_sf2', - '0200_SoundBlasterOld_sf2', - '0201_Aspirin_sf2_file', + '0200_JCLive_sf2_file', // stringy + //'0200_SBLive_sf2', + //'0200_SoundBlasterOld_sf2', + '0201_Aspirin_sf2_file', // stringy '0201_FluidR3_GM_sf2_file', '0201_GeneralUserGS_sf2_file', - '0201_SoundBlasterOld_sf2', - '0210_Aspirin_sf2_file', - '0210_Chaos_sf2_file', + //'0201_SoundBlasterOld_sf2', + //'0210_Aspirin_sf2_file', // buggy + //'0210_Chaos_sf2_file', // buggy + + // Accordion: Organ '0210_FluidR3_GM_sf2_file', '0210_GeneralUserGS_sf2_file', '0210_JCLive_sf2_file', - '0210_SBLive_sf2', - '0210_SoundBlasterOld_sf2', - '0211_Aspirin_sf2_file', + //'0210_SBLive_sf2', + //'0210_SoundBlasterOld_sf2', + '0211_Aspirin_sf2_file', // stringy '0211_FluidR3_GM_sf2_file', '0211_GeneralUserGS_sf2_file', - '0211_SoundBlasterOld_sf2', + //'0211_SoundBlasterOld_sf2', '0212_GeneralUserGS_sf2_file', + + // Harmonica: Organ '0220_Aspirin_sf2_file', '0220_Chaos_sf2_file', '0220_FluidR3_GM_sf2_file', '0220_GeneralUserGS_sf2_file', '0220_JCLive_sf2_file', - '0220_SBLive_sf2', - '0220_SoundBlasterOld_sf2', + //'0220_SBLive_sf2', + //'0220_SoundBlasterOld_sf2', '0221_FluidR3_GM_sf2_file', + + // Tango Accordion: Organ '0230_Aspirin_sf2_file', '0230_Chaos_sf2_file', '0230_FluidR3_GM_sf2_file', '0230_GeneralUserGS_sf2_file', '0230_JCLive_sf2_file', - '0230_SBLive_sf2', - '0230_SoundBlasterOld_sf2', + //'0230_SBLive_sf2', + //'0230_SoundBlasterOld_sf2', '0231_FluidR3_GM_sf2_file', - '0231_GeneralUserGS_sf2_file', + '0231_GeneralUserGS_sf2_file', // warbly '0231_JCLive_sf2_file', - '0231_SoundBlasterOld_sf2', + //'0231_SoundBlasterOld_sf2', '0232_FluidR3_GM_sf2_file', '0233_FluidR3_GM_sf2_file', + + // Acoustic Guitar (nylon): Guitar '0240_Aspirin_sf2_file', '0240_Chaos_sf2_file', '0240_FluidR3_GM_sf2_file', '0240_GeneralUserGS_sf2_file', '0240_JCLive_sf2_file', '0240_LK_Godin_Nylon_SF2_file', - '0240_SBLive_sf2', - '0240_SoundBlasterOld_sf2', - '0241_GeneralUserGS_sf2_file', + //'0240_SBLive_sf2', + //'0240_SoundBlasterOld_sf2', + // '0241_GeneralUserGS_sf2_file', // organ like '0241_JCLive_sf2_file', '0242_JCLive_sf2_file', '0243_JCLive_sf2_file', + + // Acoustic Guitar (steel): Guitar '0253_Acoustic_Guitar_sf2_file', '0250_Aspirin_sf2_file', '0250_Chaos_sf2_file', '0250_FluidR3_GM_sf2_file', '0250_GeneralUserGS_sf2_file', - '0250_JCLive_sf2_file', + // '0250_JCLive_sf2_file', // detuned '0250_LK_AcousticSteel_SF2_file', - '0250_SBLive_sf2', - '0250_SoundBlasterOld_sf2', - '0251_Acoustic_Guitar_sf2_file', - '0251_GeneralUserGS_sf2_file', - '0252_Acoustic_Guitar_sf2_file', - '0252_GeneralUserGS_sf2_file', + //'0250_SBLive_sf2', + //'0250_SoundBlasterOld_sf2', + //'0251_Acoustic_Guitar_sf2_file', // detuned? + // '0251_GeneralUserGS_sf2_file', // broken: missing pitches + // '0252_Acoustic_Guitar_sf2_file', // detuned.. + // '0252_GeneralUserGS_sf2_file', // broken: missing pitches '0253_Acoustic_Guitar_sf2_file', '0253_GeneralUserGS_sf2_file', - '0254_Acoustic_Guitar_sf2_file', + '0254_Acoustic_Guitar_sf2_file', // bends.. detuned '0254_GeneralUserGS_sf2_file', - '0255_GeneralUserGS_sf2_file', - '0260_Aspirin_sf2_file', - '0260_Chaos_sf2_file', + //'0255_GeneralUserGS_sf2_file', // no guitar.. + + // Electric Guitar (jazz): Guitar + '0260_Aspirin_sf2_file', // sounds like an epiano + '0260_Chaos_sf2_file', // weird but cool detune '0260_FluidR3_GM_sf2_file', '0260_GeneralUserGS_sf2_file', '0260_JCLive_sf2_file', - '0260_SBLive_sf2', - '0260_SoundBlasterOld_sf2', - '0260_Stratocaster_sf2_file', + //'0260_SBLive_sf2', + //'0260_SoundBlasterOld_sf2', + '0260_Stratocaster_sf2_file', // -1 octave '0261_GeneralUserGS_sf2_file', - '0261_SoundBlasterOld_sf2', - '0261_Stratocaster_sf2_file', - '0262_Stratocaster_sf2_file', + //'0261_SoundBlasterOld_sf2', + '0261_Stratocaster_sf2_file', // -1 octave + '0262_Stratocaster_sf2_file', // -1 octave + + // Electric Guitar (clean): Guitar '0270_Aspirin_sf2_file', - '0270_Chaos_sf2_file', + '0270_Chaos_sf2_file', // sounds meh '0270_FluidR3_GM_sf2_file', '0270_GeneralUserGS_sf2_file', - '0270_Gibson_Les_Paul_sf2_file', - '0270_JCLive_sf2_file', + //'0270_Gibson_Les_Paul_sf2_file', // detuned + // '0270_JCLive_sf2_file', // broken: missing notes '0270_SBAWE32_sf2_file', - '0270_SBLive_sf2', - '0270_SoundBlasterOld_sf2', - '0270_Stratocaster_sf2_file', + //'0270_SBLive_sf2', + //'0270_SoundBlasterOld_sf2', + '0270_Stratocaster_sf2_file', // -1 octave '0271_GeneralUserGS_sf2_file', - '0271_Stratocaster_sf2_file', - '0272_Stratocaster_sf2_file', + '0271_Stratocaster_sf2_file', // -1 octave + '0272_Stratocaster_sf2_file', // -1 octave + + // Electric Guitar (muted): Guitar '0280_Aspirin_sf2_file', '0280_Chaos_sf2_file', - '0280_FluidR3_GM_sf2_file', + // '0280_FluidR3_GM_sf2_file', // broken: wrong notes '0280_GeneralUserGS_sf2_file', '0280_JCLive_sf2_file', - '0280_LesPaul_sf2', - '0280_LesPaul_sf2_file', + //'0280_LesPaul_sf2', // missing + '0280_LesPaul_sf2_file', // not really muted.. '0280_SBAWE32_sf2_file', - '0280_SBLive_sf2', - '0280_SoundBlasterOld_sf2', + //'0280_SBLive_sf2', + //'0280_SoundBlasterOld_sf2', '0281_Aspirin_sf2_file', '0281_FluidR3_GM_sf2_file', '0281_GeneralUserGS_sf2_file', '0282_FluidR3_GM_sf2_file', - '0282_GeneralUserGS_sf2_file', - '0283_GeneralUserGS_sf2_file', + // '0282_GeneralUserGS_sf2_file', // broken: missing notes + // '0283_GeneralUserGS_sf2_file', // missing + + // Overdriven Guitar: Guitar '0290_Aspirin_sf2_file', '0290_Chaos_sf2_file', '0290_FluidR3_GM_sf2_file', '0290_GeneralUserGS_sf2_file', - '0290_JCLive_sf2_file', - '0290_LesPaul_sf2', + //'0290_JCLive_sf2_file', // detuned.... + //'0290_LesPaul_sf2', // broken '0290_LesPaul_sf2_file', '0290_SBAWE32_sf2_file', - '0290_SBLive_sf2', - '0290_SoundBlasterOld_sf2', - '0291_Aspirin_sf2_file', - '0291_LesPaul_sf2', + //'0290_SBLive_sf2', + //'0290_SoundBlasterOld_sf2', + // '0291_Aspirin_sf2_file', // broken + // '0291_LesPaul_sf2', // broken '0291_LesPaul_sf2_file', '0291_SBAWE32_sf2_file', - '0291_SoundBlasterOld_sf2', + //'0291_SoundBlasterOld_sf2', '0292_Aspirin_sf2_file', - '0292_LesPaul_sf2', + // '0292_LesPaul_sf2', // broken '0292_LesPaul_sf2_file', + + // Distortion Guitar: Guitar '0300_Aspirin_sf2_file', '0300_Chaos_sf2_file', '0300_FluidR3_GM_sf2_file', '0300_GeneralUserGS_sf2_file', - '0300_JCLive_sf2_file', - '0300_LesPaul_sf2', + // '0300_JCLive_sf2_file', // broken + // '0300_LesPaul_sf2', // broken '0300_LesPaul_sf2_file', - '0300_SBAWE32_sf2_file', - '0300_SBLive_sf2', - '0300_SoundBlasterOld_sf2', - '0301_Aspirin_sf2_file', - '0301_FluidR3_GM_sf2_file', - '0301_GeneralUserGS_sf2_file', - '0301_JCLive_sf2_file', - '0301_LesPaul_sf2', - '0301_LesPaul_sf2_file', + //'0300_SBAWE32_sf2_file', // -2 octave + //'0300_SBLive_sf2', + //'0300_SoundBlasterOld_sf2', + // '0301_Aspirin_sf2_file', // missing + //'0301_FluidR3_GM_sf2_file', // weird broken bell + // '0301_GeneralUserGS_sf2_file', // broken + // '0301_JCLive_sf2_file', // broken + // '0301_LesPaul_sf2', // missing + // '0301_LesPaul_sf2_file', // + 1 oct? '0302_Aspirin_sf2_file', - '0302_GeneralUserGS_sf2_file', - '0302_JCLive_sf2_file', - '0303_Aspirin_sf2_file', + // '0302_GeneralUserGS_sf2_file', // not a guitar.. + //'0302_JCLive_sf2_file', // broken... + // '0303_Aspirin_sf2_file', // guitar harmonic?? '0304_Aspirin_sf2_file', + + // Guitar Harmonics: Guitar '0310_Aspirin_sf2_file', '0310_Chaos_sf2_file', - '0310_FluidR3_GM_sf2_file', - '0310_GeneralUserGS_sf2_file', - '0310_JCLive_sf2_file', - '0310_LesPaul_sf2', - '0310_LesPaul_sf2_file', - '0310_SBAWE32_sf2_file', - '0310_SBLive_sf2', - '0310_SoundBlasterOld_sf2', - '0311_FluidR3_GM_sf2_file', - '0311_GeneralUserGS_sf2_file', + '0310_FluidR3_GM_sf2_file', // weird.. + //'0310_GeneralUserGS_sf2_file', // weird.. + // '0310_JCLive_sf2_file', // weird + //'0310_LesPaul_sf2', // missing + //'0310_LesPaul_sf2_file', // wrong pitches + //'0310_SBAWE32_sf2_file', // wrong pitches + //'0310_SBLive_sf2', + //'0310_SoundBlasterOld_sf2', + //'0311_FluidR3_GM_sf2_file', // knackt + //'0311_GeneralUserGS_sf2_file', // wrong notes + + // Acoustic Bass: Bass '0320_Aspirin_sf2_file', '0320_Chaos_sf2_file', '0320_FluidR3_GM_sf2_file', - '0320_GeneralUserGS_sf2_file', + // '0320_GeneralUserGS_sf2_file', // missing notes '0320_JCLive_sf2_file', - '0320_SBLive_sf2', - '0320_SoundBlasterOld_sf2', - '0321_GeneralUserGS_sf2_file', - '0322_GeneralUserGS_sf2_file', + //'0320_SBLive_sf2', + //'0320_SoundBlasterOld_sf2', + // '0321_GeneralUserGS_sf2_file', // nice sound but missing notes + // '0322_GeneralUserGS_sf2_file', // missing notes + + // Electric Bass (finger): Bass '0330_Aspirin_sf2_file', - '0330_Chaos_sf2_file', - '0330_FluidR3_GM_sf2_file', - '0330_GeneralUserGS_sf2_file', + //'0330_Chaos_sf2_file', // same as last + '0330_FluidR3_GM_sf2_file', // knackt.. + '0330_GeneralUserGS_sf2_file', // -1 oct '0330_JCLive_sf2_file', - '0330_SBLive_sf2', - '0330_SoundBlasterOld_sf2', - '0331_GeneralUserGS_sf2_file', - '0332_GeneralUserGS_sf2_file', + //'0330_SBLive_sf2', + //'0330_SoundBlasterOld_sf2', + //'0331_GeneralUserGS_sf2_file', // knackt + // '0332_GeneralUserGS_sf2_file', // missing + + // Electric Bass (pick): Bass '0340_Aspirin_sf2_file', - '0340_Chaos_sf2_file', + //'0340_Chaos_sf2_file', // same as last '0340_FluidR3_GM_sf2_file', - '0340_GeneralUserGS_sf2_file', + '0340_GeneralUserGS_sf2_file', // -1oct '0340_JCLive_sf2_file', - '0340_SBLive_sf2', - '0340_SoundBlasterOld_sf2', + //'0340_SBLive_sf2', + //'0340_SoundBlasterOld_sf2', '0341_Aspirin_sf2_file', - '0341_GeneralUserGS_sf2_file', + //'0341_GeneralUserGS_sf2_file', // knackt + + // Fretless Bass: Bass '0350_Aspirin_sf2_file', - '0350_Chaos_sf2_file', - '0350_FluidR3_GM_sf2_file', - '0350_GeneralUserGS_sf2_file', - '0350_JCLive_sf2_file', - '0350_SBLive_sf2', - '0350_SoundBlasterOld_sf2', - '0351_GeneralUserGS_sf2_file', + // '0350_Chaos_sf2_file', // same as last + //'0350_FluidR3_GM_sf2_file', // knackt + //'0350_GeneralUserGS_sf2_file', // -1 oct + knackt + '0350_JCLive_sf2_file', // weird detuned + //'0350_SBLive_sf2', + //'0350_SoundBlasterOld_sf2', + //'0351_GeneralUserGS_sf2_file', // missing + + // Slap Bass 1: Bass '0360_Aspirin_sf2_file', '0360_Chaos_sf2_file', - '0360_FluidR3_GM_sf2_file', - '0360_GeneralUserGS_sf2_file', + '0360_FluidR3_GM_sf2_file', // knackt + //'0360_GeneralUserGS_sf2_file', // -1 oct '0360_JCLive_sf2_file', - '0360_SBLive_sf2', - '0360_SoundBlasterOld_sf2', - '0361_GeneralUserGS_sf2_file', + //'0360_SBLive_sf2', + //'0360_SoundBlasterOld_sf2', + //'0361_GeneralUserGS_sf2_file', // missing + + // Slap Bass 2: Bass '0370_Aspirin_sf2_file', - '0370_Chaos_sf2_file', + // '0370_Chaos_sf2_file', // same as last '0370_FluidR3_GM_sf2_file', '0370_GeneralUserGS_sf2_file', '0370_JCLive_sf2_file', - '0370_SBLive_sf2', - '0370_SoundBlasterOld_sf2', - '0371_GeneralUserGS_sf2_file', - '0372_GeneralUserGS_sf2_file', - '0385_GeneralUserGS_sf2_file', - '0380_Aspirin_sf2_file', + //'0370_SBLive_sf2', + //'0370_SoundBlasterOld_sf2', + //'0371_GeneralUserGS_sf2_file', // missing + //'0372_GeneralUserGS_sf2_file', // detuned + //'0385_GeneralUserGS_sf2_file', // missing + + // Synth Bass 1: Bass + '0380_Aspirin_sf2_file', // laut! '0380_Chaos_sf2_file', - '0380_FluidR3_GM_sf2_file', - '0380_GeneralUserGS_sf2_file', + '0380_FluidR3_GM_sf2_file', // bisl detuned + // '0380_GeneralUserGS_sf2_file', // laut '0380_JCLive_sf2_file', - '0380_SBLive_sf2', - '0380_SoundBlasterOld_sf2', - '0381_FluidR3_GM_sf2_file', + //'0380_SBLive_sf2', + //'0380_SoundBlasterOld_sf2', + '0381_FluidR3_GM_sf2_file', // bisl detuned '0381_GeneralUserGS_sf2_file', - '0382_FluidR3_GM_sf2_file', + //'0382_FluidR3_GM_sf2_file', // kein synth bass '0382_GeneralUserGS_sf2_file', '0383_GeneralUserGS_sf2_file', '0384_GeneralUserGS_sf2_file', - '0386_GeneralUserGS_sf2_file', + //'0386_GeneralUserGS_sf2_file', // knackt '0387_GeneralUserGS_sf2_file', + + // Synth Bass 2: Bass '0390_Aspirin_sf2_file', - '0390_Chaos_sf2_file', + // '0390_Chaos_sf2_file', // same as last '0390_FluidR3_GM_sf2_file', '0390_GeneralUserGS_sf2_file', '0390_JCLive_sf2_file', - '0390_SBLive_sf2', - '0390_SoundBlasterOld_sf2', - '0391_FluidR3_GM_sf2_file', - '0391_GeneralUserGS_sf2_file', - '0391_SoundBlasterOld_sf2', - '0392_FluidR3_GM_sf2_file', - '0392_GeneralUserGS_sf2_file', - '0393_GeneralUserGS_sf2_file', + //'0390_SBLive_sf2', + //'0390_SoundBlasterOld_sf2', + '0391_FluidR3_GM_sf2_file', // lauuut + // '0391_GeneralUserGS_sf2_file', // missing + //'0391_SoundBlasterOld_sf2', + '0392_FluidR3_GM_sf2_file', // lauut + //'0392_GeneralUserGS_sf2_file', // kein synth und -1oct + '0393_GeneralUserGS_sf2_file', // lauuuut + + // Violin: Strings '0400_Aspirin_sf2_file', '0400_Chaos_sf2_file', '0400_FluidR3_GM_sf2_file', '0400_GeneralUserGS_sf2_file', '0400_JCLive_sf2_file', - '0400_SBLive_sf2', - '0400_SoundBlasterOld_sf2', - '0401_Aspirin_sf2_file', + //'0400_SBLive_sf2', + //'0400_SoundBlasterOld_sf2', + '0401_Aspirin_sf2_file', // synth '0401_FluidR3_GM_sf2_file', '0401_GeneralUserGS_sf2_file', - '0402_GeneralUserGS_sf2_file', + '0402_GeneralUserGS_sf2_file', // pizzicato + + // Viola: Strings '0410_Aspirin_sf2_file', - '0410_Chaos_sf2_file', + // '0410_Chaos_sf2_file', // laut und sehr unstringy '0410_FluidR3_GM_sf2_file', '0410_GeneralUserGS_sf2_file', - '0410_JCLive_sf2_file', - '0410_SBLive_sf2', - '0410_SoundBlasterOld_sf2', + '0410_JCLive_sf2_file', // <3 + //'0410_SBLive_sf2', + //'0410_SoundBlasterOld_sf2', '0411_FluidR3_GM_sf2_file', + + // Cello: Strings '0420_Aspirin_sf2_file', - '0420_Chaos_sf2_file', + // '0420_Chaos_sf2_file', // kein cello und laut '0420_FluidR3_GM_sf2_file', '0420_GeneralUserGS_sf2_file', '0420_JCLive_sf2_file', - '0420_SBLive_sf2', - '0420_SoundBlasterOld_sf2', + //'0420_SBLive_sf2', + //'0420_SoundBlasterOld_sf2', '0421_FluidR3_GM_sf2_file', - '0421_GeneralUserGS_sf2_file', + '0421_GeneralUserGS_sf2_file', // pizzicato + + // Contrabass: Strings '0430_Aspirin_sf2_file', '0430_Chaos_sf2_file', - '0430_FluidR3_GM_sf2_file', + // '0430_FluidR3_GM_sf2_file', // missing notes '0430_GeneralUserGS_sf2_file', - '0430_JCLive_sf2_file', - '0430_SBLive_sf2', - '0430_SoundBlasterOld_sf2', - '0431_FluidR3_GM_sf2_file', + //'0430_JCLive_sf2_file', // -1 oct und meh + //'0430_SBLive_sf2', + //'0430_SoundBlasterOld_sf2', + // '0431_FluidR3_GM_sf2_file', // missing notes + + // Tremolo Strings: Strings '0440_Aspirin_sf2_file', '0440_Chaos_sf2_file', - '0440_FluidR3_GM_sf2_file', + //'0440_FluidR3_GM_sf2_file', // huuuge '0440_GeneralUserGS_sf2_file', '0440_JCLive_sf2_file', - '0440_SBLive_sf2', - '0440_SoundBlasterOld_sf2', + //'0440_SBLive_sf2', + //'0440_SoundBlasterOld_sf2', '0441_GeneralUserGS_sf2_file', '0442_GeneralUserGS_sf2_file', + + // Pizzicato Strings: Strings '0450_Aspirin_sf2_file', - '0450_Chaos_sf2_file', - '0450_FluidR3_GM_sf2_file', - '0450_GeneralUserGS_sf2_file', - '0450_JCLive_sf2_file', - '0450_SBLive_sf2', - '0450_SoundBlasterOld_sf2', + '0450_Chaos_sf2_file', // same as last + '0450_FluidR3_GM_sf2_file', // chrono trigger flashback + '0450_GeneralUserGS_sf2_file', // -1 oct? + '0450_JCLive_sf2_file', // filter env + //'0450_SBLive_sf2', + //'0450_SoundBlasterOld_sf2', '0451_FluidR3_GM_sf2_file', + + // Orchestral Harp: Strings '0460_Aspirin_sf2_file', - '0460_Chaos_sf2_file', + // '0460_Chaos_sf2_file', // knackt '0460_FluidR3_GM_sf2_file', '0460_GeneralUserGS_sf2_file', '0460_JCLive_sf2_file', - '0460_SBLive_sf2', - '0460_SoundBlasterOld_sf2', + //'0460_SBLive_sf2', + //'0460_SoundBlasterOld_sf2', '0461_FluidR3_GM_sf2_file', + + // Timpani: Strings '0470_Aspirin_sf2_file', '0470_Chaos_sf2_file', '0470_FluidR3_GM_sf2_file', '0470_GeneralUserGS_sf2_file', - '0470_JCLive_sf2_file', - '0470_SBLive_sf2', - '0470_SoundBlasterOld_sf2', + // '0470_JCLive_sf2_file', // wrong pitches + //'0470_SBLive_sf2', + //'0470_SoundBlasterOld_sf2', '0471_FluidR3_GM_sf2_file', '0471_GeneralUserGS_sf2_file', + + // String Ensemble 1: Ensemble '0480_Aspirin_sf2_file', '0480_Chaos_sf2_file', - '0480_FluidR3_GM_sf2_file', + '0480_FluidR3_GM_sf2_file', // large '0480_GeneralUserGS_sf2_file', '0480_JCLive_sf2_file', - '0480_SBLive_sf2', - '0480_SoundBlasterOld_sf2', - '04810_GeneralUserGS_sf2_file', - '04811_GeneralUserGS_sf2_file', - '04812_GeneralUserGS_sf2_file', - '04813_GeneralUserGS_sf2_file', - '04814_GeneralUserGS_sf2_file', - '04815_GeneralUserGS_sf2_file', - '04816_GeneralUserGS_sf2_file', - '04817_GeneralUserGS_sf2_file', + //'0480_SBLive_sf2', + //'0480_SoundBlasterOld_sf2', + // these dont work.. + //'04810_GeneralUserGS_sf2_file', // missing notes + brass + //'04811_GeneralUserGS_sf2_file', // missing notes + brass + //'04812_GeneralUserGS_sf2_file', + //'04813_GeneralUserGS_sf2_file', + //'04814_GeneralUserGS_sf2_file', + //'04815_GeneralUserGS_sf2_file', + //'04816_GeneralUserGS_sf2_file', + //'04817_GeneralUserGS_sf2_file', '0481_Aspirin_sf2_file', - '0481_FluidR3_GM_sf2_file', + '0481_FluidR3_GM_sf2_file', // brass '0481_GeneralUserGS_sf2_file', - '0482_Aspirin_sf2_file', + '0482_Aspirin_sf2_file', // brass '0482_GeneralUserGS_sf2_file', - '0483_GeneralUserGS_sf2_file', - '0484_GeneralUserGS_sf2_file', - '0485_GeneralUserGS_sf2_file', - '0486_GeneralUserGS_sf2_file', - '0487_GeneralUserGS_sf2_file', - '0488_GeneralUserGS_sf2_file', - '0489_GeneralUserGS_sf2_file', + '0483_GeneralUserGS_sf2_file', // brass + // another block of buggyness: + //'0484_GeneralUserGS_sf2_file', // keys?! + knackt + //'0485_GeneralUserGS_sf2_file', // missing notes + //'0486_GeneralUserGS_sf2_file', + //'0487_GeneralUserGS_sf2_file', + //'0488_GeneralUserGS_sf2_file', + //'0489_GeneralUserGS_sf2_file', + + // String Ensemble 2: Ensemble '0490_Aspirin_sf2_file', '0490_Chaos_sf2_file', - '0490_FluidR3_GM_sf2_file', + '0490_FluidR3_GM_sf2_file', // large '0490_GeneralUserGS_sf2_file', '0490_JCLive_sf2_file', - '0490_SBLive_sf2', - '0490_SoundBlasterOld_sf2', + //'0490_SBLive_sf2', + //'0490_SoundBlasterOld_sf2', '0491_GeneralUserGS_sf2_file', '0492_GeneralUserGS_sf2_file', + + // Synth Strings 1: Ensemble '0500_Aspirin_sf2_file', - '0500_Chaos_sf2_file', - '0500_FluidR3_GM_sf2_file', + // '0500_Chaos_sf2_file', // same as above + //'0500_FluidR3_GM_sf2_file', // detune + knack '0500_GeneralUserGS_sf2_file', '0500_JCLive_sf2_file', - '0500_SBLive_sf2', - '0500_SoundBlasterOld_sf2', + //'0500_SBLive_sf2', + //'0500_SoundBlasterOld_sf2', '0501_FluidR3_GM_sf2_file', - '0501_GeneralUserGS_sf2_file', - '0502_FluidR3_GM_sf2_file', + // '0501_GeneralUserGS_sf2_file', // crackles + // '0502_FluidR3_GM_sf2_file', // missing '0502_GeneralUserGS_sf2_file', - '0503_FluidR3_GM_sf2_file', - '0504_FluidR3_GM_sf2_file', + '0503_FluidR3_GM_sf2_file', // large + // '0504_FluidR3_GM_sf2_file', // missing '0505_FluidR3_GM_sf2_file', + + // Synth Strings 2: Ensemble '0510_Aspirin_sf2_file', '0510_Chaos_sf2_file', - '0510_FluidR3_GM_sf2_file', + // '0510_FluidR3_GM_sf2_file', // detune + crackle '0510_GeneralUserGS_sf2_file', - '0510_JCLive_sf2_file', - '0510_SBLive_sf2', - '0510_SoundBlasterOld_sf2', - '0511_GeneralUserGS_sf2_file', - '0511_SoundBlasterOld_sf2', + //'0510_JCLive_sf2_file', // laarge and meh + //'0510_SBLive_sf2', // missing + //'0510_SoundBlasterOld_sf2', + '0511_GeneralUserGS_sf2_file', // crackly + //'0511_SoundBlasterOld_sf2', + + // Choir Aahs: Ensemble '0520_Aspirin_sf2_file', '0520_Chaos_sf2_file', '0520_FluidR3_GM_sf2_file', '0520_GeneralUserGS_sf2_file', '0520_JCLive_sf2_file', - '0520_SBLive_sf2', - '0520_Soul_Ahhs_sf2_file', - '0520_SoundBlasterOld_sf2', + //'0520_SBLive_sf2', + '0520_Soul_Ahhs_sf2_file', // large + //'0520_SoundBlasterOld_sf2', '0521_FluidR3_GM_sf2_file', - '0521_Soul_Ahhs_sf2_file', - '0521_SoundBlasterOld_sf2', - '0522_Soul_Ahhs_sf2_file', + '0521_Soul_Ahhs_sf2_file', // large + //'0521_SoundBlasterOld_sf2', + '0522_Soul_Ahhs_sf2_file', // large + + // Voice Oohs: Ensemble '0530_Aspirin_sf2_file', '0530_Chaos_sf2_file', '0530_FluidR3_GM_sf2_file', '0530_GeneralUserGS_sf2_file', - '0530_JCLive_sf2_file', - '0530_SBLive_sf2', - '0530_Soul_Ahhs_sf2_file', - '0530_SoundBlasterOld_sf2', + //'0530_JCLive_sf2_file', // same as above + //'0530_SBLive_sf2', + // '0530_Soul_Ahhs_sf2_file', // not ooh + //'0530_SoundBlasterOld_sf2', '0531_FluidR3_GM_sf2_file', - '0531_GeneralUserGS_sf2_file', + // '0531_GeneralUserGS_sf2_file', // ends crackle '0531_JCLive_sf2_file', - '0531_SoundBlasterOld_sf2', + //'0531_SoundBlasterOld_sf2', + + // Synth Choir: Ensemble '0540_Aspirin_sf2_file', '0540_Chaos_sf2_file', '0540_FluidR3_GM_sf2_file', '0540_GeneralUserGS_sf2_file', - '0540_JCLive_sf2_file', - '0540_SBLive_sf2', - '0540_SoundBlasterOld_sf2', + //'0540_JCLive_sf2_file', // large + crackles + //'0540_SBLive_sf2', + //'0540_SoundBlasterOld_sf2', '0541_FluidR3_GM_sf2_file', + + // Orchestra Hit: Ensemble '0550_Aspirin_sf2_file', '0550_Chaos_sf2_file', '0550_FluidR3_GM_sf2_file', '0550_GeneralUserGS_sf2_file', - '0550_JCLive_sf2_file', - '0550_SBLive_sf2', - '0550_SoundBlasterOld_sf2', - '0551_Aspirin_sf2_file', + //'0550_JCLive_sf2_file', // same as above + //'0550_SBLive_sf2', + //'0550_SoundBlasterOld_sf2', + //'0551_Aspirin_sf2_file', // not an orch hit.. '0551_FluidR3_GM_sf2_file', + + // Trumpet: Brass '0560_Aspirin_sf2_file', '0560_Chaos_sf2_file', '0560_FluidR3_GM_sf2_file', - '0560_GeneralUserGS_sf2_file', + //'0560_GeneralUserGS_sf2_file', // -1 oct '0560_JCLive_sf2_file', - '0560_SBLive_sf2', - '0560_SoundBlasterOld_sf2', + //'0560_SBLive_sf2', + //'0560_SoundBlasterOld_sf2', + + // Trombone: Brass '0570_Aspirin_sf2_file', '0570_Chaos_sf2_file', '0570_FluidR3_GM_sf2_file', '0570_GeneralUserGS_sf2_file', - '0570_JCLive_sf2_file', - '0570_SBLive_sf2', - '0570_SoundBlasterOld_sf2', + //'0570_JCLive_sf2_file', // -1oct + //'0570_SBLive_sf2', + //'0570_SoundBlasterOld_sf2', '0571_GeneralUserGS_sf2_file', + + // Tuba: Brass '0580_Aspirin_sf2_file', '0580_Chaos_sf2_file', '0580_FluidR3_GM_sf2_file', '0580_GeneralUserGS_sf2_file', - '0580_JCLive_sf2_file', - '0580_SBLive_sf2', - '0580_SoundBlasterOld_sf2', - '0581_GeneralUserGS_sf2_file', + //'0580_JCLive_sf2_file', // -1oct + //'0580_SBLive_sf2', + //'0580_SoundBlasterOld_sf2', + //'0581_GeneralUserGS_sf2_file', // missing + + // Muted Trumpet: Brass '0590_Aspirin_sf2_file', '0590_Chaos_sf2_file', '0590_FluidR3_GM_sf2_file', '0590_GeneralUserGS_sf2_file', - '0590_JCLive_sf2_file', - '0590_SBLive_sf2', - '0590_SoundBlasterOld_sf2', - '0591_GeneralUserGS_sf2_file', + '0590_JCLive_sf2_file', // winner + //'0590_SBLive_sf2', + //'0590_SoundBlasterOld_sf2', + // '0591_GeneralUserGS_sf2_file', // missing + + // French Horn: Brass '0600_Aspirin_sf2_file', - '0600_Chaos_sf2_file', - '0600_FluidR3_GM_sf2_file', - '0600_GeneralUserGS_sf2_file', - '0600_JCLive_sf2_file', - '0600_SBLive_sf2', - '0600_SoundBlasterOld_sf2', + //'0600_Chaos_sf2_file', // weird jumps + '0600_FluidR3_GM_sf2_file', // tiny crackles + '0600_GeneralUserGS_sf2_file', // tiny crackles + '0600_JCLive_sf2_file', // tiny crackles + //'0600_SBLive_sf2', + //'0600_SoundBlasterOld_sf2', '0601_FluidR3_GM_sf2_file', - '0601_GeneralUserGS_sf2_file', - '0602_GeneralUserGS_sf2_file', - '0603_GeneralUserGS_sf2_file', + //'0601_GeneralUserGS_sf2_file', // tiny crackles + // '0602_GeneralUserGS_sf2_file', // bad gain diffs + // '0603_GeneralUserGS_sf2_file', // tiny crackles + + // Brass Section: Brass '0610_Aspirin_sf2_file', '0610_Chaos_sf2_file', - '0610_FluidR3_GM_sf2_file', + '0610_FluidR3_GM_sf2_file', // large '0610_GeneralUserGS_sf2_file', '0610_JCLive_sf2_file', - '0610_SBLive_sf2', - '0610_SoundBlasterOld_sf2', - '0611_GeneralUserGS_sf2_file', - '0612_GeneralUserGS_sf2_file', - '0613_GeneralUserGS_sf2_file', - '0614_GeneralUserGS_sf2_file', - '0615_GeneralUserGS_sf2_file', + //'0610_SBLive_sf2', + //'0610_SoundBlasterOld_sf2', + // '0611_GeneralUserGS_sf2_file', // missing sounds + // '0612_GeneralUserGS_sf2_file', + //'0613_GeneralUserGS_sf2_file', // -1 oct + // '0614_GeneralUserGS_sf2_file', // missing sounds + // '0615_GeneralUserGS_sf2_file', // missing sounds + + // Synth Brass 1: Brass '0620_Aspirin_sf2_file', - '0620_Chaos_sf2_file', + //'0620_Chaos_sf2_file', // weird gain diff '0620_FluidR3_GM_sf2_file', - '0620_GeneralUserGS_sf2_file', - '0620_JCLive_sf2_file', - '0620_SBLive_sf2', - '0620_SoundBlasterOld_sf2', + //'0620_GeneralUserGS_sf2_file', // loooud + // '0620_JCLive_sf2_file', // weird gain diff + //'0620_SBLive_sf2', + //'0620_SoundBlasterOld_sf2', '0621_Aspirin_sf2_file', '0621_FluidR3_GM_sf2_file', - '0621_GeneralUserGS_sf2_file', - '0622_FluidR3_GM_sf2_file', - '0622_GeneralUserGS_sf2_file', + // '0621_GeneralUserGS_sf2_file', // detune + loooud + //'0622_FluidR3_GM_sf2_file', // loud.. + //'0622_GeneralUserGS_sf2_file', // loud + crackles + + // Synth Brass 2: Brass '0630_Aspirin_sf2_file', '0630_Chaos_sf2_file', '0630_FluidR3_GM_sf2_file', - '0630_GeneralUserGS_sf2_file', + //'0630_GeneralUserGS_sf2_file', // detune + looud '0630_JCLive_sf2_file', - '0630_SBLive_sf2', - '0630_SoundBlasterOld_sf2', - '0631_Aspirin_sf2_file', + //'0630_SBLive_sf2', + //'0630_SoundBlasterOld_sf2', + // '0631_Aspirin_sf2_file', // looud + detune + gain diffs '0631_FluidR3_GM_sf2_file', - '0631_GeneralUserGS_sf2_file', + //'0631_GeneralUserGS_sf2_file', // crackles '0632_FluidR3_GM_sf2_file', - '0633_FluidR3_GM_sf2_file', + '0633_FluidR3_GM_sf2_file', // tiny crackles + + // Soprano Sax: Reed '0640_Aspirin_sf2_file', '0640_Chaos_sf2_file', '0640_FluidR3_GM_sf2_file', - '0640_GeneralUserGS_sf2_file', + // '0640_GeneralUserGS_sf2_file', // crackles '0640_JCLive_sf2_file', - '0640_SBLive_sf2', - '0640_SoundBlasterOld_sf2', + //'0640_SBLive_sf2', + //'0640_SoundBlasterOld_sf2', '0641_FluidR3_GM_sf2_file', - '0650_Aspirin_sf2_file', + + // Alto Sax: Reed + //'0650_Aspirin_sf2_file', // this is not an alto sax '0650_Chaos_sf2_file', - '0650_FluidR3_GM_sf2_file', + '0650_FluidR3_GM_sf2_file', // sounds really stringy '0650_GeneralUserGS_sf2_file', '0650_JCLive_sf2_file', - '0650_SBLive_sf2', - '0650_SoundBlasterOld_sf2', + //'0650_SBLive_sf2', + //'0650_SoundBlasterOld_sf2', '0651_Aspirin_sf2_file', - '0651_FluidR3_GM_sf2_file', + '0651_FluidR3_GM_sf2_file', // really stringy + + // Tenor Sax: Reed '0660_Aspirin_sf2_file', '0660_Chaos_sf2_file', - '0660_FluidR3_GM_sf2_file', + //'0660_FluidR3_GM_sf2_file', // weird pitches '0660_GeneralUserGS_sf2_file', '0660_JCLive_sf2_file', - '0660_SBLive_sf2', - '0660_SoundBlasterOld_sf2', - '0661_FluidR3_GM_sf2_file', - '0661_GeneralUserGS_sf2_file', + //'0660_SBLive_sf2', + //'0660_SoundBlasterOld_sf2', + // '0661_FluidR3_GM_sf2_file', // weird pitches + // '0661_GeneralUserGS_sf2_file', // missing + + // Baritone Sax: Reed '0670_Aspirin_sf2_file', '0670_Chaos_sf2_file', - '0670_FluidR3_GM_sf2_file', + '0670_FluidR3_GM_sf2_file', // huge '0670_GeneralUserGS_sf2_file', '0670_JCLive_sf2_file', - '0670_SBLive_sf2', - '0670_SoundBlasterOld_sf2', - '0671_FluidR3_GM_sf2_file', - '0680_Aspirin_sf2_file', - '0680_Chaos_sf2_file', - '0680_FluidR3_GM_sf2_file', + //'0670_SBLive_sf2', + //'0670_SoundBlasterOld_sf2', + '0671_FluidR3_GM_sf2_file', // huge + + // Oboe: Reed + //'0680_Aspirin_sf2_file', // tiny crackles + '0680_Chaos_sf2_file', // tiny crackles + '0680_FluidR3_GM_sf2_file', // tiny crackles '0680_GeneralUserGS_sf2_file', '0680_JCLive_sf2_file', - '0680_SBLive_sf2', - '0680_SoundBlasterOld_sf2', - '0681_FluidR3_GM_sf2_file', + //'0680_SBLive_sf2', + //'0680_SoundBlasterOld_sf2', + '0681_FluidR3_GM_sf2_file', // tiny crackles + + // English Horn: Reed '0690_Aspirin_sf2_file', - '0690_Chaos_sf2_file', + //'0690_Chaos_sf2_file', // detuned '0690_FluidR3_GM_sf2_file', - '0690_GeneralUserGS_sf2_file', + //'0690_GeneralUserGS_sf2_file', // +1 oct '0690_JCLive_sf2_file', - '0690_SBLive_sf2', - '0690_SoundBlasterOld_sf2', - '0691_FluidR3_GM_sf2_file', - '0700_Aspirin_sf2_file', - '0700_Chaos_sf2_file', + //'0690_SBLive_sf2', + //'0690_SoundBlasterOld_sf2', + '0691_FluidR3_GM_sf2_file', // tiny crackles + + // Bassoon: Reed + //'0700_Aspirin_sf2_file', // detune + gain diffs + // '0700_Chaos_sf2_file', // detune + crackles '0700_FluidR3_GM_sf2_file', - '0700_GeneralUserGS_sf2_file', + '0700_GeneralUserGS_sf2_file', // tiny crackles '0700_JCLive_sf2_file', - '0700_SBLive_sf2', - '0700_SoundBlasterOld_sf2', - '0701_FluidR3_GM_sf2_file', - '0701_GeneralUserGS_sf2_file', - '0710_Aspirin_sf2_file', - '0710_Chaos_sf2_file', + //'0700_SBLive_sf2', + //'0700_SoundBlasterOld_sf2', + '0701_FluidR3_GM_sf2_file', // tiny crackles + //'0701_GeneralUserGS_sf2_file', // missing + + // Clarinet: Reed + '0710_Aspirin_sf2_file', // tiny crackles + '0710_Chaos_sf2_file', // tiny crackles '0710_FluidR3_GM_sf2_file', '0710_GeneralUserGS_sf2_file', '0710_JCLive_sf2_file', - '0710_SBLive_sf2', - '0710_SoundBlasterOld_sf2', + //'0710_SBLive_sf2', + //'0710_SoundBlasterOld_sf2', '0711_FluidR3_GM_sf2_file', - '0720_Aspirin_sf2_file', - '0720_Chaos_sf2_file', + + // Piccolo: Pipe + '0720_Aspirin_sf2_file', // +1oct + // '0720_Chaos_sf2_file', // not a piccolo '0720_FluidR3_GM_sf2_file', - '0720_GeneralUserGS_sf2_file', + '0720_GeneralUserGS_sf2_file', // crackles '0720_JCLive_sf2_file', - '0720_SBLive_sf2', - '0720_SoundBlasterOld_sf2', + //'0720_SBLive_sf2', + //'0720_SoundBlasterOld_sf2', '0721_FluidR3_GM_sf2_file', - '0721_SoundBlasterOld_sf2', + //'0721_SoundBlasterOld_sf2', + + // Flute: Pipe '0730_Aspirin_sf2_file', - '0730_Chaos_sf2_file', + //'0730_Chaos_sf2_file', // etune '0730_FluidR3_GM_sf2_file', '0730_GeneralUserGS_sf2_file', '0730_JCLive_sf2_file', - '0730_SBLive_sf2', - '0730_SoundBlasterOld_sf2', - '0731_Aspirin_sf2_file', + //'0730_SBLive_sf2', + //'0730_SoundBlasterOld_sf2', + //'0731_Aspirin_sf2_file', // not a flute '0731_FluidR3_GM_sf2_file', - '0731_SoundBlasterOld_sf2', + //'0731_SoundBlasterOld_sf2', + + // Recorder: Pipe '0740_Aspirin_sf2_file', '0740_Chaos_sf2_file', '0740_FluidR3_GM_sf2_file', '0740_GeneralUserGS_sf2_file', '0740_JCLive_sf2_file', - '0740_SBLive_sf2', - '0740_SoundBlasterOld_sf2', - '0741_GeneralUserGS_sf2_file', - '0750_Aspirin_sf2_file', + //'0740_SBLive_sf2', + //'0740_SoundBlasterOld_sf2', + // '0741_GeneralUserGS_sf2_file', // missing + + // Pan Flute: Pipe + '0750_Aspirin_sf2_file', // staccato '0750_Chaos_sf2_file', '0750_FluidR3_GM_sf2_file', - '0750_GeneralUserGS_sf2_file', + '0750_GeneralUserGS_sf2_file', // crackles '0750_JCLive_sf2_file', - '0750_SBLive_sf2', - '0750_SoundBlasterOld_sf2', + //'0750_SBLive_sf2', + //'0750_SoundBlasterOld_sf2', '0751_Aspirin_sf2_file', '0751_FluidR3_GM_sf2_file', - '0751_GeneralUserGS_sf2_file', - '0751_SoundBlasterOld_sf2', - '0760_Aspirin_sf2_file', + '0751_GeneralUserGS_sf2_file', // crackles + //'0751_SoundBlasterOld_sf2', + + // Blown bottle: Pipe + // '0760_Aspirin_sf2_file', // same as below w crackle '0760_Chaos_sf2_file', '0760_FluidR3_GM_sf2_file', '0760_GeneralUserGS_sf2_file', '0760_JCLive_sf2_file', - '0760_SBLive_sf2', - '0760_SoundBlasterOld_sf2', + //'0760_SBLive_sf2', + //'0760_SoundBlasterOld_sf2', '0761_FluidR3_GM_sf2_file', - '0761_GeneralUserGS_sf2_file', - '0761_SoundBlasterOld_sf2', - '0762_GeneralUserGS_sf2_file', - '0770_Aspirin_sf2_file', - '0770_Chaos_sf2_file', + // '0761_GeneralUserGS_sf2_file', // missing + //'0761_SoundBlasterOld_sf2', + // '0762_GeneralUserGS_sf2_file', // missing + + // Shakuhachi: Pipe + '0770_Aspirin_sf2_file', // staccato + //'0770_Chaos_sf2_file', // not shakuhachi '0770_FluidR3_GM_sf2_file', '0770_GeneralUserGS_sf2_file', '0770_JCLive_sf2_file', - '0770_SBLive_sf2', - '0770_SoundBlasterOld_sf2', + //'0770_SBLive_sf2', + //'0770_SoundBlasterOld_sf2', '0771_FluidR3_GM_sf2_file', - '0771_GeneralUserGS_sf2_file', - '0772_GeneralUserGS_sf2_file', - '0780_Aspirin_sf2_file', - '0780_Chaos_sf2_file', + // '0771_GeneralUserGS_sf2_file', // missing + // '0772_GeneralUserGS_sf2_file', // missing + + // Whistle: Pipe + '0780_Aspirin_sf2_file', // crackles + '0780_Chaos_sf2_file', // crackles '0780_FluidR3_GM_sf2_file', - '0780_GeneralUserGS_sf2_file', - '0780_JCLive_sf2_file', - '0780_SBLive_sf2', - '0780_SoundBlasterOld_sf2', - '0781_GeneralUserGS_sf2_file', - '0790_Aspirin_sf2_file', - '0790_Chaos_sf2_file', + //'0780_GeneralUserGS_sf2_file', // loud.. + '0780_JCLive_sf2_file', // crackles + //'0780_SBLive_sf2', + //'0780_SoundBlasterOld_sf2', + // '0781_GeneralUserGS_sf2_file', // detune + crackles + + // Ocarina: Pipe + '0790_Aspirin_sf2_file', // tiny crackles + //'0790_Chaos_sf2_file', // same as above '0790_FluidR3_GM_sf2_file', '0790_GeneralUserGS_sf2_file', - '0790_JCLive_sf2_file', - '0790_SBLive_sf2', - '0790_SoundBlasterOld_sf2', - '0791_GeneralUserGS_sf2_file', + '0790_JCLive_sf2_file', // crackles + //'0790_SBLive_sf2', + //'0790_SoundBlasterOld_sf2', + //'0791_GeneralUserGS_sf2_file', // missing + + // Lead 1 (square): Synth Lead '0800_Aspirin_sf2_file', '0800_Chaos_sf2_file', '0800_FluidR3_GM_sf2_file', - '0800_GeneralUserGS_sf2_file', - '0800_JCLive_sf2_file', - '0800_SBLive_sf2', - '0800_SoundBlasterOld_sf2', - '0801_FluidR3_GM_sf2_file', - '0801_GeneralUserGS_sf2_file', + // '0800_GeneralUserGS_sf2_file', // detuned + // '0800_JCLive_sf2_file', // detuned + //'0800_SBLive_sf2', + //'0800_SoundBlasterOld_sf2', + //'0801_FluidR3_GM_sf2_file', // detune + // '0801_GeneralUserGS_sf2_file', // detune + + // Lead 2 (sawtooth): Synth Lead '0810_Aspirin_sf2_file', '0810_Chaos_sf2_file', '0810_FluidR3_GM_sf2_file', '0810_GeneralUserGS_sf2_file', '0810_JCLive_sf2_file', - '0810_SBLive_sf2', - '0810_SoundBlasterOld_sf2', + //'0810_SBLive_sf2', + //'0810_SoundBlasterOld_sf2', '0811_Aspirin_sf2_file', '0811_GeneralUserGS_sf2_file', - '0811_SoundBlasterOld_sf2', + //'0811_SoundBlasterOld_sf2', + + // Lead 3 (calliope): Synth Lead '0820_Aspirin_sf2_file', '0820_Chaos_sf2_file', '0820_FluidR3_GM_sf2_file', '0820_GeneralUserGS_sf2_file', - '0820_JCLive_sf2_file', - '0820_SBLive_sf2', - '0820_SoundBlasterOld_sf2', + '0820_JCLive_sf2_file', // +1 oct + //'0820_SBLive_sf2', + //'0820_SoundBlasterOld_sf2', '0821_FluidR3_GM_sf2_file', '0821_GeneralUserGS_sf2_file', - '0821_SoundBlasterOld_sf2', - '0822_GeneralUserGS_sf2_file', - '0823_GeneralUserGS_sf2_file', + //'0821_SoundBlasterOld_sf2', + // '0822_GeneralUserGS_sf2_file', // missing + //'0823_GeneralUserGS_sf2_file', // missing + + // Lead 4 (chiff): Synth Lead '0830_Aspirin_sf2_file', - '0830_Chaos_sf2_file', + // '0830_Chaos_sf2_file', // same as above '0830_FluidR3_GM_sf2_file', '0830_GeneralUserGS_sf2_file', - '0830_JCLive_sf2_file', - '0830_SBLive_sf2', - '0830_SoundBlasterOld_sf2', + '0830_JCLive_sf2_file', // flute synth + //'0830_SBLive_sf2', + //'0830_SoundBlasterOld_sf2', '0831_FluidR3_GM_sf2_file', '0831_GeneralUserGS_sf2_file', - '0831_SoundBlasterOld_sf2', + //'0831_SoundBlasterOld_sf2', + + // Lead 5 (charang): Synth Lead '0840_Aspirin_sf2_file', '0840_Chaos_sf2_file', '0840_FluidR3_GM_sf2_file', '0840_GeneralUserGS_sf2_file', - '0840_JCLive_sf2_file', - '0840_SBLive_sf2', - '0840_SoundBlasterOld_sf2', + '0840_JCLive_sf2_file', // detune? + //'0840_SBLive_sf2', + //'0840_SoundBlasterOld_sf2', '0841_Aspirin_sf2_file', '0841_Chaos_sf2_file', '0841_FluidR3_GM_sf2_file', '0841_GeneralUserGS_sf2_file', - '0841_JCLive_sf2_file', - '0841_SoundBlasterOld_sf2', + //'0841_JCLive_sf2_file', // +1oct + detune + //'0841_SoundBlasterOld_sf2', '0842_FluidR3_GM_sf2_file', + + // Lead 6 (voice): Synth Lead '0850_Aspirin_sf2_file', - '0850_Chaos_sf2_file', + // '0850_Chaos_sf2_file', // same as above '0850_FluidR3_GM_sf2_file', - '0850_GeneralUserGS_sf2_file', - '0850_JCLive_sf2_file', - '0850_SBLive_sf2', - '0850_SoundBlasterOld_sf2', + // '0850_GeneralUserGS_sf2_file', // no voice + '0850_JCLive_sf2_file', // more a flute + //'0850_SBLive_sf2', + //'0850_SoundBlasterOld_sf2', '0851_FluidR3_GM_sf2_file', '0851_GeneralUserGS_sf2_file', '0851_JCLive_sf2_file', - '0851_SoundBlasterOld_sf2', + //'0851_SoundBlasterOld_sf2', + + // Lead 7 (fifths): Synth Lead '0860_Aspirin_sf2_file', '0860_Chaos_sf2_file', - '0860_FluidR3_GM_sf2_file', + // '0860_FluidR3_GM_sf2_file', // loud and not fitting '0860_GeneralUserGS_sf2_file', '0860_JCLive_sf2_file', - '0860_SBLive_sf2', - '0860_SoundBlasterOld_sf2', + //'0860_SBLive_sf2', + //'0860_SoundBlasterOld_sf2', '0861_Aspirin_sf2_file', - '0861_FluidR3_GM_sf2_file', - '0861_SoundBlasterOld_sf2', + // '0861_FluidR3_GM_sf2_file', // lout and not fitting + //'0861_SoundBlasterOld_sf2', + + // Lead 8 (bass + lead): Synth Lead '0870_Aspirin_sf2_file', '0870_Chaos_sf2_file', '0870_FluidR3_GM_sf2_file', '0870_GeneralUserGS_sf2_file', '0870_JCLive_sf2_file', - '0870_SBLive_sf2', - '0870_SoundBlasterOld_sf2', - '0871_GeneralUserGS_sf2_file', - '0872_GeneralUserGS_sf2_file', - '0873_GeneralUserGS_sf2_file', + //'0870_SBLive_sf2', + //'0870_SoundBlasterOld_sf2', + // '0871_GeneralUserGS_sf2_file', // loud + detune + //'0872_GeneralUserGS_sf2_file', // loud + //'0873_GeneralUserGS_sf2_file', // loud + + // Pad 1 (new age): Synth Pad '0880_Aspirin_sf2_file', '0880_Chaos_sf2_file', '0880_FluidR3_GM_sf2_file', '0880_GeneralUserGS_sf2_file', '0880_JCLive_sf2_file', - '0880_SBLive_sf2', - '0880_SoundBlasterOld_sf2', + //'0880_SBLive_sf2', + //'0880_SoundBlasterOld_sf2', '0881_Aspirin_sf2_file', '0881_FluidR3_GM_sf2_file', '0881_GeneralUserGS_sf2_file', - '0881_SoundBlasterOld_sf2', - '0882_Aspirin_sf2_file', - '0882_FluidR3_GM_sf2_file', + //'0881_SoundBlasterOld_sf2', + '0882_Aspirin_sf2_file', // staccato + // '0882_FluidR3_GM_sf2_file', // missing '0882_GeneralUserGS_sf2_file', - '0883_GeneralUserGS_sf2_file', - '0884_GeneralUserGS_sf2_file', + //'0883_GeneralUserGS_sf2_file', // missing + // '0884_GeneralUserGS_sf2_file', // broken '0885_GeneralUserGS_sf2_file', - '0886_GeneralUserGS_sf2_file', + //'0886_GeneralUserGS_sf2_file', // not a pad '0887_GeneralUserGS_sf2_file', - '0888_GeneralUserGS_sf2_file', - '0889_GeneralUserGS_sf2_file', + //'0888_GeneralUserGS_sf2_file', // not a pad + //'0889_GeneralUserGS_sf2_file', // not a pad + + // Pad 2 (warm): Synth Pad '0890_Aspirin_sf2_file', '0890_Chaos_sf2_file', '0890_FluidR3_GM_sf2_file', - '0890_GeneralUserGS_sf2_file', + '0890_GeneralUserGS_sf2_file', // 1mb large '0890_JCLive_sf2_file', - '0890_SBLive_sf2', - '0890_SoundBlasterOld_sf2', + //'0890_SBLive_sf2', + //'0890_SoundBlasterOld_sf2', '0891_Aspirin_sf2_file', '0891_FluidR3_GM_sf2_file', - '0891_GeneralUserGS_sf2_file', - '0900_Aspirin_sf2_file', + // '0891_GeneralUserGS_sf2_file', // noise + + // Pad 3 (polysynth): Synth Pad + //'0900_Aspirin_sf2_file', // same as belo '0900_Chaos_sf2_file', '0900_FluidR3_GM_sf2_file', '0900_GeneralUserGS_sf2_file', - '0900_JCLive_sf2_file', - '0900_SBLive_sf2', - '0900_SoundBlasterOld_sf2', + '0900_JCLive_sf2_file', // a bit plucky for a pad + //'0900_SBLive_sf2', + //'0900_SoundBlasterOld_sf2', '0901_Aspirin_sf2_file', '0901_FluidR3_GM_sf2_file', '0901_GeneralUserGS_sf2_file', - '0901_SoundBlasterOld_sf2', + //'0901_SoundBlasterOld_sf2', + + // Pad 4 (choir): Synth Pad '0910_Aspirin_sf2_file', - '0910_Chaos_sf2_file', + //'0910_Chaos_sf2_file', // +1oct '0910_FluidR3_GM_sf2_file', '0910_GeneralUserGS_sf2_file', '0910_JCLive_sf2_file', - '0910_SBLive_sf2', - '0910_SoundBlasterOld_sf2', - '0911_Aspirin_sf2_file', + //'0910_SBLive_sf2', + //'0910_SoundBlasterOld_sf2', + // '0911_Aspirin_sf2_file', // fluty, crackles '0911_GeneralUserGS_sf2_file', - '0911_JCLive_sf2_file', - '0911_SoundBlasterOld_sf2', + '0911_JCLive_sf2_file', // the only choiry pad + //'0911_SoundBlasterOld_sf2', + + // Pad 5 (bowed): Synth Pad '0920_Aspirin_sf2_file', - '0920_Chaos_sf2_file', - '0920_FluidR3_GM_sf2_file', + //'0920_Chaos_sf2_file', // same as above + //'0920_FluidR3_GM_sf2_file', // detuned? '0920_GeneralUserGS_sf2_file', '0920_JCLive_sf2_file', - '0920_SBLive_sf2', - '0920_SoundBlasterOld_sf2', + //'0920_SBLive_sf2', + //'0920_SoundBlasterOld_sf2', '0921_Aspirin_sf2_file', '0921_GeneralUserGS_sf2_file', - '0921_SoundBlasterOld_sf2', + //'0921_SoundBlasterOld_sf2', + + // Pad 6 (metallic): Synth Pad '0930_Aspirin_sf2_file', '0930_Chaos_sf2_file', - '0930_FluidR3_GM_sf2_file', + '0930_FluidR3_GM_sf2_file', // little crackles '0930_GeneralUserGS_sf2_file', - '0930_JCLive_sf2_file', - '0930_SBLive_sf2', - '0930_SoundBlasterOld_sf2', - '0931_Aspirin_sf2_file', + // '0930_JCLive_sf2_file', // buggy zones: guitar / synth + //'0930_SBLive_sf2', + //'0930_SoundBlasterOld_sf2', + '0931_Aspirin_sf2_file', // sitar '0931_FluidR3_GM_sf2_file', - '0931_GeneralUserGS_sf2_file', - '0931_SoundBlasterOld_sf2', - '0940_Aspirin_sf2_file', + '0931_GeneralUserGS_sf2_file', // guitar + //'0931_SoundBlasterOld_sf2', + + // Pad 7 (halo): Synth Pad + // '0940_Aspirin_sf2_file', // same as below '0940_Chaos_sf2_file', '0940_FluidR3_GM_sf2_file', '0940_GeneralUserGS_sf2_file', '0940_JCLive_sf2_file', - '0940_SBLive_sf2', - '0940_SoundBlasterOld_sf2', + //'0940_SBLive_sf2', + //'0940_SoundBlasterOld_sf2', '0941_Aspirin_sf2_file', '0941_FluidR3_GM_sf2_file', '0941_GeneralUserGS_sf2_file', '0941_JCLive_sf2_file', + + // Pad 8 (sweep): Synth Pad '0950_Aspirin_sf2_file', '0950_Chaos_sf2_file', '0950_FluidR3_GM_sf2_file', '0950_GeneralUserGS_sf2_file', '0950_JCLive_sf2_file', - '0950_SBLive_sf2', - '0950_SoundBlasterOld_sf2', + //'0950_SBLive_sf2', + //'0950_SoundBlasterOld_sf2', '0951_FluidR3_GM_sf2_file', '0951_GeneralUserGS_sf2_file', - '0960_Aspirin_sf2_file', - '0960_Chaos_sf2_file', - '0960_FluidR3_GM_sf2_file', - '0960_GeneralUserGS_sf2_file', - '0960_JCLive_sf2_file', - '0960_SBLive_sf2', - '0960_SoundBlasterOld_sf2', + + // FX 1 (rain): Synth Effects + //'0960_Aspirin_sf2_file', //mixed samples? + '0960_Chaos_sf2_file', // pad? + '0960_FluidR3_GM_sf2_file', // ??? + '0960_GeneralUserGS_sf2_file', // pad + // '0960_JCLive_sf2_file', // mixed samples? + //'0960_SBLive_sf2', + //'0960_SoundBlasterOld_sf2', '0961_Aspirin_sf2_file', '0961_FluidR3_GM_sf2_file', - '0961_GeneralUserGS_sf2_file', - '0961_SoundBlasterOld_sf2', + // '0961_GeneralUserGS_sf2_file', // ?!?! + //'0961_SoundBlasterOld_sf2', '0962_GeneralUserGS_sf2_file', + + // FX 2 (soundtrack): Synth Effects '0970_Aspirin_sf2_file', - '0970_Chaos_sf2_file', + //'0970_Chaos_sf2_file', // wrong pitch '0970_FluidR3_GM_sf2_file', - '0970_GeneralUserGS_sf2_file', - '0970_JCLive_sf2_file', - '0970_SBLive_sf2', - '0970_SoundBlasterOld_sf2', + '0970_GeneralUserGS_sf2_file', // not looping.. + //'0970_JCLive_sf2_file', // wrong pitch + //'0970_SBLive_sf2', + //'0970_SoundBlasterOld_sf2', '0971_FluidR3_GM_sf2_file', '0971_GeneralUserGS_sf2_file', - '0971_SoundBlasterOld_sf2', + //'0971_SoundBlasterOld_sf2', + + // FX 3 (crystal): Synth Effects '0980_Aspirin_sf2_file', '0980_Chaos_sf2_file', - '0980_FluidR3_GM_sf2_file', + // '0980_FluidR3_GM_sf2_file', // some notes are weird '0980_GeneralUserGS_sf2_file', '0980_JCLive_sf2_file', - '0980_SBLive_sf2', - '0980_SoundBlasterOld_sf2', - '0981_Aspirin_sf2_file', - '0981_FluidR3_GM_sf2_file', + //'0980_SBLive_sf2', + //'0980_SoundBlasterOld_sf2', + '0981_Aspirin_sf2_file', // strings + '0981_FluidR3_GM_sf2_file', // mallet '0981_GeneralUserGS_sf2_file', - '0981_SoundBlasterOld_sf2', + //'0981_SoundBlasterOld_sf2', '0982_GeneralUserGS_sf2_file', - '0983_GeneralUserGS_sf2_file', + '0983_GeneralUserGS_sf2_file', // guitar '0984_GeneralUserGS_sf2_file', - '0990_Aspirin_sf2_file', - '0990_Chaos_sf2_file', - '0990_FluidR3_GM_sf2_file', - '0990_GeneralUserGS_sf2_file', - '0990_JCLive_sf2_file', - '0990_SBLive_sf2', - '0990_SoundBlasterOld_sf2', - '0991_Aspirin_sf2_file', - '0991_FluidR3_GM_sf2_file', - '0991_GeneralUserGS_sf2_file', - '0991_JCLive_sf2_file', - '0991_SoundBlasterOld_sf2', - '0992_FluidR3_GM_sf2_file', - '0992_JCLive_sf2_file', - '0993_JCLive_sf2_file', - '0994_JCLive_sf2_file', + + // FX 4 (atmosphere): Synth Effects + '0990_Aspirin_sf2_file', // pad + '0990_Chaos_sf2_file', // pad + '0990_FluidR3_GM_sf2_file', // guitar + '0990_GeneralUserGS_sf2_file', // guitar + '0990_JCLive_sf2_file', // pad + //'0990_SBLive_sf2', + //'0990_SoundBlasterOld_sf2', + '0991_Aspirin_sf2_file', // guitar + '0991_FluidR3_GM_sf2_file', // pad + '0991_GeneralUserGS_sf2_file', // pad + '0991_JCLive_sf2_file', // guitar + //'0991_SoundBlasterOld_sf2', + '0992_FluidR3_GM_sf2_file', // pad + '0992_JCLive_sf2_file', // guitar + '0993_JCLive_sf2_file', // guitar + '0994_JCLive_sf2_file', // guitar + + // FX 5 (brightness): Synth Effects '1000_Aspirin_sf2_file', '1000_Chaos_sf2_file', '1000_FluidR3_GM_sf2_file', '1000_GeneralUserGS_sf2_file', '1000_JCLive_sf2_file', - '1000_SBLive_sf2', - '1000_SoundBlasterOld_sf2', + //'1000_SBLive_sf2', + //'1000_SoundBlasterOld_sf2', '1001_Aspirin_sf2_file', '1001_FluidR3_GM_sf2_file', '1001_GeneralUserGS_sf2_file', '1001_JCLive_sf2_file', - '1001_SoundBlasterOld_sf2', + //'1001_SoundBlasterOld_sf2', '1002_Aspirin_sf2_file', '1002_FluidR3_GM_sf2_file', '1002_GeneralUserGS_sf2_file', + + // FX 6 (goblins): Synth Effects '1010_Aspirin_sf2_file', '1010_Chaos_sf2_file', '1010_FluidR3_GM_sf2_file', '1010_GeneralUserGS_sf2_file', '1010_JCLive_sf2_file', - '1010_SBLive_sf2', - '1010_SoundBlasterOld_sf2', + //'1010_SBLive_sf2', + //'1010_SoundBlasterOld_sf2', '1011_Aspirin_sf2_file', '1011_FluidR3_GM_sf2_file', '1011_JCLive_sf2_file', '1012_Aspirin_sf2_file', + + // FX 7 (echoes): Synth Effects '1020_Aspirin_sf2_file', '1020_Chaos_sf2_file', '1020_FluidR3_GM_sf2_file', '1020_GeneralUserGS_sf2_file', '1020_JCLive_sf2_file', - '1020_SBLive_sf2', - '1020_SoundBlasterOld_sf2', + //'1020_SBLive_sf2', + //'1020_SoundBlasterOld_sf2', '1021_Aspirin_sf2_file', '1021_FluidR3_GM_sf2_file', '1021_GeneralUserGS_sf2_file', '1021_JCLive_sf2_file', - '1021_SoundBlasterOld_sf2', + //'1021_SoundBlasterOld_sf2', '1022_GeneralUserGS_sf2_file', + + // FX 8 (sci-fi): Synth Effects '1030_Aspirin_sf2_file', '1030_Chaos_sf2_file', '1030_FluidR3_GM_sf2_file', '1030_GeneralUserGS_sf2_file', '1030_JCLive_sf2_file', - '1030_SBLive_sf2', - '1030_SoundBlasterOld_sf2', + //'1030_SBLive_sf2', + //'1030_SoundBlasterOld_sf2', '1031_Aspirin_sf2_file', '1031_FluidR3_GM_sf2_file', '1031_GeneralUserGS_sf2_file', - '1031_SoundBlasterOld_sf2', + //'1031_SoundBlasterOld_sf2', '1032_FluidR3_GM_sf2_file', + + // 'Sitar: Ethnic '1040_Aspirin_sf2_file', '1040_Chaos_sf2_file', '1040_FluidR3_GM_sf2_file', '1040_GeneralUserGS_sf2_file', '1040_JCLive_sf2_file', - '1040_SBLive_sf2', - '1040_SoundBlasterOld_sf2', + //'1040_SBLive_sf2', + //'1040_SoundBlasterOld_sf2', '1041_FluidR3_GM_sf2_file', '1041_GeneralUserGS_sf2_file', + + // Banjo: Ethnic '1050_Aspirin_sf2_file', '1050_Chaos_sf2_file', '1050_FluidR3_GM_sf2_file', '1050_GeneralUserGS_sf2_file', '1050_JCLive_sf2_file', - '1050_SBLive_sf2', - '1050_SoundBlasterOld_sf2', + //'1050_SBLive_sf2', + //'1050_SoundBlasterOld_sf2', '1051_GeneralUserGS_sf2_file', + + // Shamisen: Ethnic '1060_Aspirin_sf2_file', '1060_Chaos_sf2_file', '1060_FluidR3_GM_sf2_file', '1060_GeneralUserGS_sf2_file', '1060_JCLive_sf2_file', - '1060_SBLive_sf2', - '1060_SoundBlasterOld_sf2', + //'1060_SBLive_sf2', + //'1060_SoundBlasterOld_sf2', '1061_FluidR3_GM_sf2_file', '1061_GeneralUserGS_sf2_file', - '1061_SoundBlasterOld_sf2', + //'1061_SoundBlasterOld_sf2', + + // Koto: Ethnic '1070_Aspirin_sf2_file', '1070_Chaos_sf2_file', '1070_FluidR3_GM_sf2_file', '1070_GeneralUserGS_sf2_file', '1070_JCLive_sf2_file', - '1070_SBLive_sf2', - '1070_SoundBlasterOld_sf2', + //'1070_SBLive_sf2', + //'1070_SoundBlasterOld_sf2', '1071_FluidR3_GM_sf2_file', '1071_GeneralUserGS_sf2_file', '1072_GeneralUserGS_sf2_file', '1073_GeneralUserGS_sf2_file', + + // Kalimba: Ethnic '1080_Aspirin_sf2_file', '1080_Chaos_sf2_file', '1080_FluidR3_GM_sf2_file', '1080_GeneralUserGS_sf2_file', '1080_JCLive_sf2_file', - '1080_SBLive_sf2', - '1080_SoundBlasterOld_sf2', - '1081_SoundBlasterOld_sf2', + //'1080_SBLive_sf2', + //'1080_SoundBlasterOld_sf2', + //'1081_SoundBlasterOld_sf2', + + // Bagpipe: Ethnic '1090_Aspirin_sf2_file', '1090_Chaos_sf2_file', '1090_FluidR3_GM_sf2_file', '1090_GeneralUserGS_sf2_file', '1090_JCLive_sf2_file', - '1090_SBLive_sf2', - '1090_SoundBlasterOld_sf2', - '1091_SoundBlasterOld_sf2', + //'1090_SBLive_sf2', + //'1090_SoundBlasterOld_sf2', + //'1091_SoundBlasterOld_sf2', + + // Fiddle: Ethnic '1100_Aspirin_sf2_file', '1100_Chaos_sf2_file', '1100_FluidR3_GM_sf2_file', '1100_GeneralUserGS_sf2_file', '1100_JCLive_sf2_file', - '1100_SBLive_sf2', - '1100_SoundBlasterOld_sf2', + //'1100_SBLive_sf2', + //'1100_SoundBlasterOld_sf2', '1101_Aspirin_sf2_file', '1101_FluidR3_GM_sf2_file', '1101_GeneralUserGS_sf2_file', '1102_GeneralUserGS_sf2_file', + + // Shanai: Ethnic '1110_Aspirin_sf2_file', '1110_Chaos_sf2_file', '1110_FluidR3_GM_sf2_file', '1110_GeneralUserGS_sf2_file', '1110_JCLive_sf2_file', - '1110_SBLive_sf2', - '1110_SoundBlasterOld_sf2', + //'1110_SBLive_sf2', + //'1110_SoundBlasterOld_sf2', + + // Tinkle Bell: Percussive '1120_Aspirin_sf2_file', '1120_Chaos_sf2_file', '1120_FluidR3_GM_sf2_file', '1120_GeneralUserGS_sf2_file', '1120_JCLive_sf2_file', - '1120_SBLive_sf2', - '1120_SoundBlasterOld_sf2', - '1121_SoundBlasterOld_sf2', + //'1120_SBLive_sf2', + //'1120_SoundBlasterOld_sf2', + //'1121_SoundBlasterOld_sf2', + + // Agogo: Percussive '1130_Aspirin_sf2_file', '1130_Chaos_sf2_file', '1130_FluidR3_GM_sf2_file', '1130_GeneralUserGS_sf2_file', '1130_JCLive_sf2_file', - '1130_SBLive_sf2', - '1130_SoundBlasterOld_sf2', + //'1130_SBLive_sf2', + //'1130_SoundBlasterOld_sf2', '1131_FluidR3_GM_sf2_file', - '1131_SoundBlasterOld_sf2', + //'1131_SoundBlasterOld_sf2', + + // Steel Drums: Percussive '1140_Aspirin_sf2_file', '1140_Chaos_sf2_file', '1140_FluidR3_GM_sf2_file', '1140_GeneralUserGS_sf2_file', '1140_JCLive_sf2_file', - '1140_SBLive_sf2', - '1140_SoundBlasterOld_sf2', + //'1140_SBLive_sf2', + //'1140_SoundBlasterOld_sf2', '1141_FluidR3_GM_sf2_file', + + // Woodblock: Percussive '1150_Aspirin_sf2_file', '1150_Chaos_sf2_file', '1150_FluidR3_GM_sf2_file', '1150_GeneralUserGS_sf2_file', '1150_JCLive_sf2_file', - '1150_SBLive_sf2', - '1150_SoundBlasterOld_sf2', + //'1150_SBLive_sf2', + //'1150_SoundBlasterOld_sf2', '1151_FluidR3_GM_sf2_file', '1151_GeneralUserGS_sf2_file', '1152_FluidR3_GM_sf2_file', '1152_GeneralUserGS_sf2_file', + + // Taiko Drum: Percussive '1160_Aspirin_sf2_file', '1160_Chaos_sf2_file', '1160_FluidR3_GM_sf2_file', '1160_GeneralUserGS_sf2_file', '1160_JCLive_sf2_file', - '1160_SBLive_sf2', - '1160_SoundBlasterOld_sf2', + //'1160_SBLive_sf2', + //'1160_SoundBlasterOld_sf2', '1161_FluidR3_GM_sf2_file', '1161_GeneralUserGS_sf2_file', - '1161_SoundBlasterOld_sf2', + //'1161_SoundBlasterOld_sf2', '1162_FluidR3_GM_sf2_file', '1162_GeneralUserGS_sf2_file', '1163_FluidR3_GM_sf2_file', + + // Melodic Tom: Percussive '1170_Aspirin_sf2_file', '1170_Chaos_sf2_file', '1170_FluidR3_GM_sf2_file', '1170_GeneralUserGS_sf2_file', '1170_JCLive_sf2_file', - '1170_SBLive_sf2', - '1170_SoundBlasterOld_sf2', + //'1170_SBLive_sf2', + //'1170_SoundBlasterOld_sf2', '1171_FluidR3_GM_sf2_file', '1171_GeneralUserGS_sf2_file', '1172_FluidR3_GM_sf2_file', '1173_FluidR3_GM_sf2_file', + + // Synth Drum: Percussive '1180_Aspirin_sf2_file', '1180_Chaos_sf2_file', '1180_FluidR3_GM_sf2_file', '1180_GeneralUserGS_sf2_file', '1180_JCLive_sf2_file', - '1180_SBLive_sf2', - '1180_SoundBlasterOld_sf2', + //'1180_SBLive_sf2', + //'1180_SoundBlasterOld_sf2', '1181_FluidR3_GM_sf2_file', '1181_GeneralUserGS_sf2_file', - '1181_SoundBlasterOld_sf2', + //'1181_SoundBlasterOld_sf2', + + // Reverse Cymbal: Percussive '1190_Aspirin_sf2_file', '1190_Chaos_sf2_file', '1190_FluidR3_GM_sf2_file', '1190_GeneralUserGS_sf2_file', '1190_JCLive_sf2_file', - '1190_SBLive_sf2', - '1190_SoundBlasterOld_sf2', + //'1190_SBLive_sf2', + //'1190_SoundBlasterOld_sf2', '1191_GeneralUserGS_sf2_file', '1192_GeneralUserGS_sf2_file', '1193_GeneralUserGS_sf2_file', '1194_GeneralUserGS_sf2_file', + + // Guitar Fret Noise: Sound effects '1200_Aspirin_sf2_file', '1200_Chaos_sf2_file', '1200_FluidR3_GM_sf2_file', '1200_GeneralUserGS_sf2_file', '1200_JCLive_sf2_file', - '1200_SBLive_sf2', - '1200_SoundBlasterOld_sf2', + //'1200_SBLive_sf2', + //'1200_SoundBlasterOld_sf2', '1201_Aspirin_sf2_file', '1201_GeneralUserGS_sf2_file', '1202_GeneralUserGS_sf2_file', + + // Breath Noise: Sound effects '1210_Aspirin_sf2_file', '1210_Chaos_sf2_file', '1210_FluidR3_GM_sf2_file', '1210_GeneralUserGS_sf2_file', '1210_JCLive_sf2_file', - '1210_SBLive_sf2', - '1210_SoundBlasterOld_sf2', + //'1210_SBLive_sf2', + //'1210_SoundBlasterOld_sf2', '1211_Aspirin_sf2_file', '1211_GeneralUserGS_sf2_file', '1212_GeneralUserGS_sf2_file', + + // Seashore: Sound effects '1220_Aspirin_sf2_file', '1220_Chaos_sf2_file', '1220_FluidR3_GM_sf2_file', '1220_GeneralUserGS_sf2_file', '1220_JCLive_sf2_file', - '1220_SBLive_sf2', - '1220_SoundBlasterOld_sf2', + //'1220_SBLive_sf2', + //'1220_SoundBlasterOld_sf2', '1221_Aspirin_sf2_file', '1221_GeneralUserGS_sf2_file', '1221_JCLive_sf2_file', @@ -1310,26 +1561,30 @@ export const instruments = [ '1224_GeneralUserGS_sf2_file', '1225_GeneralUserGS_sf2_file', '1226_GeneralUserGS_sf2_file', + + // Bird Tweet: Sound effects '1230_Aspirin_sf2_file', '1230_Chaos_sf2_file', '1230_FluidR3_GM_sf2_file', '1230_GeneralUserGS_sf2_file', '1230_JCLive_sf2_file', - '1230_SBLive_sf2', - '1230_SoundBlasterOld_sf2', + //'1230_SBLive_sf2', + //'1230_SoundBlasterOld_sf2', '1231_Aspirin_sf2_file', '1231_GeneralUserGS_sf2_file', '1232_Aspirin_sf2_file', '1232_GeneralUserGS_sf2_file', '1233_GeneralUserGS_sf2_file', '1234_GeneralUserGS_sf2_file', + + // Telephone Ring: Sound effects '1240_Aspirin_sf2_file', '1240_Chaos_sf2_file', '1240_FluidR3_GM_sf2_file', '1240_GeneralUserGS_sf2_file', '1240_JCLive_sf2_file', - '1240_SBLive_sf2', - '1240_SoundBlasterOld_sf2', + //'1240_SBLive_sf2', + //'1240_SoundBlasterOld_sf2', '1241_Aspirin_sf2_file', '1241_GeneralUserGS_sf2_file', '1242_Aspirin_sf2_file', @@ -1338,13 +1593,15 @@ export const instruments = [ '1243_GeneralUserGS_sf2_file', '1244_Aspirin_sf2_file', '1244_GeneralUserGS_sf2_file', + + // Helicopter: Sound effects '1250_Aspirin_sf2_file', '1250_Chaos_sf2_file', '1250_FluidR3_GM_sf2_file', '1250_GeneralUserGS_sf2_file', '1250_JCLive_sf2_file', - '1250_SBLive_sf2', - '1250_SoundBlasterOld_sf2', + //'1250_SBLive_sf2', + //'1250_SoundBlasterOld_sf2', '1251_Aspirin_sf2_file', '1251_FluidR3_GM_sf2_file', '1251_GeneralUserGS_sf2_file', @@ -1364,13 +1621,15 @@ export const instruments = [ '1258_Aspirin_sf2_file', '1258_GeneralUserGS_sf2_file', '1259_GeneralUserGS_sf2_file', + + // Applause: Sound effects '1260_Aspirin_sf2_file', '1260_Chaos_sf2_file', '1260_FluidR3_GM_sf2_file', '1260_GeneralUserGS_sf2_file', '1260_JCLive_sf2_file', - '1260_SBLive_sf2', - '1260_SoundBlasterOld_sf2', + //'1260_SBLive_sf2', + //'1260_SoundBlasterOld_sf2', '1261_Aspirin_sf2_file', '1261_GeneralUserGS_sf2_file', '1262_Aspirin_sf2_file', @@ -1381,13 +1640,15 @@ export const instruments = [ '1264_GeneralUserGS_sf2_file', '1265_Aspirin_sf2_file', '1265_GeneralUserGS_sf2_file', + + // Gunshot: Sound effects '1270_Aspirin_sf2_file', '1270_Chaos_sf2_file', '1270_FluidR3_GM_sf2_file', '1270_GeneralUserGS_sf2_file', '1270_JCLive_sf2_file', - '1270_SBLive_sf2', - '1270_SoundBlasterOld_sf2', + //'1270_SBLive_sf2', + //'1270_SoundBlasterOld_sf2', '1271_Aspirin_sf2_file', '1271_GeneralUserGS_sf2_file', '1272_Aspirin_sf2_file', @@ -1397,238 +1658,238 @@ export const instruments = [ ]; export const drums = [ - //'35_0_SBLive_sf2' + ////'35_0_SBLive_sf2' '35_0_Chaos_sf2_file', '35_12_JCLive_sf2_file', '35_16_JCLive_sf2_file', '35_18_JCLive_sf2_file', '35_4_Chaos_sf2_file', - '36_0_SBLive_sf2', + //'36_0_SBLive_sf2', '36_12_JCLive_sf2_file', '36_16_JCLive_sf2_file', '36_18_JCLive_sf2_file', '36_4_Chaos_sf2_file', - '37_0_SBLive_sf2', + //'37_0_SBLive_sf2', '37_12_JCLive_sf2_file', '37_16_JCLive_sf2_file', '37_18_JCLive_sf2_file', '37_4_Chaos_sf2_file', - '38_0_SBLive_sf2', + //'38_0_SBLive_sf2', '38_12_JCLive_sf2_file', '38_16_JCLive_sf2_file', '38_18_JCLive_sf2_file', '38_4_Chaos_sf2_file', - '39_0_SBLive_sf2', + //'39_0_SBLive_sf2', '39_12_JCLive_sf2_file', '39_16_JCLive_sf2_file', '39_18_JCLive_sf2_file', '39_4_Chaos_sf2_file', - '40_0_SBLive_sf2', + //'40_0_SBLive_sf2', '40_12_JCLive_sf2_file', '40_16_JCLive_sf2_file', '40_18_JCLive_sf2_file', '40_4_Chaos_sf2_file', - '41_0_SBLive_sf2', + //'41_0_SBLive_sf2', '41_12_JCLive_sf2_file', '41_16_JCLive_sf2_file', '41_18_JCLive_sf2_file', '41_4_Chaos_sf2_file', - '42_0_SBLive_sf2', + //'42_0_SBLive_sf2', '42_12_JCLive_sf2_file', '42_16_JCLive_sf2_file', '42_18_JCLive_sf2_file', '42_4_Chaos_sf2_file', - '43_0_SBLive_sf2', + //'43_0_SBLive_sf2', '43_12_JCLive_sf2_file', '43_16_JCLive_sf2_file', '43_18_JCLive_sf2_file', '43_4_Chaos_sf2_file', - '44_0_SBLive_sf2', + //'44_0_SBLive_sf2', '44_12_JCLive_sf2_file', '44_16_JCLive_sf2_file', '44_18_JCLive_sf2_file', '44_4_Chaos_sf2_file', - '45_0_SBLive_sf2', + //'45_0_SBLive_sf2', '45_12_JCLive_sf2_file', '45_16_JCLive_sf2_file', '45_18_JCLive_sf2_file', '45_4_Chaos_sf2_file', - '46_0_SBLive_sf2', + //'46_0_SBLive_sf2', '46_12_JCLive_sf2_file', '46_16_JCLive_sf2_file', '46_18_JCLive_sf2_file', '46_4_Chaos_sf2_file', - '47_0_SBLive_sf2', + //'47_0_SBLive_sf2', '47_12_JCLive_sf2_file', '47_16_JCLive_sf2_file', '47_18_JCLive_sf2_file', '47_4_Chaos_sf2_file', - '48_0_SBLive_sf2', + //'48_0_SBLive_sf2', '48_12_JCLive_sf2_file', '48_16_JCLive_sf2_file', '48_18_JCLive_sf2_file', '48_4_Chaos_sf2_file', - '49_0_SBLive_sf2', + //'49_0_SBLive_sf2', '49_12_JCLive_sf2_file', '49_16_JCLive_sf2_file', '49_18_JCLive_sf2_file', '49_4_Chaos_sf2_file', - '50_0_SBLive_sf2', + //'50_0_SBLive_sf2', '50_12_JCLive_sf2_file', '50_16_JCLive_sf2_file', '50_18_JCLive_sf2_file', '50_4_Chaos_sf2_file', - '51_0_SBLive_sf2', + //'51_0_SBLive_sf2', '51_12_JCLive_sf2_file', '51_16_JCLive_sf2_file', '51_18_JCLive_sf2_file', '51_4_Chaos_sf2_file', - '52_0_SBLive_sf2', + //'52_0_SBLive_sf2', '52_12_JCLive_sf2_file', '52_16_JCLive_sf2_file', '52_18_JCLive_sf2_file', '52_4_Chaos_sf2_file', - '53_0_SBLive_sf2', + //'53_0_SBLive_sf2', '53_12_JCLive_sf2_file', '53_16_JCLive_sf2_file', '53_18_JCLive_sf2_file', '53_4_Chaos_sf2_file', - '54_0_SBLive_sf2', + //'54_0_SBLive_sf2', '54_12_JCLive_sf2_file', '54_16_JCLive_sf2_file', '54_18_JCLive_sf2_file', '54_4_Chaos_sf2_file', - '55_0_SBLive_sf2', + //'55_0_SBLive_sf2', '55_12_JCLive_sf2_file', '55_16_JCLive_sf2_file', '55_18_JCLive_sf2_file', '55_4_Chaos_sf2_file', - '56_0_SBLive_sf2', + //'56_0_SBLive_sf2', '56_12_JCLive_sf2_file', '56_16_JCLive_sf2_file', '56_18_JCLive_sf2_file', '56_4_Chaos_sf2_file', - '57_0_SBLive_sf2', + //'57_0_SBLive_sf2', '57_12_JCLive_sf2_file', '57_16_JCLive_sf2_file', '57_18_JCLive_sf2_file', '57_4_Chaos_sf2_file', - '58_0_SBLive_sf2', + //'58_0_SBLive_sf2', '58_12_JCLive_sf2_file', '58_16_JCLive_sf2_file', '58_18_JCLive_sf2_file', '58_4_Chaos_sf2_file', - '59_0_SBLive_sf2', + //'59_0_SBLive_sf2', '59_12_JCLive_sf2_file', '59_16_JCLive_sf2_file', '59_18_JCLive_sf2_file', '59_4_Chaos_sf2_file', - '60_0_SBLive_sf2', + //'60_0_SBLive_sf2', '60_12_JCLive_sf2_file', '60_16_JCLive_sf2_file', '60_18_JCLive_sf2_file', '60_4_Chaos_sf2_file', - '61_0_SBLive_sf2', + //'61_0_SBLive_sf2', '61_12_JCLive_sf2_file', '61_16_JCLive_sf2_file', '61_18_JCLive_sf2_file', '61_4_Chaos_sf2_file', - '62_0_SBLive_sf2', + //'62_0_SBLive_sf2', '62_12_JCLive_sf2_file', '62_16_JCLive_sf2_file', '62_18_JCLive_sf2_file', '62_4_Chaos_sf2_file', - '63_0_SBLive_sf2', + //'63_0_SBLive_sf2', '63_12_JCLive_sf2_file', '63_16_JCLive_sf2_file', '63_18_JCLive_sf2_file', '63_4_Chaos_sf2_file', - '64_0_SBLive_sf2', + //'64_0_SBLive_sf2', '64_12_JCLive_sf2_file', '64_16_JCLive_sf2_file', '64_18_JCLive_sf2_file', '64_4_Chaos_sf2_file', - '65_0_SBLive_sf2', + //'65_0_SBLive_sf2', '65_12_JCLive_sf2_file', '65_16_JCLive_sf2_file', '65_18_JCLive_sf2_file', '65_4_Chaos_sf2_file', - '66_0_SBLive_sf2', + //'66_0_SBLive_sf2', '66_12_JCLive_sf2_file', '66_16_JCLive_sf2_file', '66_18_JCLive_sf2_file', '66_4_Chaos_sf2_file', - '67_0_SBLive_sf2', + //'67_0_SBLive_sf2', '67_12_JCLive_sf2_file', '67_16_JCLive_sf2_file', '67_18_JCLive_sf2_file', '67_4_Chaos_sf2_file', - '68_0_SBLive_sf2', + //'68_0_SBLive_sf2', '68_12_JCLive_sf2_file', '68_16_JCLive_sf2_file', '68_18_JCLive_sf2_file', '68_4_Chaos_sf2_file', - '69_0_SBLive_sf2', + //'69_0_SBLive_sf2', '69_12_JCLive_sf2_file', '69_16_JCLive_sf2_file', '69_18_JCLive_sf2_file', '69_4_Chaos_sf2_file', - '70_0_SBLive_sf2', + //'70_0_SBLive_sf2', '70_12_JCLive_sf2_file', '70_16_JCLive_sf2_file', '70_18_JCLive_sf2_file', '70_4_Chaos_sf2_file', - '71_0_SBLive_sf2', + //'71_0_SBLive_sf2', '71_12_JCLive_sf2_file', '71_16_JCLive_sf2_file', '71_18_JCLive_sf2_file', '71_4_Chaos_sf2_file', - '72_0_SBLive_sf2', + //'72_0_SBLive_sf2', '72_12_JCLive_sf2_file', '72_16_JCLive_sf2_file', '72_18_JCLive_sf2_file', '72_4_Chaos_sf2_file', - '73_0_SBLive_sf2', + //'73_0_SBLive_sf2', '73_12_JCLive_sf2_file', '73_16_JCLive_sf2_file', '73_18_JCLive_sf2_file', '73_4_Chaos_sf2_file', - '74_0_SBLive_sf2', + //'74_0_SBLive_sf2', '74_12_JCLive_sf2_file', '74_16_JCLive_sf2_file', '74_18_JCLive_sf2_file', '74_4_Chaos_sf2_file', - '75_0_SBLive_sf2', + //'75_0_SBLive_sf2', '75_12_JCLive_sf2_file', '75_16_JCLive_sf2_file', '75_18_JCLive_sf2_file', '75_4_Chaos_sf2_file', - '76_0_SBLive_sf2', + //'76_0_SBLive_sf2', '76_12_JCLive_sf2_file', '76_16_JCLive_sf2_file', '76_18_JCLive_sf2_file', '76_4_Chaos_sf2_file', - '77_0_SBLive_sf2', + //'77_0_SBLive_sf2', '77_12_JCLive_sf2_file', '77_16_JCLive_sf2_file', '77_18_JCLive_sf2_file', '77_4_Chaos_sf2_file', - '78_0_SBLive_sf2', + //'78_0_SBLive_sf2', '78_12_JCLive_sf2_file', '78_16_JCLive_sf2_file', '78_18_JCLive_sf2_file', '78_4_Chaos_sf2_file', - '79_0_SBLive_sf2', + //'79_0_SBLive_sf2', '79_12_JCLive_sf2_file', '79_16_JCLive_sf2_file', '79_18_JCLive_sf2_file', '79_4_Chaos_sf2_file', - '80_0_SBLive_sf2', + //'80_0_SBLive_sf2', '80_12_JCLive_sf2_file', '80_16_JCLive_sf2_file', '80_18_JCLive_sf2_file', '80_4_Chaos_sf2_file', - '81_0_SBLive_sf2', + //'81_0_SBLive_sf2', '81_12_JCLive_sf2_file', '81_16_JCLive_sf2_file', '81_18_JCLive_sf2_file', diff --git a/packages/soundfonts/sfumato.mjs b/packages/soundfonts/sfumato.mjs index b4037c65..926999f3 100644 --- a/packages/soundfonts/sfumato.mjs +++ b/packages/soundfonts/sfumato.mjs @@ -1,5 +1,5 @@ import { Pattern, getPlayableNoteValue, toMidi } from '@strudel.cycles/core'; -import { getAudioContext } from '@strudel.cycles/webaudio'; +import { getAudioContext, registerSound } from '@strudel.cycles/webaudio'; import { loadSoundfont as _loadSoundfont, startPresetNote } from 'sfumato'; Pattern.prototype.soundfont = function (sf, n = 0) { @@ -21,5 +21,29 @@ export function loadSoundfont(url) { } const sf = _loadSoundfont(url); soundfontCache.set(url, sf); + /*sf.then((font) => { + font.presets.forEach((preset) => { + console.log('preset', preset.header.name); + registerSound( + preset.header.name.replaceAll(' ', '_'), + (time, value, onended) => { + const ctx = getAudioContext(); + let { note } = value; // freq ? + + const p = font.presets.find((p) => p.header.name === preset.header.name); + + if (!p) { + throw new Error('preset not found'); + } + const deadline = time; // - ctx.currentTime; + const args = [ctx, p, toMidi(note), deadline]; + const stop = startPresetNote(...args); + return { node: undefined, stop }; + }, + { type: 'soundfont' }, + ); + }); + //console.log('f', f); + });*/ return sf; } diff --git a/packages/webaudio/helpers.mjs b/packages/webaudio/helpers.mjs new file mode 100644 index 00000000..24ee03c8 --- /dev/null +++ b/packages/webaudio/helpers.mjs @@ -0,0 +1,69 @@ +import { getAudioContext } from './webaudio.mjs'; + +export function gainNode(value) { + const node = getAudioContext().createGain(); + node.gain.value = value; + return node; +} + +export const getOscillator = ({ s, freq, t }) => { + // make oscillator + const o = getAudioContext().createOscillator(); + o.type = s || 'triangle'; + o.frequency.value = Number(freq); + o.start(t); + //o.stop(t + duration + release); + const stop = (time) => o.stop(time); + return { node: o, stop }; +}; + +// alternative to getADSR returning the gain node and a stop handle to trigger the release anytime in the future +export const getEnvelope = (attack, decay, sustain, release, velocity, begin) => { + const gainNode = getAudioContext().createGain(); + gainNode.gain.setValueAtTime(0, begin); + gainNode.gain.linearRampToValueAtTime(velocity, begin + attack); // attack + gainNode.gain.linearRampToValueAtTime(sustain * velocity, begin + attack + decay); // sustain start + // sustain end + return { + node: gainNode, + stop: (t) => { + if (typeof gainNode.gain.cancelAndHoldAtTime === 'function') { + gainNode.gain.cancelAndHoldAtTime(t); + } else { + // firefox: this will glitch when the sustain has not been reached yet at the time of release + gainNode.gain.setValueAtTime(sustain * velocity, t); + } + gainNode.gain.linearRampToValueAtTime(0, t + release); + }, + }; +}; + +export const getADSR = (attack, decay, sustain, release, velocity, begin, end) => { + const gainNode = getAudioContext().createGain(); + gainNode.gain.setValueAtTime(0, begin); + gainNode.gain.linearRampToValueAtTime(velocity, begin + attack); // attack + gainNode.gain.linearRampToValueAtTime(sustain * velocity, begin + attack + decay); // sustain start + gainNode.gain.setValueAtTime(sustain * velocity, end); // sustain end + gainNode.gain.linearRampToValueAtTime(0, end + release); // release + // for some reason, using exponential ramping creates little cracklings + /* let t = begin; + gainNode.gain.setValueAtTime(0, t); + gainNode.gain.exponentialRampToValueAtTime(velocity, (t += attack)); + const sustainGain = Math.max(sustain * velocity, 0.001); + gainNode.gain.exponentialRampToValueAtTime(sustainGain, (t += decay)); + if (end - begin < attack + decay) { + gainNode.gain.cancelAndHoldAtTime(end); + } else { + gainNode.gain.setValueAtTime(sustainGain, end); + } + gainNode.gain.exponentialRampToValueAtTime(0.001, end + release); // release */ + return gainNode; +}; + +export const getFilter = (type, frequency, Q) => { + const filter = getAudioContext().createBiquadFilter(); + filter.type = type; + filter.frequency.value = frequency; + filter.Q.value = Q; + return filter; +}; diff --git a/packages/webaudio/index.mjs b/packages/webaudio/index.mjs index 5fa1e36e..2ab74c72 100644 --- a/packages/webaudio/index.mjs +++ b/packages/webaudio/index.mjs @@ -6,3 +6,5 @@ This program is free software: you can redistribute it and/or modify it under th export * from './webaudio.mjs'; export * from './sampler.mjs'; +export * from './helpers.mjs'; +export * from './synth.mjs'; diff --git a/packages/webaudio/package.json b/packages/webaudio/package.json index 3bc7de38..74b155da 100644 --- a/packages/webaudio/package.json +++ b/packages/webaudio/package.json @@ -34,7 +34,8 @@ }, "homepage": "https://github.com/tidalcycles/strudel#readme", "dependencies": { - "@strudel.cycles/core": "workspace:*" + "@strudel.cycles/core": "workspace:*", + "nanostores": "^0.7.4" }, "devDependencies": { "vite": "^3.2.2" diff --git a/packages/webaudio/sampler.mjs b/packages/webaudio/sampler.mjs index 40a69376..48c45e11 100644 --- a/packages/webaudio/sampler.mjs +++ b/packages/webaudio/sampler.mjs @@ -1,5 +1,6 @@ import { logger, toMidi, valueToMidi } from '@strudel.cycles/core'; -import { getAudioContext } from './index.mjs'; +import { getAudioContext, registerSound } from './index.mjs'; +import { getEnvelope } from './helpers.mjs'; const bufferCache = {}; // string: Promise const loadCache = {}; // string: Promise @@ -20,7 +21,7 @@ function humanFileSize(bytes, si) { return bytes.toFixed(1) + ' ' + units[u]; } -export const getSampleBufferSource = async (s, n, note, speed, freq) => { +export const getSampleBufferSource = async (s, n, note, speed, freq, bank) => { let transpose = 0; if (freq !== undefined && note !== undefined) { logger('[sampler] hap has note and freq. ignoring note', 'warning'); @@ -29,23 +30,6 @@ export const getSampleBufferSource = async (s, n, note, speed, freq) => { transpose = midi - 36; // C3 is middle C const ac = getAudioContext(); - // is sample from loaded samples(..) - const samples = getLoadedSamples(); - if (!samples) { - throw new Error('no samples loaded'); - } - const bank = samples?.[s]; - if (!bank) { - throw new Error( - `sample not found: "${s}"`, - // , try one of ${Object.keys(samples) - // .map((s) => `"${s}"`) - // .join(', ')}. - ); - } - if (typeof bank !== 'object') { - throw new Error('wrong format for sample bank:', s); - } let sampleUrl; if (Array.isArray(bank)) { sampleUrl = bank[n % bank.length]; @@ -107,8 +91,6 @@ export const getLoadedBuffer = (url) => { return bufferCache[url]; }; -let sampleCache = { current: undefined }; - /** * Loads a collection of samples to use with `s` * @example @@ -123,7 +105,7 @@ let sampleCache = { current: undefined }; * */ -export const samples = async (sampleMap, baseUrl = sampleMap._base || '') => { +export const samples = async (sampleMap, baseUrl = sampleMap._base || '', options = {}) => { if (typeof sampleMap === 'string') { if (sampleMap.startsWith('github:')) { let [_, path] = sampleMap.split('github:'); @@ -141,43 +123,134 @@ export const samples = async (sampleMap, baseUrl = sampleMap._base || '') => { } return fetch(sampleMap) .then((res) => res.json()) - .then((json) => samples(json, baseUrl || json._base || base)) + .then((json) => samples(json, baseUrl || json._base || base, options)) .catch((error) => { console.error(error); throw new Error(`error loading "${sampleMap}"`); }); } - sampleCache.current = { - ...sampleCache.current, - ...Object.fromEntries( - Object.entries(sampleMap).map(([key, value]) => { - if (typeof value === 'string') { - value = [value]; - } - if (typeof value !== 'object') { - throw new Error('wrong sample map format for ' + key); - } - baseUrl = value._base || baseUrl; - const replaceUrl = (v) => (baseUrl + v).replace('github:', 'https://raw.githubusercontent.com/'); - if (Array.isArray(value)) { - return [key, value.map(replaceUrl)]; - } - // must be object - return [ - key, - Object.fromEntries( - Object.entries(value).map(([note, samples]) => { - return [note, (typeof samples === 'string' ? [samples] : samples).map(replaceUrl)]; - }), - ), - ]; - }), - ), + const { prebake, tag } = options; + Object.entries(sampleMap).forEach(([key, value]) => { + if (typeof value === 'string') { + value = [value]; + } + if (typeof value !== 'object') { + throw new Error('wrong sample map format for ' + key); + } + baseUrl = value._base || baseUrl; + const replaceUrl = (v) => (baseUrl + v).replace('github:', 'https://raw.githubusercontent.com/'); + if (Array.isArray(value)) { + //return [key, value.map(replaceUrl)]; + value = value.map(replaceUrl); + } else { + // must be object + value = Object.fromEntries( + Object.entries(value).map(([note, samples]) => { + return [note, (typeof samples === 'string' ? [samples] : samples).map(replaceUrl)]; + }), + ); + } + registerSound(key, (t, hapValue, onended) => onTriggerSample(t, hapValue, onended, value), { + type: 'sample', + samples: value, + baseUrl, + prebake, + tag, + }); + }); +}; + +const cutGroups = []; + +export async function onTriggerSample(t, value, onended, bank) { + const { + s, + freq, + unit, + nudge = 0, // TODO: is this in seconds? + cut, + loop, + clip = 0, // if 1, samples will be cut off when the hap ends + n = 0, + note, + speed = 1, // sample playback speed + begin = 0, + end = 1, + } = value; + // load sample + if (speed === 0) { + // no playback + return; + } + const ac = getAudioContext(); + // destructure adsr here, because the default should be different for synths and samples + const { attack = 0.001, decay = 0.001, sustain = 1, release = 0.001 } = value; + //const soundfont = getSoundfontKey(s); + const time = t + nudge; + + const bufferSource = await getSampleBufferSource(s, n, note, speed, freq, bank); + + // asny stuff above took too long? + if (ac.currentTime > t) { + logger(`[sampler] still loading sound "${s}:${n}"`, 'highlight'); + // console.warn('sample still loading:', s, n); + return; + } + if (!bufferSource) { + logger(`[sampler] could not load "${s}:${n}"`, 'error'); + return; + } + bufferSource.playbackRate.value = Math.abs(speed) * bufferSource.playbackRate.value; + if (unit === 'c') { + // are there other units? + bufferSource.playbackRate.value = bufferSource.playbackRate.value * bufferSource.buffer.duration * 1; //cps; + } + // "The computation of the offset into the sound is performed using the sound buffer's natural sample rate, + // rather than the current playback rate, so even if the sound is playing at twice its normal speed, + // the midway point through a 10-second audio buffer is still 5." + const offset = begin * bufferSource.buffer.duration; + bufferSource.start(time, offset); + const bufferDuration = bufferSource.buffer.duration / bufferSource.playbackRate.value; + /*if (loop) { + // TODO: idea for loopBegin / loopEnd + // if one of [loopBegin,loopEnd] is <= 1, interpret it as normlized + // if [loopBegin,loopEnd] is bigger >= 1, interpret it as sample number + // this will simplify perfectly looping things, while still keeping the normalized option + // the only drawback is that looping between samples 0 and 1 is not possible (which is not real use case) + bufferSource.loop = true; + bufferSource.loopStart = offset; + bufferSource.loopEnd = offset + duration; + duration = loop * duration; + }*/ + const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 1, t); + bufferSource.connect(envelope); + const out = ac.createGain(); // we need a separate gain for the cutgroups because firefox... + envelope.connect(out); + bufferSource.onended = function () { + bufferSource.disconnect(); + envelope.disconnect(); + out.disconnect(); + onended(); }; -}; + const stop = (endTime, playWholeBuffer = !clip) => { + let releaseTime = endTime; + if (playWholeBuffer) { + releaseTime = t + (end - begin) * bufferDuration; + } + bufferSource.stop(releaseTime + release); + releaseEnvelope(releaseTime); + }; + const handle = { node: out, bufferSource, stop }; -export const resetLoadedSamples = () => { - sampleCache.current = undefined; -}; + // cut groups + if (cut !== undefined) { + const prev = cutGroups[cut]; + if (prev) { + prev.node.gain.setValueAtTime(1, time); + prev.node.gain.linearRampToValueAtTime(0, time + 0.01); + } + cutGroups[cut] = handle; + } -export const getLoadedSamples = () => sampleCache.current; + return handle; +} diff --git a/packages/webaudio/synth.mjs b/packages/webaudio/synth.mjs new file mode 100644 index 00000000..6d16fae8 --- /dev/null +++ b/packages/webaudio/synth.mjs @@ -0,0 +1,44 @@ +import { fromMidi, toMidi } from '@strudel.cycles/core'; +import { registerSound } from './webaudio.mjs'; +import { getOscillator, gainNode, getEnvelope } from './helpers.mjs'; + +export function registerSynthSounds() { + ['sine', 'square', 'triangle', 'sawtooth'].forEach((wave) => { + registerSound( + wave, + (t, value, onended) => { + // destructure adsr here, because the default should be different for synths and samples + const { attack = 0.001, decay = 0.05, sustain = 0.6, release = 0.01 } = value; + let { n, note, freq } = value; + // with synths, n and note are the same thing + n = note || n || 36; + if (typeof n === 'string') { + n = toMidi(n); // e.g. c3 => 48 + } + // get frequency + if (!freq && typeof n === 'number') { + freq = fromMidi(n); // + 48); + } + // maybe pull out the above frequency resolution?? (there is also getFrequency but it has no default) + // make oscillator + const { node: o, stop } = getOscillator({ t, s: wave, freq }); + const g = gainNode(0.3); + // envelope + const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 1, t); + o.onended = () => { + o.disconnect(); + g.disconnect(); + onended(); + }; + return { + node: o.connect(g).connect(envelope), + stop: (t) => { + releaseEnvelope(t); + stop(t + release); + }, + }; + }, + { type: 'synth', prebake: true }, + ); + }); +} diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 50436d09..c75bde0b 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -5,15 +5,22 @@ This program is free software: you can redistribute it and/or modify it under th */ import * as strudel from '@strudel.cycles/core'; -import { fromMidi, logger, toMidi } from '@strudel.cycles/core'; import './feedbackdelay.mjs'; import './reverb.mjs'; -import { getSampleBufferSource } from './sampler.mjs'; -const { Pattern } = strudel; +const { Pattern, logger } = strudel; import './vowel.mjs'; import workletsUrl from './worklets.mjs?url'; +import { getFilter, gainNode } from './helpers.mjs'; +import { map } from 'nanostores'; -// export const getAudioContext = () => Tone.getContext().rawContext; +export const soundMap = map(); +export function registerSound(key, onTrigger, data = {}) { + soundMap.setKey(key, { onTrigger, data }); +} +export function getSound(s) { + return soundMap.get()[s]; +} +export const resetLoadedSounds = () => soundMap.set({}); let audioContext; export const getAudioContext = () => { @@ -38,65 +45,6 @@ export const panic = () => { destination = null; }; -const getFilter = (type, frequency, Q) => { - const filter = getAudioContext().createBiquadFilter(); - filter.type = type; - filter.frequency.value = frequency; - filter.Q.value = Q; - return filter; -}; - -const getADSR = (attack, decay, sustain, release, velocity, begin, end) => { - const gainNode = getAudioContext().createGain(); - gainNode.gain.setValueAtTime(0, begin); - gainNode.gain.linearRampToValueAtTime(velocity, begin + attack); // attack - gainNode.gain.linearRampToValueAtTime(sustain * velocity, begin + attack + decay); // sustain start - gainNode.gain.setValueAtTime(sustain * velocity, end); // sustain end - gainNode.gain.linearRampToValueAtTime(0, end + release); // release - // for some reason, using exponential ramping creates little cracklings - /* let t = begin; - gainNode.gain.setValueAtTime(0, t); - gainNode.gain.exponentialRampToValueAtTime(velocity, (t += attack)); - const sustainGain = Math.max(sustain * velocity, 0.001); - gainNode.gain.exponentialRampToValueAtTime(sustainGain, (t += decay)); - if (end - begin < attack + decay) { - gainNode.gain.cancelAndHoldAtTime(end); - } else { - gainNode.gain.setValueAtTime(sustainGain, end); - } - gainNode.gain.exponentialRampToValueAtTime(0.001, end + release); // release */ - return gainNode; -}; - -const getOscillator = ({ s, freq, t, duration, release }) => { - // make oscillator - const o = getAudioContext().createOscillator(); - o.type = s || 'triangle'; - o.frequency.value = Number(freq); - o.start(t); - o.stop(t + duration + release); - return o; -}; - -const getSoundfontKey = (s) => { - if (!globalThis.soundfontList) { - // soundfont package not loaded - return false; - } - if (globalThis.soundfontList?.instruments?.includes(s)) { - return s; - } - // check if s is one of the soundfonts, which are loaded into globalThis, to avoid coupling both packages - const nameIndex = globalThis.soundfontList?.instrumentNames?.indexOf(s); - // convert number nameIndex (0-128) to 3 digit string (001-128) - const name = nameIndex < 10 ? `00${nameIndex}` : nameIndex < 100 ? `0${nameIndex}` : nameIndex; - if (nameIndex !== -1) { - // TODO: indices of instrumentNames do not seem to match instruments - return globalThis.soundfontList.instruments.find((instrument) => instrument.startsWith(name)); - } - return; -}; - let workletsLoading; function loadWorklets() { if (workletsLoading) { @@ -136,13 +84,6 @@ export async function initAudioOnFirstClick() { }); } -function gainNode(value) { - const node = getAudioContext().createGain(); - node.gain.value = value; - return node; -} -const cutGroups = []; - let delays = {}; function getDelay(orbit, delaytime, delayfeedback, t) { if (!delays[orbit]) { @@ -186,15 +127,11 @@ export const webaudioOutput = async (hap, deadline, hapDuration, cps) => { // calculate absolute time let t = ac.currentTime + deadline; - // destructure value + // destructure let { - freq, - s, + s = 'triangle', bank, - sf, - clip = 0, // if 1, samples will be cut off when the hap ends - n = 0, - note, + source, gain = 0.8, // low pass cutoff, @@ -210,110 +147,48 @@ export const webaudioOutput = async (hap, deadline, hapDuration, cps) => { crush, shape, pan, - speed = 1, // sample playback speed - begin = 0, - end = 1, vowel, delay = 0, delayfeedback = 0.5, delaytime = 0.25, - unit, - nudge = 0, // TODO: is this in seconds? - cut, - loop, orbit = 1, room, size = 2, } = hap.value; const { velocity = 1 } = hap.context; gain *= velocity; // legacy fix for velocity - // the chain will hold all audio nodes that connect to each other - const chain = []; + let toDisconnect = []; // audio nodes that will be disconnected when the source has ended + const onended = () => { + toDisconnect.forEach((n) => n?.disconnect()); + }; if (bank && s) { s = `${bank}_${s}`; } - if (!s || ['sine', 'square', 'triangle', 'sawtooth'].includes(s)) { - // destructure adsr here, because the default should be different for synths and samples - const { attack = 0.001, decay = 0.05, sustain = 0.6, release = 0.01 } = hap.value; - // with synths, n and note are the same thing - n = note || n || 36; - if (typeof n === 'string') { - n = toMidi(n); // e.g. c3 => 48 + // get source AudioNode + let sourceNode; + if (source) { + sourceNode = source(t, hap.value, hapDuration); + } else if (getSound(s)) { + const { onTrigger } = getSound(s); + const soundHandle = await onTrigger(t, hap.value, onended); + if (soundHandle) { + sourceNode = soundHandle.node; + soundHandle.stop(t + hapDuration); } - // get frequency - if (!freq && typeof n === 'number') { - freq = fromMidi(n); // + 48); - } - // make oscillator - const o = getOscillator({ t, s, freq, duration: hapDuration, release }); - chain.push(o); - // level down oscillators as they are really loud compared to samples i've tested - chain.push(gainNode(0.3)); - // TODO: make adsr work with samples without pops - // envelope - const adsr = getADSR(attack, decay, sustain, release, 1, t, t + hapDuration); - chain.push(adsr); } else { - // destructure adsr here, because the default should be different for synths and samples - const { attack = 0.001, decay = 0.001, sustain = 1, release = 0.001 } = hap.value; - // load sample - if (speed === 0) { - // no playback - return; - } - if (!s) { - console.warn('no sample specified'); - return; - } - const soundfont = getSoundfontKey(s); - let bufferSource; - - if (soundfont) { - // is soundfont - bufferSource = await globalThis.getFontBufferSource(soundfont, note || n, ac, freq); - } else { - // is sample from loaded samples(..) - bufferSource = await getSampleBufferSource(s, n, note, speed, freq); - } - // asny stuff above took too long? - if (ac.currentTime > t) { - logger(`[sampler] still loading sound "${s}:${n}"`, 'highlight'); - // console.warn('sample still loading:', s, n); - return; - } - if (!bufferSource) { - console.warn('no buffer source'); - return; - } - bufferSource.playbackRate.value = Math.abs(speed) * bufferSource.playbackRate.value; - if (unit === 'c') { - // are there other units? - bufferSource.playbackRate.value = bufferSource.playbackRate.value * bufferSource.buffer.duration * cps; - } - let duration = soundfont || clip ? hapDuration : bufferSource.buffer.duration / bufferSource.playbackRate.value; - // "The computation of the offset into the sound is performed using the sound buffer's natural sample rate, - // rather than the current playback rate, so even if the sound is playing at twice its normal speed, - // the midway point through a 10-second audio buffer is still 5." - const offset = begin * duration * bufferSource.playbackRate.value; - duration = (end - begin) * duration; - if (loop) { - bufferSource.loop = true; - bufferSource.loopStart = offset; - bufferSource.loopEnd = offset + duration; - duration = loop * duration; - } - t += nudge; - - bufferSource.start(t, offset); - if (cut !== undefined) { - cutGroups[cut]?.stop(t); // fade out? - cutGroups[cut] = bufferSource; - } - chain.push(bufferSource); - bufferSource.stop(t + duration + release); - const adsr = getADSR(attack, decay, sustain, release, 1, t, t + duration); - chain.push(adsr); + throw new Error(`sound ${s} not found! Is it loaded?`); } + if (!sourceNode) { + // if onTrigger does not return anything, we will just silently skip + // this can be used for things like speed(0) in the sampler + return; + } + if (ac.currentTime > t) { + logger('[webaudio] skip hap: still loading', ac.currentTime - t); + return; + } + const chain = []; // audio nodes that will be connected to each other sequentially + chain.push(sourceNode); // gain stage chain.push(gainNode(gain)); @@ -357,8 +232,9 @@ export const webaudioOutput = async (hap, deadline, hapDuration, cps) => { // connect chain elements together chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); - // disconnect all nodes when source node has ended: - chain[0].onended = () => chain.concat([delaySend, reverbSend]).forEach((n) => n?.disconnect()); + // toDisconnect = all the node that should be disconnected in onended callback + // this is crucial for performance + toDisconnect = chain.concat([delaySend, reverbSend]); }; export const webaudioOutputTrigger = (t, hap, ct, cps) => webaudioOutput(hap, t - ct, hap.duration / cps, cps); diff --git a/packages/webdirt/webdirt.mjs b/packages/webdirt/webdirt.mjs index 6ae2ff9f..bf1284f8 100644 --- a/packages/webdirt/webdirt.mjs +++ b/packages/webdirt/webdirt.mjs @@ -1,7 +1,7 @@ import * as strudel from '@strudel.cycles/core'; const { Pattern } = strudel; import * as WebDirt from 'WebDirt'; -import { getLoadedSamples, loadBuffer, getLoadedBuffer } from '@strudel.cycles/webaudio'; +//import { loadBuffer, getLoadedBuffer } from '@strudel.cycles/webaudio'; let webDirt; @@ -62,8 +62,9 @@ export function loadWebDirt(config) { * @noAutocomplete */ Pattern.prototype.webdirt = function () { + throw new Error('webdirt support has been dropped..'); // create a WebDirt object and initialize Web Audio context - return this.onTrigger(async (time, e, currentTime) => { + /* return this.onTrigger(async (time, e, currentTime) => { if (!webDirt) { throw new Error('WebDirt not initialized!'); } @@ -92,5 +93,5 @@ Pattern.prototype.webdirt = function () { webDirt.playSample(msg, deadline); } } - }); + }); */ }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 473c8f3b..b325c96c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -321,9 +321,11 @@ importers: packages/webaudio: specifiers: '@strudel.cycles/core': workspace:* + nanostores: ^0.7.4 vite: ^3.2.2 dependencies: '@strudel.cycles/core': link:../core + nanostores: 0.7.4 devDependencies: vite: 3.2.5 diff --git a/test/__snapshots__/tunes.test.mjs.snap b/test/__snapshots__/tunes.test.mjs.snap index 0675938f..261255f0 100644 --- a/test/__snapshots__/tunes.test.mjs.snap +++ b/test/__snapshots__/tunes.test.mjs.snap @@ -8193,11 +8193,11 @@ exports[`renders tunes > tune: orbit 1`] = ` exports[`renders tunes > tune: outroMusic 1`] = ` [ - "[ (0/1 → 1/1) ⇝ 3/1 | note:E3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", - "[ (0/1 → 1/1) ⇝ 3/1 | note:G3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", - "[ (0/1 → 1/1) ⇝ 3/1 | note:B3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", - "[ (0/1 → 1/1) ⇝ 3/1 | note:D4 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", - "[ (0/1 → 1/1) ⇝ 9/2 | note:C5 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:E3 s:gm_epiano1 n:1 attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:G3 s:gm_epiano1 n:1 attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:B3 s:gm_epiano1 n:1 attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:D4 s:gm_epiano1 n:1 attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 9/2 | note:C5 s:gm_epiano1 n:1 attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", "[ 0/1 → 3/4 | note:C2 s:sawtooth attack:0.05 decay:0.1 sustain:0.7 cutoff:864.536878321087 gain:0.3 ]", "[ 0/1 → 3/4 | s:bd speed:0.9107561463868479 n:3 ]", "[ (3/4 → 1/1) ⇝ 3/2 | s:sd speed:0.9931522866332672 n:3 ]", diff --git a/website/public/vcsl.json b/website/public/vcsl.json index 9ab06549..983cde89 100644 --- a/website/public/vcsl.json +++ b/website/public/vcsl.json @@ -1986,7 +1986,7 @@ "Idiophones/Struck%20Idiophones/Tambourine%202/Tamb2_Shake_rr3_Mid.wav", "Idiophones/Struck%20Idiophones/Tambourine%202/Tamb2_Shake_rr4_Mid.wav" ], - "triangle": [ + "triangles": [ "Idiophones/Struck%20Idiophones/Triangles/Triangle1_HitFM_v1_rr1_Mid.wav", "Idiophones/Struck%20Idiophones/Triangles/Triangle1_HitFM_v1_rr2_Mid.wav", "Idiophones/Struck%20Idiophones/Triangles/Triangle1_HitM_v1_rr2_Mid.wav", diff --git a/website/src/config.ts b/website/src/config.ts index 266d60c0..bf26fff1 100644 --- a/website/src/config.ts +++ b/website/src/config.ts @@ -73,6 +73,7 @@ export const SIDEBAR: Sidebar = { ], Development: [ { text: 'REPL', link: 'technical-manual/repl' }, + { text: 'Sounds', link: 'technical-manual/sounds' }, { text: 'Packages', link: 'technical-manual/packages' }, { text: 'Docs', link: 'technical-manual/docs' }, { text: 'Testing', link: 'technical-manual/testing' }, diff --git a/website/src/docs/MiniRepl.jsx b/website/src/docs/MiniRepl.jsx index 83106a53..cce24623 100644 --- a/website/src/docs/MiniRepl.jsx +++ b/website/src/docs/MiniRepl.jsx @@ -18,6 +18,7 @@ if (typeof window !== 'undefined') { import('@strudel.cycles/webaudio'), import('@strudel.cycles/osc'), import('@strudel.cycles/csound'), + import('@strudel.cycles/soundfonts'), ); } diff --git a/website/src/pages/technical-manual/sounds.mdx b/website/src/pages/technical-manual/sounds.mdx new file mode 100644 index 00000000..ede7a426 --- /dev/null +++ b/website/src/pages/technical-manual/sounds.mdx @@ -0,0 +1,75 @@ +--- +title: Sounds +layout: ../../layouts/MainLayout.astro +--- + +import { MiniRepl } from '../../docs/MiniRepl'; + +# Sounds + +Let's take a closer look about how sounds are implemented in the webaudio output. + +## Registering a sound + +All sounds are registered in the sound map, using the the `registerSound` function: + +```ts +function registerSound( + name: string, // The name of the sound that should be given to `s`, e.g. `mysaw` + // The function called by the scheduler to trigger the sound: + ( + time: number, // The audio context time the sound should start + value: object, // The value of the `Hap` + onended: () => void // A callback that should be fired when the sound has ended + ) => { + node: AudioNode, // node to connect to rest of the effects chain + stop: (time:number) => void // a function that will stop the sound + }, + data: object // meta data, only for ui logic in sounds tab +); +``` + +When `registerSound` is called, it registers `{ onTrigger, data }` under the given `name` in a [nanostore map](https://github.com/nanostores/nanostores#maps). + +### Example + +This might be a bit abstract, so here is a minimal example: + +```js +registerSound( + 'mysaw', + (time, value, onended) => { + let { freq } = value; // destructure control params + const ctx = getAudioContext(); + // create oscillator + const o = new OscillatorNode(ctx, { type: 'sawtooth', frequency: Number(freq) }); + o.start(time); + // add gain node to level down osc + const g = new GainNode(ctx, { gain: 0.3 }); + // connect osc to gain + const node = o.connect(g); + // this function can be called from outside to stop the sound + const stop = (time) => o.stop(time); + // ended will be fired when stop has been fired + o.addEventListener('ended', () => { + o.disconnect(); + g.disconnect(); + onended(); + }); + return { node, stop }; + }, + { type: 'synth' }, +); +// use the sound +freq(220, 440, 330).s('mysaw'); +``` + +You can actually use this code in the [REPL](https://strudel.tidalcycles.org/) and it'll work. +After evaluating the code, you should see `mysaw` in listed in the sounds tab. + +## Playing sounds + +Now here is what happens when a sound is played: +When the webaudio output plays a `Hap`, it will lookup and call the `onTrigger` function for the given `s`. +The returned `node` can then be connected to the rest of the standard effects chain +Having the stop function separate allows playing sounds via midi too, where you don't know how long the noteon will last diff --git a/website/src/repl/Footer.jsx b/website/src/repl/Footer.jsx index 70ec90e9..458b2ed4 100644 --- a/website/src/repl/Footer.jsx +++ b/website/src/repl/Footer.jsx @@ -3,11 +3,12 @@ import { logger } from '@strudel.cycles/core'; import { useEvent, cx } from '@strudel.cycles/react'; // import { cx } from '@strudel.cycles/react'; import { nanoid } from 'nanoid'; -import React, { useCallback, useLayoutEffect, useRef, useState } from 'react'; -import { loadedSamples } from './Repl'; +import React, { useMemo, useCallback, useLayoutEffect, useRef, useState } from 'react'; import { Reference } from './Reference'; import { themes } from './themes.mjs'; import { useSettings, settingsMap, setActiveFooter, defaultSettings } from '../settings.mjs'; +import { getAudioContext, soundMap } from '@strudel.cycles/webaudio'; +import { useStore } from '@nanostores/react'; export function Footer({ context }) { const footerContent = useRef(); @@ -72,7 +73,7 @@ export function Footer({ context }) {
- + @@ -84,13 +85,10 @@ export function Footer({ context }) { )}
{activeFooter !== '' && ( -
+
{activeFooter === 'intro' && } {activeFooter === 'console' && } - {activeFooter === 'samples' && } + {activeFooter === 'sounds' && } {activeFooter === 'reference' && } {activeFooter === 'settings' && }
@@ -173,7 +171,7 @@ function WelcomeTab() { function ConsoleTab({ log }) { return ( -
+
{`███████╗████████╗██████╗ ██╗   ██╗██████╗ ███████╗██╗     
 ██╔════╝╚══██╔══╝██╔══██╗██║   ██║██╔══██╗██╔════╝██║     
 ███████╗   ██║   ██████╔╝██║   ██║██║  ██║█████╗  ██║     
@@ -193,36 +191,104 @@ function ConsoleTab({ log }) {
   );
 }
 
-function SamplesTab() {
+const getSamples = (samples) =>
+  Array.isArray(samples) ? samples.length : typeof samples === 'object' ? Object.values(samples).length : 1;
+
+function SoundsTab() {
+  const sounds = useStore(soundMap);
+  const { soundsFilter } = useSettings();
+  const soundEntries = useMemo(() => {
+    let filtered = Object.entries(sounds).filter(([key]) => !key.startsWith('_'));
+    if (!sounds) {
+      return [];
+    }
+    if (soundsFilter === 'user') {
+      return filtered.filter(([key, { data }]) => !data.prebake);
+    }
+    if (soundsFilter === 'drums') {
+      return filtered.filter(([_, { data }]) => data.type === 'sample' && data.tag === 'drum-machines');
+    }
+    if (soundsFilter === 'samples') {
+      return filtered.filter(([_, { data }]) => data.type === 'sample' && data.tag !== 'drum-machines');
+    }
+    if (soundsFilter === 'synths') {
+      return filtered.filter(([_, { data }]) => ['synth', 'soundfont'].includes(data.type));
+    }
+    return filtered;
+  }, [sounds, soundsFilter]);
+  // holds mutable ref to current triggered sound
+  const trigRef = useRef();
+  // stop current sound on mouseup
+  useEvent('mouseup', () => {
+    const t = trigRef.current;
+    trigRef.current = undefined;
+    t?.then((ref) => {
+      ref?.stop(getAudioContext().currentTime + 0.01);
+    });
+  });
   return (
-    
- {loadedSamples.length} banks loaded: - {loadedSamples.map(([name, samples]) => ( - {}}> - {' '} - {name}( - {Array.isArray(samples) ? samples.length : typeof samples === 'object' ? Object.values(samples).length : 1}){' '} - - ))} +
+
+ settingsMap.setKey('soundsFilter', value)} + items={{ + samples: 'samples', + drums: 'drum-machines', + synths: 'Synths', + user: 'User', + }} + > +
+
+ {soundEntries.map(([name, { data, onTrigger }]) => ( + { + const ctx = getAudioContext(); + const params = { + note: ['synth', 'soundfont'].includes(data.type) ? 'a3' : undefined, + s: name, + clip: 1, + release: 0.5, + }; + const time = ctx.currentTime + 0.05; + const onended = () => trigRef.current?.node?.disconnect(); + trigRef.current = Promise.resolve(onTrigger(time, params, onended)); + trigRef.current.then((ref) => { + ref?.node.connect(ctx.destination); + }); + }} + > + {' '} + {name} + {data?.type === 'sample' ? `(${getSamples(data.samples)})` : ''} + {data?.type === 'soundfont' ? `(${data.fonts.length})` : ''} + + ))} + {!soundEntries.length ? 'No custom sounds loaded in this pattern (yet).' : ''} +
); } function ButtonGroup({ value, onChange, items }) { return ( -
+
{Object.entries(items).map(([key, label], i, arr) => ( ))}
diff --git a/website/src/repl/Reference.jsx b/website/src/repl/Reference.jsx index 13a38ef8..90130d9e 100644 --- a/website/src/repl/Reference.jsx +++ b/website/src/repl/Reference.jsx @@ -6,7 +6,7 @@ const visibleFunctions = jsdocJson.docs export function Reference() { return (
-
+
{visibleFunctions.map((entry, i) => ( {entry.name} {/* {entry.meta.filename} */} diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index ce21f1c1..186e1628 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -6,13 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th import { cleanupDraw, cleanupUi, controls, evalScope, getDrawContext, logger } from '@strudel.cycles/core'; import { CodeMirror, cx, flash, useHighlighting, useStrudel, useKeydown } from '@strudel.cycles/react'; -import { - getAudioContext, - getLoadedSamples, - initAudioOnFirstClick, - resetLoadedSamples, - webaudioOutput, -} from '@strudel.cycles/webaudio'; +import { getAudioContext, initAudioOnFirstClick, resetLoadedSounds, webaudioOutput } from '@strudel.cycles/webaudio'; import { createClient } from '@supabase/supabase-js'; import { nanoid } from 'nanoid'; import React, { createContext, useCallback, useEffect, useState } from 'react'; @@ -53,7 +47,6 @@ evalScope( ...modules, ); -export let loadedSamples = []; const presets = prebake(); let drawContext, clearCanvas; @@ -62,11 +55,6 @@ if (typeof window !== 'undefined') { clearCanvas = () => drawContext.clearRect(0, 0, drawContext.canvas.height, drawContext.canvas.width); } -Promise.all([...modules, presets]).then((data) => { - // console.log('modules and sample registry loade', data); - loadedSamples = Object.entries(getLoadedSamples() || {}); -}); - const getTime = () => getAudioContext().currentTime; async function initCode() { @@ -211,7 +199,7 @@ export function Repl({ embedded = false }) { const { code, name } = getRandomTune(); logger(`[repl] ✨ loading random tune "${name}"`); clearCanvas(); - resetLoadedSamples(); + resetLoadedSounds(); await prebake(); // declare default samples await evaluate(code, false); }; diff --git a/website/src/repl/prebake.mjs b/website/src/repl/prebake.mjs index b0e1cc96..b7b848d0 100644 --- a/website/src/repl/prebake.mjs +++ b/website/src/repl/prebake.mjs @@ -1,17 +1,23 @@ import { Pattern, toMidi, valueToMidi } from '@strudel.cycles/core'; -import { samples } from '@strudel.cycles/webaudio'; +//import { registerSoundfonts } from '@strudel.cycles/soundfonts'; +import { registerSynthSounds, samples } from '@strudel.cycles/webaudio'; export async function prebake() { // https://archive.org/details/SalamanderGrandPianoV3 // License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm - return await Promise.all([ - samples(`./piano.json`, `./piano/`), + registerSynthSounds(); + //registerSoundfonts(); + await Promise.all([ + samples(`./piano.json`, `./piano/`, { prebake: true }), // https://github.com/sgossner/VCSL/ // https://api.github.com/repositories/126427031/contents/ // LICENSE: CC0 general-purpose - samples(`./vcsl.json`, 'github:sgossner/VCSL/master/'), - samples(`./tidal-drum-machines.json`, 'github:ritchse/tidal-drum-machines/main/machines/'), - samples(`./EmuSP12.json`, `./EmuSP12/`), + samples(`./vcsl.json`, 'github:sgossner/VCSL/master/', { prebake: true }), + samples(`./tidal-drum-machines.json`, 'github:ritchse/tidal-drum-machines/main/machines/', { + prebake: true, + tag: 'drum-machines', + }), + samples(`./EmuSP12.json`, `./EmuSP12/`, { prebake: true, tag: 'drum-machines' }), // samples('github:tidalcycles/Dirt-Samples/master'), ]); } diff --git a/website/src/repl/tunes.mjs b/website/src/repl/tunes.mjs index 554fe43c..9a564609 100644 --- a/website/src/repl/tunes.mjs +++ b/website/src/repl/tunes.mjs @@ -566,7 +566,7 @@ samples({ "C^7 Am7 Dm7 G7".slow(2).voicings('lefthand') .stack("0@6 [<1 2> <2 0> 1]@2".scale('C5 major')) .note().slow(4) - .s('0040_FluidR3_GM_sf2_file') + .s("gm_epiano1:1") .color('steelblue') .stack( "<-7 ~@2 [~@2 -7] -9 ~@2 [~@2 -9] -10!2 ~ [~@2 -10] -5 ~ [-3 -2 -10]@2>*2".scale('C3 major') diff --git a/website/src/settings.mjs b/website/src/settings.mjs index 82888581..583454c7 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -9,6 +9,7 @@ export const defaultSettings = { fontSize: 18, latestCode: '', isZen: false, + soundsFilter: 'all', }; export const settingsMap = persistentMap('strudel-settings', defaultSettings); diff --git a/website/src/styles/index.css b/website/src/styles/index.css index 82fda468..62b2653d 100644 --- a/website/src/styles/index.css +++ b/website/src/styles/index.css @@ -30,7 +30,6 @@ --app-height: 100vh; } -#console-tab, -#samples-tab { +#console-tab { font-family: BigBlueTerminal, monospace; }