Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/com/sun/media/sound/EmergencySoundbank.java
38924 views
/*1* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/24package com.sun.media.sound;2526import java.util.Random;2728import javax.sound.midi.Patch;29import javax.sound.sampled.AudioFormat;3031/**32* Emergency Soundbank generator.33* Used when no other default soundbank can be found.34*35* @author Karl Helgason36*/37public final class EmergencySoundbank {3839private final static String[] general_midi_instruments = {40"Acoustic Grand Piano",41"Bright Acoustic Piano",42"Electric Grand Piano",43"Honky-tonk Piano",44"Electric Piano 1",45"Electric Piano 2",46"Harpsichord",47"Clavi",48"Celesta",49"Glockenspiel",50"Music Box",51"Vibraphone",52"Marimba",53"Xylophone",54"Tubular Bells",55"Dulcimer",56"Drawbar Organ",57"Percussive Organ",58"Rock Organ",59"Church Organ",60"Reed Organ",61"Accordion",62"Harmonica",63"Tango Accordion",64"Acoustic Guitar (nylon)",65"Acoustic Guitar (steel)",66"Electric Guitar (jazz)",67"Electric Guitar (clean)",68"Electric Guitar (muted)",69"Overdriven Guitar",70"Distortion Guitar",71"Guitar harmonics",72"Acoustic Bass",73"Electric Bass (finger)",74"Electric Bass (pick)",75"Fretless Bass",76"Slap Bass 1",77"Slap Bass 2",78"Synth Bass 1",79"Synth Bass 2",80"Violin",81"Viola",82"Cello",83"Contrabass",84"Tremolo Strings",85"Pizzicato Strings",86"Orchestral Harp",87"Timpani",88"String Ensemble 1",89"String Ensemble 2",90"SynthStrings 1",91"SynthStrings 2",92"Choir Aahs",93"Voice Oohs",94"Synth Voice",95"Orchestra Hit",96"Trumpet",97"Trombone",98"Tuba",99"Muted Trumpet",100"French Horn",101"Brass Section",102"SynthBrass 1",103"SynthBrass 2",104"Soprano Sax",105"Alto Sax",106"Tenor Sax",107"Baritone Sax",108"Oboe",109"English Horn",110"Bassoon",111"Clarinet",112"Piccolo",113"Flute",114"Recorder",115"Pan Flute",116"Blown Bottle",117"Shakuhachi",118"Whistle",119"Ocarina",120"Lead 1 (square)",121"Lead 2 (sawtooth)",122"Lead 3 (calliope)",123"Lead 4 (chiff)",124"Lead 5 (charang)",125"Lead 6 (voice)",126"Lead 7 (fifths)",127"Lead 8 (bass + lead)",128"Pad 1 (new age)",129"Pad 2 (warm)",130"Pad 3 (polysynth)",131"Pad 4 (choir)",132"Pad 5 (bowed)",133"Pad 6 (metallic)",134"Pad 7 (halo)",135"Pad 8 (sweep)",136"FX 1 (rain)",137"FX 2 (soundtrack)",138"FX 3 (crystal)",139"FX 4 (atmosphere)",140"FX 5 (brightness)",141"FX 6 (goblins)",142"FX 7 (echoes)",143"FX 8 (sci-fi)",144"Sitar",145"Banjo",146"Shamisen",147"Koto",148"Kalimba",149"Bag pipe",150"Fiddle",151"Shanai",152"Tinkle Bell",153"Agogo",154"Steel Drums",155"Woodblock",156"Taiko Drum",157"Melodic Tom",158"Synth Drum",159"Reverse Cymbal",160"Guitar Fret Noise",161"Breath Noise",162"Seashore",163"Bird Tweet",164"Telephone Ring",165"Helicopter",166"Applause",167"Gunshot"168};169170public static SF2Soundbank createSoundbank() throws Exception {171SF2Soundbank sf2 = new SF2Soundbank();172sf2.setName("Emergency GM sound set");173sf2.setVendor("Generated");174sf2.setDescription("Emergency generated soundbank");175176/*177* percussion instruments178*/179180SF2Layer bass_drum = new_bass_drum(sf2);181SF2Layer snare_drum = new_snare_drum(sf2);182SF2Layer tom = new_tom(sf2);183SF2Layer open_hihat = new_open_hihat(sf2);184SF2Layer closed_hihat = new_closed_hihat(sf2);185SF2Layer crash_cymbal = new_crash_cymbal(sf2);186SF2Layer side_stick = new_side_stick(sf2);187188SF2Layer[] drums = new SF2Layer[128];189drums[35] = bass_drum;190drums[36] = bass_drum;191drums[38] = snare_drum;192drums[40] = snare_drum;193drums[41] = tom;194drums[43] = tom;195drums[45] = tom;196drums[47] = tom;197drums[48] = tom;198drums[50] = tom;199drums[42] = closed_hihat;200drums[44] = closed_hihat;201drums[46] = open_hihat;202drums[49] = crash_cymbal;203drums[51] = crash_cymbal;204drums[52] = crash_cymbal;205drums[55] = crash_cymbal;206drums[57] = crash_cymbal;207drums[59] = crash_cymbal;208209// Use side_stick for missing drums:210drums[37] = side_stick;211drums[39] = side_stick;212drums[53] = side_stick;213drums[54] = side_stick;214drums[56] = side_stick;215drums[58] = side_stick;216drums[69] = side_stick;217drums[70] = side_stick;218drums[75] = side_stick;219drums[60] = side_stick;220drums[61] = side_stick;221drums[62] = side_stick;222drums[63] = side_stick;223drums[64] = side_stick;224drums[65] = side_stick;225drums[66] = side_stick;226drums[67] = side_stick;227drums[68] = side_stick;228drums[71] = side_stick;229drums[72] = side_stick;230drums[73] = side_stick;231drums[74] = side_stick;232drums[76] = side_stick;233drums[77] = side_stick;234drums[78] = side_stick;235drums[79] = side_stick;236drums[80] = side_stick;237drums[81] = side_stick;238239240SF2Instrument drum_instrument = new SF2Instrument(sf2);241drum_instrument.setName("Standard Kit");242drum_instrument.setPatch(new ModelPatch(0, 0, true));243sf2.addInstrument(drum_instrument);244for (int i = 0; i < drums.length; i++) {245if (drums[i] != null) {246SF2InstrumentRegion region = new SF2InstrumentRegion();247region.setLayer(drums[i]);248region.putBytes(SF2InstrumentRegion.GENERATOR_KEYRANGE,249new byte[]{(byte) i, (byte) i});250drum_instrument.getRegions().add(region);251}252}253254255/*256* melodic instruments257*/258259SF2Layer gpiano = new_gpiano(sf2);260SF2Layer gpiano2 = new_gpiano2(sf2);261SF2Layer gpiano_hammer = new_piano_hammer(sf2);262SF2Layer piano1 = new_piano1(sf2);263SF2Layer epiano1 = new_epiano1(sf2);264SF2Layer epiano2 = new_epiano2(sf2);265266SF2Layer guitar = new_guitar1(sf2);267SF2Layer guitar_pick = new_guitar_pick(sf2);268SF2Layer guitar_dist = new_guitar_dist(sf2);269SF2Layer bass1 = new_bass1(sf2);270SF2Layer bass2 = new_bass2(sf2);271SF2Layer synthbass = new_synthbass(sf2);272SF2Layer string2 = new_string2(sf2);273SF2Layer orchhit = new_orchhit(sf2);274SF2Layer choir = new_choir(sf2);275SF2Layer solostring = new_solostring(sf2);276SF2Layer organ = new_organ(sf2);277SF2Layer ch_organ = new_ch_organ(sf2);278SF2Layer bell = new_bell(sf2);279SF2Layer flute = new_flute(sf2);280281SF2Layer timpani = new_timpani(sf2);282SF2Layer melodic_toms = new_melodic_toms(sf2);283SF2Layer trumpet = new_trumpet(sf2);284SF2Layer trombone = new_trombone(sf2);285SF2Layer brass_section = new_brass_section(sf2);286SF2Layer horn = new_horn(sf2);287SF2Layer sax = new_sax(sf2);288SF2Layer oboe = new_oboe(sf2);289SF2Layer bassoon = new_bassoon(sf2);290SF2Layer clarinet = new_clarinet(sf2);291SF2Layer reverse_cymbal = new_reverse_cymbal(sf2);292293SF2Layer defaultsound = piano1;294295newInstrument(sf2, "Piano", new Patch(0, 0), gpiano, gpiano_hammer);296newInstrument(sf2, "Piano", new Patch(0, 1), gpiano2, gpiano_hammer);297newInstrument(sf2, "Piano", new Patch(0, 2), piano1);298{299SF2Instrument ins = newInstrument(sf2, "Honky-tonk Piano",300new Patch(0, 3), piano1, piano1);301SF2InstrumentRegion region = ins.getRegions().get(0);302region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 80);303region.putInteger(SF2Region.GENERATOR_FINETUNE, 30);304region = ins.getRegions().get(1);305region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 30);306}307newInstrument(sf2, "Rhodes", new Patch(0, 4), epiano2);308newInstrument(sf2, "Rhodes", new Patch(0, 5), epiano2);309newInstrument(sf2, "Clavinet", new Patch(0, 6), epiano1);310newInstrument(sf2, "Clavinet", new Patch(0, 7), epiano1);311newInstrument(sf2, "Rhodes", new Patch(0, 8), epiano2);312newInstrument(sf2, "Bell", new Patch(0, 9), bell);313newInstrument(sf2, "Bell", new Patch(0, 10), bell);314newInstrument(sf2, "Vibraphone", new Patch(0, 11), bell);315newInstrument(sf2, "Marimba", new Patch(0, 12), bell);316newInstrument(sf2, "Marimba", new Patch(0, 13), bell);317newInstrument(sf2, "Bell", new Patch(0, 14), bell);318newInstrument(sf2, "Rock Organ", new Patch(0, 15), organ);319newInstrument(sf2, "Rock Organ", new Patch(0, 16), organ);320newInstrument(sf2, "Perc Organ", new Patch(0, 17), organ);321newInstrument(sf2, "Rock Organ", new Patch(0, 18), organ);322newInstrument(sf2, "Church Organ", new Patch(0, 19), ch_organ);323newInstrument(sf2, "Accordion", new Patch(0, 20), organ);324newInstrument(sf2, "Accordion", new Patch(0, 21), organ);325newInstrument(sf2, "Accordion", new Patch(0, 22), organ);326newInstrument(sf2, "Accordion", new Patch(0, 23), organ);327newInstrument(sf2, "Guitar", new Patch(0, 24), guitar, guitar_pick);328newInstrument(sf2, "Guitar", new Patch(0, 25), guitar, guitar_pick);329newInstrument(sf2, "Guitar", new Patch(0, 26), guitar, guitar_pick);330newInstrument(sf2, "Guitar", new Patch(0, 27), guitar, guitar_pick);331newInstrument(sf2, "Guitar", new Patch(0, 28), guitar, guitar_pick);332newInstrument(sf2, "Distorted Guitar", new Patch(0, 29), guitar_dist);333newInstrument(sf2, "Distorted Guitar", new Patch(0, 30), guitar_dist);334newInstrument(sf2, "Guitar", new Patch(0, 31), guitar, guitar_pick);335newInstrument(sf2, "Finger Bass", new Patch(0, 32), bass1);336newInstrument(sf2, "Finger Bass", new Patch(0, 33), bass1);337newInstrument(sf2, "Finger Bass", new Patch(0, 34), bass1);338newInstrument(sf2, "Frettless Bass", new Patch(0, 35), bass2);339newInstrument(sf2, "Frettless Bass", new Patch(0, 36), bass2);340newInstrument(sf2, "Frettless Bass", new Patch(0, 37), bass2);341newInstrument(sf2, "Synth Bass1", new Patch(0, 38), synthbass);342newInstrument(sf2, "Synth Bass2", new Patch(0, 39), synthbass);343newInstrument(sf2, "Solo String", new Patch(0, 40), string2, solostring);344newInstrument(sf2, "Solo String", new Patch(0, 41), string2, solostring);345newInstrument(sf2, "Solo String", new Patch(0, 42), string2, solostring);346newInstrument(sf2, "Solo String", new Patch(0, 43), string2, solostring);347newInstrument(sf2, "Solo String", new Patch(0, 44), string2, solostring);348newInstrument(sf2, "Def", new Patch(0, 45), defaultsound);349newInstrument(sf2, "Harp", new Patch(0, 46), bell);350newInstrument(sf2, "Timpani", new Patch(0, 47), timpani);351newInstrument(sf2, "Strings", new Patch(0, 48), string2);352SF2Instrument slow_strings =353newInstrument(sf2, "Slow Strings", new Patch(0, 49), string2);354SF2InstrumentRegion region = slow_strings.getRegions().get(0);355region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, 2500);356region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 2000);357newInstrument(sf2, "Synth Strings", new Patch(0, 50), string2);358newInstrument(sf2, "Synth Strings", new Patch(0, 51), string2);359360361newInstrument(sf2, "Choir", new Patch(0, 52), choir);362newInstrument(sf2, "Choir", new Patch(0, 53), choir);363newInstrument(sf2, "Choir", new Patch(0, 54), choir);364{365SF2Instrument ins = newInstrument(sf2, "Orch Hit",366new Patch(0, 55), orchhit, orchhit, timpani);367region = ins.getRegions().get(0);368region.putInteger(SF2Region.GENERATOR_COARSETUNE, -12);369region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);370}371newInstrument(sf2, "Trumpet", new Patch(0, 56), trumpet);372newInstrument(sf2, "Trombone", new Patch(0, 57), trombone);373newInstrument(sf2, "Trombone", new Patch(0, 58), trombone);374newInstrument(sf2, "Trumpet", new Patch(0, 59), trumpet);375newInstrument(sf2, "Horn", new Patch(0, 60), horn);376newInstrument(sf2, "Brass Section", new Patch(0, 61), brass_section);377newInstrument(sf2, "Brass Section", new Patch(0, 62), brass_section);378newInstrument(sf2, "Brass Section", new Patch(0, 63), brass_section);379newInstrument(sf2, "Sax", new Patch(0, 64), sax);380newInstrument(sf2, "Sax", new Patch(0, 65), sax);381newInstrument(sf2, "Sax", new Patch(0, 66), sax);382newInstrument(sf2, "Sax", new Patch(0, 67), sax);383newInstrument(sf2, "Oboe", new Patch(0, 68), oboe);384newInstrument(sf2, "Horn", new Patch(0, 69), horn);385newInstrument(sf2, "Bassoon", new Patch(0, 70), bassoon);386newInstrument(sf2, "Clarinet", new Patch(0, 71), clarinet);387newInstrument(sf2, "Flute", new Patch(0, 72), flute);388newInstrument(sf2, "Flute", new Patch(0, 73), flute);389newInstrument(sf2, "Flute", new Patch(0, 74), flute);390newInstrument(sf2, "Flute", new Patch(0, 75), flute);391newInstrument(sf2, "Flute", new Patch(0, 76), flute);392newInstrument(sf2, "Flute", new Patch(0, 77), flute);393newInstrument(sf2, "Flute", new Patch(0, 78), flute);394newInstrument(sf2, "Flute", new Patch(0, 79), flute);395newInstrument(sf2, "Organ", new Patch(0, 80), organ);396newInstrument(sf2, "Organ", new Patch(0, 81), organ);397newInstrument(sf2, "Flute", new Patch(0, 82), flute);398newInstrument(sf2, "Organ", new Patch(0, 83), organ);399newInstrument(sf2, "Organ", new Patch(0, 84), organ);400newInstrument(sf2, "Choir", new Patch(0, 85), choir);401newInstrument(sf2, "Organ", new Patch(0, 86), organ);402newInstrument(sf2, "Organ", new Patch(0, 87), organ);403newInstrument(sf2, "Synth Strings", new Patch(0, 88), string2);404newInstrument(sf2, "Organ", new Patch(0, 89), organ);405newInstrument(sf2, "Def", new Patch(0, 90), defaultsound);406newInstrument(sf2, "Choir", new Patch(0, 91), choir);407newInstrument(sf2, "Organ", new Patch(0, 92), organ);408newInstrument(sf2, "Organ", new Patch(0, 93), organ);409newInstrument(sf2, "Organ", new Patch(0, 94), organ);410newInstrument(sf2, "Organ", new Patch(0, 95), organ);411newInstrument(sf2, "Organ", new Patch(0, 96), organ);412newInstrument(sf2, "Organ", new Patch(0, 97), organ);413newInstrument(sf2, "Bell", new Patch(0, 98), bell);414newInstrument(sf2, "Organ", new Patch(0, 99), organ);415newInstrument(sf2, "Organ", new Patch(0, 100), organ);416newInstrument(sf2, "Organ", new Patch(0, 101), organ);417newInstrument(sf2, "Def", new Patch(0, 102), defaultsound);418newInstrument(sf2, "Synth Strings", new Patch(0, 103), string2);419newInstrument(sf2, "Def", new Patch(0, 104), defaultsound);420newInstrument(sf2, "Def", new Patch(0, 105), defaultsound);421newInstrument(sf2, "Def", new Patch(0, 106), defaultsound);422newInstrument(sf2, "Def", new Patch(0, 107), defaultsound);423newInstrument(sf2, "Marimba", new Patch(0, 108), bell);424newInstrument(sf2, "Sax", new Patch(0, 109), sax);425newInstrument(sf2, "Solo String", new Patch(0, 110), string2, solostring);426newInstrument(sf2, "Oboe", new Patch(0, 111), oboe);427newInstrument(sf2, "Bell", new Patch(0, 112), bell);428newInstrument(sf2, "Melodic Toms", new Patch(0, 113), melodic_toms);429newInstrument(sf2, "Marimba", new Patch(0, 114), bell);430newInstrument(sf2, "Melodic Toms", new Patch(0, 115), melodic_toms);431newInstrument(sf2, "Melodic Toms", new Patch(0, 116), melodic_toms);432newInstrument(sf2, "Melodic Toms", new Patch(0, 117), melodic_toms);433newInstrument(sf2, "Reverse Cymbal", new Patch(0, 118), reverse_cymbal);434newInstrument(sf2, "Reverse Cymbal", new Patch(0, 119), reverse_cymbal);435newInstrument(sf2, "Guitar", new Patch(0, 120), guitar);436newInstrument(sf2, "Def", new Patch(0, 121), defaultsound);437{438SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",439new Patch(0, 122), reverse_cymbal);440region = ins.getRegions().get(0);441region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);442region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);443region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);444region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);445}446{447SF2Instrument ins = newInstrument(sf2, "Bird/Flute",448new Patch(0, 123), flute);449region = ins.getRegions().get(0);450region.putInteger(SF2Region.GENERATOR_COARSETUNE, 24);451region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -3000);452region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);453}454newInstrument(sf2, "Def", new Patch(0, 124), side_stick);455{456SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",457new Patch(0, 125), reverse_cymbal);458region = ins.getRegions().get(0);459region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);460region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);461region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);462region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);463}464newInstrument(sf2, "Applause/crash_cymbal",465new Patch(0, 126), crash_cymbal);466newInstrument(sf2, "Gunshot/side_stick", new Patch(0, 127), side_stick);467468for (SF2Instrument instrument : sf2.getInstruments()) {469Patch patch = instrument.getPatch();470if (patch instanceof ModelPatch) {471if (((ModelPatch) patch).isPercussion())472continue;473}474instrument.setName(general_midi_instruments[patch.getProgram()]);475}476477return sf2;478479}480481public static SF2Layer new_bell(SF2Soundbank sf2) {482Random random = new Random(102030201);483int x = 8;484int fftsize = 4096 * x;485double[] data = new double[fftsize * 2];486double base = x * 25;487double start_w = 0.01;488double end_w = 0.05;489double start_a = 0.2;490double end_a = 0.00001;491double a = start_a;492double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);493for (int i = 0; i < 40; i++) {494double detune = 1 + (random.nextDouble() * 2 - 1) * 0.01;495double w = start_w + (end_w - start_w) * (i / 40.0);496complexGaussianDist(data, base * (i + 1) * detune, w, a);497a *= a_step;498}499SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);500SF2Layer layer = newLayer(sf2, "EPiano", sample);501SF2Region region = layer.getRegions().get(0);502region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);503region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);504region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);505region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);506region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);507region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);508region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);509region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);510region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);511return layer;512}513514public static SF2Layer new_guitar1(SF2Soundbank sf2) {515516int x = 8;517int fftsize = 4096 * x;518double[] data = new double[fftsize * 2];519double base = x * 25;520double start_w = 0.01;521double end_w = 0.01;522double start_a = 2;523double end_a = 0.01;524double a = start_a;525double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);526527double[] aa = new double[40];528for (int i = 0; i < 40; i++) {529aa[i] = a;530a *= a_step;531}532533aa[0] = 2;534aa[1] = 0.5;535aa[2] = 0.45;536aa[3] = 0.2;537aa[4] = 1;538aa[5] = 0.5;539aa[6] = 2;540aa[7] = 1;541aa[8] = 0.5;542aa[9] = 1;543aa[9] = 0.5;544aa[10] = 0.2;545aa[11] = 1;546aa[12] = 0.7;547aa[13] = 0.5;548aa[14] = 1;549550for (int i = 0; i < 40; i++) {551double w = start_w + (end_w - start_w) * (i / 40.0);552complexGaussianDist(data, base * (i + 1), w, aa[i]);553}554555SF2Sample sample = newSimpleFFTSample(sf2, "Guitar", data, base);556SF2Layer layer = newLayer(sf2, "Guitar", sample);557SF2Region region = layer.getRegions().get(0);558region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);559region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);560region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);561region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);562region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);563564region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);565region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);566region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -6000);567region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);568region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);569return layer;570}571572public static SF2Layer new_guitar_dist(SF2Soundbank sf2) {573574int x = 8;575int fftsize = 4096 * x;576double[] data = new double[fftsize * 2];577double base = x * 25;578double start_w = 0.01;579double end_w = 0.01;580double start_a = 2;581double end_a = 0.01;582double a = start_a;583double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);584585double[] aa = new double[40];586for (int i = 0; i < 40; i++) {587aa[i] = a;588a *= a_step;589}590591aa[0] = 5;592aa[1] = 2;593aa[2] = 0.45;594aa[3] = 0.2;595aa[4] = 1;596aa[5] = 0.5;597aa[6] = 2;598aa[7] = 1;599aa[8] = 0.5;600aa[9] = 1;601aa[9] = 0.5;602aa[10] = 0.2;603aa[11] = 1;604aa[12] = 0.7;605aa[13] = 0.5;606aa[14] = 1;607608for (int i = 0; i < 40; i++) {609double w = start_w + (end_w - start_w) * (i / 40.0);610complexGaussianDist(data, base * (i + 1), w, aa[i]);611}612613614SF2Sample sample = newSimpleFFTSample_dist(sf2, "Distorted Guitar",615data, base, 10000.0);616617618SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample);619SF2Region region = layer.getRegions().get(0);620region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);621region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);622region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);623//region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);624//region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200);625626//region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);627//region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);628//region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000);629region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);630//region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);631return layer;632}633634public static SF2Layer new_guitar_pick(SF2Soundbank sf2) {635636double datab[];637638// Make treble part639{640int m = 2;641int fftlen = 4096 * m;642double[] data = new double[2 * fftlen];643Random random = new Random(3049912);644for (int i = 0; i < data.length; i += 2)645data[i] = (2.0 * (random.nextDouble() - 0.5));646fft(data);647// Remove all negative frequency648for (int i = fftlen / 2; i < data.length; i++)649data[i] = 0;650for (int i = 0; i < 2048 * m; i++) {651data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2)652+ Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9);653}654randomPhase(data, new Random(3049912));655ifft(data);656normalize(data, 0.8);657data = realPart(data);658double gain = 1.0;659for (int i = 0; i < data.length; i++) {660data[i] *= gain;661gain *= 0.9994;662}663datab = data;664665fadeUp(data, 80);666}667668SF2Sample sample = newSimpleDrumSample(sf2, "Guitar Noise", datab);669670SF2Layer layer = new SF2Layer(sf2);671layer.setName("Guitar Noise");672673SF2GlobalRegion global = new SF2GlobalRegion();674layer.setGlobalZone(global);675sf2.addResource(layer);676677SF2LayerRegion region = new SF2LayerRegion();678region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);679//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);680// region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);681/*682region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);683region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);684region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);685region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);686region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);687*/688689region.setSample(sample);690layer.getRegions().add(region);691692return layer;693}694695public static SF2Layer new_gpiano(SF2Soundbank sf2) {696//Random random = new Random(302030201);697int x = 8;698int fftsize = 4096 * x;699double[] data = new double[fftsize * 2];700double base = x * 25;701double start_a = 0.2;702double end_a = 0.001;703double a = start_a;704double a_step = Math.pow(end_a / start_a, 1.0 / 15.0);705706double[] aa = new double[30];707for (int i = 0; i < 30; i++) {708aa[i] = a;709a *= a_step;710}711712aa[0] *= 2;713//aa[2] *= 0.1;714aa[4] *= 2;715716717aa[12] *= 0.9;718aa[13] *= 0.7;719for (int i = 14; i < 30; i++) {720aa[i] *= 0.5;721}722723724for (int i = 0; i < 30; i++) {725//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;726double w = 0.2;727double ai = aa[i];728if (i > 10) {729w = 5;730ai *= 10;731}732int adjust = 0;733if (i > 5) {734adjust = (i - 5) * 7;735}736complexGaussianDist(data, base * (i + 1) + adjust, w, ai);737}738739SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);740SF2Layer layer = newLayer(sf2, "Grand Piano", sample);741SF2Region region = layer.getRegions().get(0);742region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);743region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);744region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);745region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);746region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);747region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);748region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);749region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);750region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);751return layer;752}753754public static SF2Layer new_gpiano2(SF2Soundbank sf2) {755//Random random = new Random(302030201);756int x = 8;757int fftsize = 4096 * x;758double[] data = new double[fftsize * 2];759double base = x * 25;760double start_a = 0.2;761double end_a = 0.001;762double a = start_a;763double a_step = Math.pow(end_a / start_a, 1.0 / 20.0);764765double[] aa = new double[30];766for (int i = 0; i < 30; i++) {767aa[i] = a;768a *= a_step;769}770771aa[0] *= 1;772//aa[2] *= 0.1;773aa[4] *= 2;774775776aa[12] *= 0.9;777aa[13] *= 0.7;778for (int i = 14; i < 30; i++) {779aa[i] *= 0.5;780}781782783for (int i = 0; i < 30; i++) {784//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;785double w = 0.2;786double ai = aa[i];787if (i > 10) {788w = 5;789ai *= 10;790}791int adjust = 0;792if (i > 5) {793adjust = (i - 5) * 7;794}795complexGaussianDist(data, base * (i + 1) + adjust, w, ai);796}797798SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);799SF2Layer layer = newLayer(sf2, "Grand Piano", sample);800SF2Region region = layer.getRegions().get(0);801region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);802region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);803region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);804region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);805region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);806region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);807region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);808region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);809region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);810return layer;811}812813public static SF2Layer new_piano_hammer(SF2Soundbank sf2) {814815double datab[];816817// Make treble part818{819int m = 2;820int fftlen = 4096 * m;821double[] data = new double[2 * fftlen];822Random random = new Random(3049912);823for (int i = 0; i < data.length; i += 2)824data[i] = (2.0 * (random.nextDouble() - 0.5));825fft(data);826// Remove all negative frequency827for (int i = fftlen / 2; i < data.length; i++)828data[i] = 0;829for (int i = 0; i < 2048 * m; i++)830data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05);831randomPhase(data, new Random(3049912));832ifft(data);833normalize(data, 0.6);834data = realPart(data);835double gain = 1.0;836for (int i = 0; i < data.length; i++) {837data[i] *= gain;838gain *= 0.9997;839}840datab = data;841842fadeUp(data, 80);843}844845SF2Sample sample = newSimpleDrumSample(sf2, "Piano Hammer", datab);846847SF2Layer layer = new SF2Layer(sf2);848layer.setName("Piano Hammer");849850SF2GlobalRegion global = new SF2GlobalRegion();851layer.setGlobalZone(global);852sf2.addResource(layer);853854SF2LayerRegion region = new SF2LayerRegion();855region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);856//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);857/*858region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);859region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);860region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);861region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);862region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);863*/864865region.setSample(sample);866layer.getRegions().add(region);867868return layer;869}870871public static SF2Layer new_piano1(SF2Soundbank sf2) {872//Random random = new Random(302030201);873int x = 8;874int fftsize = 4096 * x;875double[] data = new double[fftsize * 2];876double base = x * 25;877double start_a = 0.2;878double end_a = 0.0001;879double a = start_a;880double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);881882double[] aa = new double[30];883for (int i = 0; i < 30; i++) {884aa[i] = a;885a *= a_step;886}887888aa[0] *= 5;889aa[2] *= 0.1;890aa[7] *= 5;891892893for (int i = 0; i < 30; i++) {894//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;895double w = 0.2;896double ai = aa[i];897if (i > 12) {898w = 5;899ai *= 10;900}901int adjust = 0;902if (i > 5) {903adjust = (i - 5) * 7;904}905complexGaussianDist(data, base * (i + 1) + adjust, w, ai);906}907908complexGaussianDist(data, base * (15.5), 1, 0.1);909complexGaussianDist(data, base * (17.5), 1, 0.01);910911SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base, 200);912SF2Layer layer = newLayer(sf2, "EPiano", sample);913SF2Region region = layer.getRegions().get(0);914region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);915region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);916region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);917region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);918region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);919region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -1200);920region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);921region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);922region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);923return layer;924}925926public static SF2Layer new_epiano1(SF2Soundbank sf2) {927Random random = new Random(302030201);928int x = 8;929int fftsize = 4096 * x;930double[] data = new double[fftsize * 2];931double base = x * 25;932double start_w = 0.05;933double end_w = 0.05;934double start_a = 0.2;935double end_a = 0.0001;936double a = start_a;937double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);938for (int i = 0; i < 40; i++) {939double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;940double w = start_w + (end_w - start_w) * (i / 40.0);941complexGaussianDist(data, base * (i + 1) * detune, w, a);942a *= a_step;943}944945946947SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);948SF2Layer layer = newLayer(sf2, "EPiano", sample);949SF2Region region = layer.getRegions().get(0);950region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);951region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);952region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);953region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);954region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);955region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);956region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);957region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);958region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);959return layer;960}961962public static SF2Layer new_epiano2(SF2Soundbank sf2) {963Random random = new Random(302030201);964int x = 8;965int fftsize = 4096 * x;966double[] data = new double[fftsize * 2];967double base = x * 25;968double start_w = 0.01;969double end_w = 0.05;970double start_a = 0.2;971double end_a = 0.00001;972double a = start_a;973double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);974for (int i = 0; i < 40; i++) {975double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;976double w = start_w + (end_w - start_w) * (i / 40.0);977complexGaussianDist(data, base * (i + 1) * detune, w, a);978a *= a_step;979}980981SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);982SF2Layer layer = newLayer(sf2, "EPiano", sample);983SF2Region region = layer.getRegions().get(0);984region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);985region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);986region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);987region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 8000);988region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);989region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 2400);990region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);991region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);992region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);993region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);994return layer;995}996997public static SF2Layer new_bass1(SF2Soundbank sf2) {998int x = 8;999int fftsize = 4096 * x;1000double[] data = new double[fftsize * 2];1001double base = x * 25;1002double start_w = 0.05;1003double end_w = 0.05;1004double start_a = 0.2;1005double end_a = 0.02;1006double a = start_a;1007double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);10081009double[] aa = new double[25];1010for (int i = 0; i < 25; i++) {1011aa[i] = a;1012a *= a_step;1013}10141015aa[0] *= 8;1016aa[1] *= 4;1017aa[3] *= 8;1018aa[5] *= 8;10191020for (int i = 0; i < 25; i++) {1021double w = start_w + (end_w - start_w) * (i / 40.0);1022complexGaussianDist(data, base * (i + 1), w, aa[i]);1023}102410251026SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);1027SF2Layer layer = newLayer(sf2, "Bass", sample);1028SF2Region region = layer.getRegions().get(0);1029region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1030region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);1031region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1032region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1033region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1034region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1035region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1036region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5000);1037region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 11000);1038region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1039return layer;1040}10411042public static SF2Layer new_synthbass(SF2Soundbank sf2) {1043int x = 8;1044int fftsize = 4096 * x;1045double[] data = new double[fftsize * 2];1046double base = x * 25;1047double start_w = 0.05;1048double end_w = 0.05;1049double start_a = 0.2;1050double end_a = 0.02;1051double a = start_a;1052double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);10531054double[] aa = new double[25];1055for (int i = 0; i < 25; i++) {1056aa[i] = a;1057a *= a_step;1058}10591060aa[0] *= 16;1061aa[1] *= 4;1062aa[3] *= 16;1063aa[5] *= 8;10641065for (int i = 0; i < 25; i++) {1066double w = start_w + (end_w - start_w) * (i / 40.0);1067complexGaussianDist(data, base * (i + 1), w, aa[i]);1068}106910701071SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);1072SF2Layer layer = newLayer(sf2, "Bass", sample);1073SF2Region region = layer.getRegions().get(0);1074region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1075region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);1076region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1077region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1078region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1079region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1080region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1081region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -3000);1082region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 100);1083region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);1084region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1085return layer;1086}10871088public static SF2Layer new_bass2(SF2Soundbank sf2) {1089int x = 8;1090int fftsize = 4096 * x;1091double[] data = new double[fftsize * 2];1092double base = x * 25;1093double start_w = 0.05;1094double end_w = 0.05;1095double start_a = 0.2;1096double end_a = 0.002;1097double a = start_a;1098double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);10991100double[] aa = new double[25];1101for (int i = 0; i < 25; i++) {1102aa[i] = a;1103a *= a_step;1104}11051106aa[0] *= 8;1107aa[1] *= 4;1108aa[3] *= 8;1109aa[5] *= 8;11101111for (int i = 0; i < 25; i++) {1112double w = start_w + (end_w - start_w) * (i / 40.0);1113complexGaussianDist(data, base * (i + 1), w, aa[i]);1114}111511161117SF2Sample sample = newSimpleFFTSample(sf2, "Bass2", data, base);1118SF2Layer layer = newLayer(sf2, "Bass2", sample);1119SF2Region region = layer.getRegions().get(0);1120region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1121region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);1122region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1123region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1124region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1125region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);1126region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1127region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 5000);1128region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1129return layer;1130}11311132public static SF2Layer new_solostring(SF2Soundbank sf2) {1133int x = 8;1134int fftsize = 4096 * x;1135double[] data = new double[fftsize * 2];1136double base = x * 25;1137double start_w = 2;1138double end_w = 2;1139double start_a = 0.2;1140double end_a = 0.01;11411142double[] aa = new double[18];1143double a = start_a;1144double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1145for (int i = 0; i < aa.length; i++) {1146a *= a_step;1147aa[i] = a;1148}11491150aa[0] *= 5;1151aa[1] *= 5;1152aa[2] *= 5;1153aa[3] *= 4;1154aa[4] *= 4;1155aa[5] *= 3;1156aa[6] *= 3;1157aa[7] *= 2;11581159for (int i = 0; i < aa.length; i++) {1160double w = start_w + (end_w - start_w) * (i / 40.0);1161complexGaussianDist(data, base * (i + 1), w, a);1162}1163SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);1164SF2Layer layer = newLayer(sf2, "Strings", sample);1165SF2Region region = layer.getRegions().get(0);1166region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1167region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1168region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);1169region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1170region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1171region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1172region.putInteger(SF2Region.GENERATOR_FREQVIBLFO, -1000);1173region.putInteger(SF2Region.GENERATOR_VIBLFOTOPITCH, 15);1174return layer;11751176}11771178public static SF2Layer new_orchhit(SF2Soundbank sf2) {1179int x = 8;1180int fftsize = 4096 * x;1181double[] data = new double[fftsize * 2];1182double base = x * 25;1183double start_w = 2;1184double end_w = 80;1185double start_a = 0.2;1186double end_a = 0.001;1187double a = start_a;1188double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1189for (int i = 0; i < 40; i++) {1190double w = start_w + (end_w - start_w) * (i / 40.0);1191complexGaussianDist(data, base * (i + 1), w, a);1192a *= a_step;1193}1194complexGaussianDist(data, base * 4, 300, 1);119511961197SF2Sample sample = newSimpleFFTSample(sf2, "Och Strings", data, base);1198SF2Layer layer = newLayer(sf2, "Och Strings", sample);1199SF2Region region = layer.getRegions().get(0);1200region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1201region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1202region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 200);1203region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 200);1204region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1205region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1206return layer;12071208}12091210public static SF2Layer new_string2(SF2Soundbank sf2) {1211int x = 8;1212int fftsize = 4096 * x;1213double[] data = new double[fftsize * 2];1214double base = x * 25;1215double start_w = 2;1216double end_w = 80;1217double start_a = 0.2;1218double end_a = 0.001;1219double a = start_a;1220double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1221for (int i = 0; i < 40; i++) {1222double w = start_w + (end_w - start_w) * (i / 40.0);1223complexGaussianDist(data, base * (i + 1), w, a);1224a *= a_step;1225}1226SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);1227SF2Layer layer = newLayer(sf2, "Strings", sample);1228SF2Region region = layer.getRegions().get(0);1229region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1230region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1231region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);1232region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1233region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1234region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1235return layer;12361237}12381239public static SF2Layer new_choir(SF2Soundbank sf2) {1240int x = 8;1241int fftsize = 4096 * x;1242double[] data = new double[fftsize * 2];1243double base = x * 25;1244double start_w = 2;1245double end_w = 80;1246double start_a = 0.2;1247double end_a = 0.001;1248double a = start_a;1249double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1250double[] aa = new double[40];1251for (int i = 0; i < aa.length; i++) {1252a *= a_step;1253aa[i] = a;1254}12551256aa[5] *= 0.1;1257aa[6] *= 0.01;1258aa[7] *= 0.1;1259aa[8] *= 0.1;12601261for (int i = 0; i < aa.length; i++) {1262double w = start_w + (end_w - start_w) * (i / 40.0);1263complexGaussianDist(data, base * (i + 1), w, aa[i]);1264}1265SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);1266SF2Layer layer = newLayer(sf2, "Strings", sample);1267SF2Region region = layer.getRegions().get(0);1268region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1269region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1270region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);1271region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1272region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1273region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1274return layer;12751276}12771278public static SF2Layer new_organ(SF2Soundbank sf2) {1279Random random = new Random(102030201);1280int x = 1;1281int fftsize = 4096 * x;1282double[] data = new double[fftsize * 2];1283double base = x * 15;1284double start_w = 0.01;1285double end_w = 0.01;1286double start_a = 0.2;1287double end_a = 0.001;1288double a = start_a;1289double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);12901291for (int i = 0; i < 12; i++) {1292double w = start_w + (end_w - start_w) * (i / 40.0);1293complexGaussianDist(data, base * (i + 1), w,1294a * (0.5 + 3 * (random.nextDouble())));1295a *= a_step;1296}1297SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);1298SF2Layer layer = newLayer(sf2, "Organ", sample);1299SF2Region region = layer.getRegions().get(0);1300region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1301region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1302region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1303region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1304region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1305region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1306return layer;13071308}13091310public static SF2Layer new_ch_organ(SF2Soundbank sf2) {1311int x = 1;1312int fftsize = 4096 * x;1313double[] data = new double[fftsize * 2];1314double base = x * 15;1315double start_w = 0.01;1316double end_w = 0.01;1317double start_a = 0.2;1318double end_a = 0.001;1319double a = start_a;1320double a_step = Math.pow(end_a / start_a, 1.0 / 60.0);13211322double[] aa = new double[60];1323for (int i = 0; i < aa.length; i++) {1324a *= a_step;1325aa[i] = a;1326}13271328aa[0] *= 5;1329aa[1] *= 2;1330aa[2] = 0;1331aa[4] = 0;1332aa[5] = 0;1333aa[7] *= 7;1334aa[9] = 0;1335aa[10] = 0;1336aa[12] = 0;1337aa[15] *= 7;1338aa[18] = 0;1339aa[20] = 0;1340aa[24] = 0;1341aa[27] *= 5;1342aa[29] = 0;1343aa[30] = 0;1344aa[33] = 0;1345aa[36] *= 4;1346aa[37] = 0;1347aa[39] = 0;1348aa[42] = 0;1349aa[43] = 0;1350aa[47] = 0;1351aa[50] *= 4;1352aa[52] = 0;1353aa[55] = 0;1354aa[57] = 0;135513561357aa[10] *= 0.1;1358aa[11] *= 0.1;1359aa[12] *= 0.1;1360aa[13] *= 0.1;13611362aa[17] *= 0.1;1363aa[18] *= 0.1;1364aa[19] *= 0.1;1365aa[20] *= 0.1;13661367for (int i = 0; i < 60; i++) {1368double w = start_w + (end_w - start_w) * (i / 40.0);1369complexGaussianDist(data, base * (i + 1), w, aa[i]);1370a *= a_step;1371}1372SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);1373SF2Layer layer = newLayer(sf2, "Organ", sample);1374SF2Region region = layer.getRegions().get(0);1375region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1376region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);1377region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1378return layer;13791380}13811382public static SF2Layer new_flute(SF2Soundbank sf2) {1383int x = 8;1384int fftsize = 4096 * x;1385double[] data = new double[fftsize * 2];1386double base = x * 15;13871388complexGaussianDist(data, base * 1, 0.001, 0.5);1389complexGaussianDist(data, base * 2, 0.001, 0.5);1390complexGaussianDist(data, base * 3, 0.001, 0.5);1391complexGaussianDist(data, base * 4, 0.01, 0.5);13921393complexGaussianDist(data, base * 4, 100, 120);1394complexGaussianDist(data, base * 6, 100, 40);1395complexGaussianDist(data, base * 8, 100, 80);13961397complexGaussianDist(data, base * 5, 0.001, 0.05);1398complexGaussianDist(data, base * 6, 0.001, 0.06);1399complexGaussianDist(data, base * 7, 0.001, 0.04);1400complexGaussianDist(data, base * 8, 0.005, 0.06);1401complexGaussianDist(data, base * 9, 0.005, 0.06);1402complexGaussianDist(data, base * 10, 0.01, 0.1);1403complexGaussianDist(data, base * 11, 0.08, 0.7);1404complexGaussianDist(data, base * 12, 0.08, 0.6);1405complexGaussianDist(data, base * 13, 0.08, 0.6);1406complexGaussianDist(data, base * 14, 0.08, 0.6);1407complexGaussianDist(data, base * 15, 0.08, 0.5);1408complexGaussianDist(data, base * 16, 0.08, 0.5);1409complexGaussianDist(data, base * 17, 0.08, 0.2);141014111412complexGaussianDist(data, base * 1, 10, 8);1413complexGaussianDist(data, base * 2, 10, 8);1414complexGaussianDist(data, base * 3, 10, 8);1415complexGaussianDist(data, base * 4, 10, 8);1416complexGaussianDist(data, base * 5, 10, 8);1417complexGaussianDist(data, base * 6, 20, 9);1418complexGaussianDist(data, base * 7, 20, 9);1419complexGaussianDist(data, base * 8, 20, 9);1420complexGaussianDist(data, base * 9, 20, 8);1421complexGaussianDist(data, base * 10, 30, 8);1422complexGaussianDist(data, base * 11, 30, 9);1423complexGaussianDist(data, base * 12, 30, 9);1424complexGaussianDist(data, base * 13, 30, 8);1425complexGaussianDist(data, base * 14, 30, 8);1426complexGaussianDist(data, base * 15, 30, 7);1427complexGaussianDist(data, base * 16, 30, 7);1428complexGaussianDist(data, base * 17, 30, 6);14291430SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);1431SF2Layer layer = newLayer(sf2, "Flute", sample);1432SF2Region region = layer.getRegions().get(0);1433region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1434region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1435region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1436region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1437region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1438region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1439return layer;14401441}14421443public static SF2Layer new_horn(SF2Soundbank sf2) {1444int x = 8;1445int fftsize = 4096 * x;1446double[] data = new double[fftsize * 2];1447double base = x * 15;14481449double start_a = 0.5;1450double end_a = 0.00000000001;1451double a = start_a;1452double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1453for (int i = 0; i < 40; i++) {1454if (i == 0)1455complexGaussianDist(data, base * (i + 1), 0.1, a * 0.2);1456else1457complexGaussianDist(data, base * (i + 1), 0.1, a);1458a *= a_step;1459}14601461complexGaussianDist(data, base * 2, 100, 1);146214631464SF2Sample sample = newSimpleFFTSample(sf2, "Horn", data, base);1465SF2Layer layer = newLayer(sf2, "Horn", sample);1466SF2Region region = layer.getRegions().get(0);1467region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1468region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1469region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1470region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1471region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);14721473region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -500);1474region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1475region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1476region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1477return layer;14781479}14801481public static SF2Layer new_trumpet(SF2Soundbank sf2) {1482int x = 8;1483int fftsize = 4096 * x;1484double[] data = new double[fftsize * 2];1485double base = x * 15;14861487double start_a = 0.5;1488double end_a = 0.00001;1489double a = start_a;1490double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);1491double[] aa = new double[80];1492for (int i = 0; i < 80; i++) {1493aa[i] = a;1494a *= a_step;1495}14961497aa[0] *= 0.05;1498aa[1] *= 0.2;1499aa[2] *= 0.5;1500aa[3] *= 0.85;15011502for (int i = 0; i < 80; i++) {1503complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);1504}15051506complexGaussianDist(data, base * 5, 300, 3);150715081509SF2Sample sample = newSimpleFFTSample(sf2, "Trumpet", data, base);1510SF2Layer layer = newLayer(sf2, "Trumpet", sample);1511SF2Region region = layer.getRegions().get(0);1512region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1513region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);1514region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1515region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1516region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);15171518region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -4000);1519region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, -2500);1520region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1521region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1522region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);1523return layer;15241525}15261527public static SF2Layer new_brass_section(SF2Soundbank sf2) {1528int x = 8;1529int fftsize = 4096 * x;1530double[] data = new double[fftsize * 2];1531double base = x * 15;15321533double start_a = 0.5;1534double end_a = 0.005;1535double a = start_a;1536double a_step = Math.pow(end_a / start_a, 1.0 / 30.0);1537double[] aa = new double[30];1538for (int i = 0; i < 30; i++) {1539aa[i] = a;1540a *= a_step;1541}15421543aa[0] *= 0.8;1544aa[1] *= 0.9;15451546double w = 5;1547for (int i = 0; i < 30; i++) {1548complexGaussianDist(data, base * (i + 1), 0.1 * w, aa[i] * w);1549w += 6; //*= w_step;1550}15511552complexGaussianDist(data, base * 6, 300, 2);155315541555SF2Sample sample = newSimpleFFTSample(sf2, "Brass Section", data, base);1556SF2Layer layer = newLayer(sf2, "Brass Section", sample);1557SF2Region region = layer.getRegions().get(0);1558region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1559region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -9200);1560region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1561region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1562region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);15631564region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1565region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1566region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1567region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1568return layer;15691570}15711572public static SF2Layer new_trombone(SF2Soundbank sf2) {1573int x = 8;1574int fftsize = 4096 * x;1575double[] data = new double[fftsize * 2];1576double base = x * 15;15771578double start_a = 0.5;1579double end_a = 0.001;1580double a = start_a;1581double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);1582double[] aa = new double[80];1583for (int i = 0; i < 80; i++) {1584aa[i] = a;1585a *= a_step;1586}15871588aa[0] *= 0.3;1589aa[1] *= 0.7;15901591for (int i = 0; i < 80; i++) {1592complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);1593}15941595complexGaussianDist(data, base * 6, 300, 2);159615971598SF2Sample sample = newSimpleFFTSample(sf2, "Trombone", data, base);1599SF2Layer layer = newLayer(sf2, "Trombone", sample);1600SF2Region region = layer.getRegions().get(0);1601region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1602region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);1603region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1604region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1605region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);16061607region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -2000);1608region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1609region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1610region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1611region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);1612return layer;16131614}16151616public static SF2Layer new_sax(SF2Soundbank sf2) {1617int x = 8;1618int fftsize = 4096 * x;1619double[] data = new double[fftsize * 2];1620double base = x * 15;16211622double start_a = 0.5;1623double end_a = 0.01;1624double a = start_a;1625double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1626for (int i = 0; i < 40; i++) {1627if (i == 0 || i == 2)1628complexGaussianDist(data, base * (i + 1), 0.1, a * 4);1629else1630complexGaussianDist(data, base * (i + 1), 0.1, a);1631a *= a_step;1632}16331634complexGaussianDist(data, base * 4, 200, 1);16351636SF2Sample sample = newSimpleFFTSample(sf2, "Sax", data, base);1637SF2Layer layer = newLayer(sf2, "Sax", sample);1638SF2Region region = layer.getRegions().get(0);1639region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1640region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1641region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1642region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1643region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);16441645region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1646region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1647region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1648region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1649return layer;16501651}16521653public static SF2Layer new_oboe(SF2Soundbank sf2) {1654int x = 8;1655int fftsize = 4096 * x;1656double[] data = new double[fftsize * 2];1657double base = x * 15;16581659complexGaussianDist(data, base * 5, 100, 80);166016611662complexGaussianDist(data, base * 1, 0.01, 0.53);1663complexGaussianDist(data, base * 2, 0.01, 0.51);1664complexGaussianDist(data, base * 3, 0.01, 0.48);1665complexGaussianDist(data, base * 4, 0.01, 0.49);1666complexGaussianDist(data, base * 5, 0.01, 5);1667complexGaussianDist(data, base * 6, 0.01, 0.51);1668complexGaussianDist(data, base * 7, 0.01, 0.50);1669complexGaussianDist(data, base * 8, 0.01, 0.59);1670complexGaussianDist(data, base * 9, 0.01, 0.61);1671complexGaussianDist(data, base * 10, 0.01, 0.52);1672complexGaussianDist(data, base * 11, 0.01, 0.49);1673complexGaussianDist(data, base * 12, 0.01, 0.51);1674complexGaussianDist(data, base * 13, 0.01, 0.48);1675complexGaussianDist(data, base * 14, 0.01, 0.51);1676complexGaussianDist(data, base * 15, 0.01, 0.46);1677complexGaussianDist(data, base * 16, 0.01, 0.35);1678complexGaussianDist(data, base * 17, 0.01, 0.20);1679complexGaussianDist(data, base * 18, 0.01, 0.10);1680complexGaussianDist(data, base * 19, 0.01, 0.5);1681complexGaussianDist(data, base * 20, 0.01, 0.1);168216831684SF2Sample sample = newSimpleFFTSample(sf2, "Oboe", data, base);1685SF2Layer layer = newLayer(sf2, "Oboe", sample);1686SF2Region region = layer.getRegions().get(0);1687region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1688region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1689region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1690region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1691region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1692region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1693return layer;16941695}16961697public static SF2Layer new_bassoon(SF2Soundbank sf2) {1698int x = 8;1699int fftsize = 4096 * x;1700double[] data = new double[fftsize * 2];1701double base = x * 15;17021703complexGaussianDist(data, base * 2, 100, 40);1704complexGaussianDist(data, base * 4, 100, 20);17051706complexGaussianDist(data, base * 1, 0.01, 0.53);1707complexGaussianDist(data, base * 2, 0.01, 5);1708complexGaussianDist(data, base * 3, 0.01, 0.51);1709complexGaussianDist(data, base * 4, 0.01, 0.48);1710complexGaussianDist(data, base * 5, 0.01, 1.49);1711complexGaussianDist(data, base * 6, 0.01, 0.51);1712complexGaussianDist(data, base * 7, 0.01, 0.50);1713complexGaussianDist(data, base * 8, 0.01, 0.59);1714complexGaussianDist(data, base * 9, 0.01, 0.61);1715complexGaussianDist(data, base * 10, 0.01, 0.52);1716complexGaussianDist(data, base * 11, 0.01, 0.49);1717complexGaussianDist(data, base * 12, 0.01, 0.51);1718complexGaussianDist(data, base * 13, 0.01, 0.48);1719complexGaussianDist(data, base * 14, 0.01, 0.51);1720complexGaussianDist(data, base * 15, 0.01, 0.46);1721complexGaussianDist(data, base * 16, 0.01, 0.35);1722complexGaussianDist(data, base * 17, 0.01, 0.20);1723complexGaussianDist(data, base * 18, 0.01, 0.10);1724complexGaussianDist(data, base * 19, 0.01, 0.5);1725complexGaussianDist(data, base * 20, 0.01, 0.1);172617271728SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);1729SF2Layer layer = newLayer(sf2, "Flute", sample);1730SF2Region region = layer.getRegions().get(0);1731region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1732region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1733region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1734region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1735region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1736region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1737return layer;17381739}17401741public static SF2Layer new_clarinet(SF2Soundbank sf2) {1742int x = 8;1743int fftsize = 4096 * x;1744double[] data = new double[fftsize * 2];1745double base = x * 15;17461747complexGaussianDist(data, base * 1, 0.001, 0.5);1748complexGaussianDist(data, base * 2, 0.001, 0.02);1749complexGaussianDist(data, base * 3, 0.001, 0.2);1750complexGaussianDist(data, base * 4, 0.01, 0.1);17511752complexGaussianDist(data, base * 4, 100, 60);1753complexGaussianDist(data, base * 6, 100, 20);1754complexGaussianDist(data, base * 8, 100, 20);17551756complexGaussianDist(data, base * 5, 0.001, 0.1);1757complexGaussianDist(data, base * 6, 0.001, 0.09);1758complexGaussianDist(data, base * 7, 0.001, 0.02);1759complexGaussianDist(data, base * 8, 0.005, 0.16);1760complexGaussianDist(data, base * 9, 0.005, 0.96);1761complexGaussianDist(data, base * 10, 0.01, 0.9);1762complexGaussianDist(data, base * 11, 0.08, 1.2);1763complexGaussianDist(data, base * 12, 0.08, 1.8);1764complexGaussianDist(data, base * 13, 0.08, 1.6);1765complexGaussianDist(data, base * 14, 0.08, 1.2);1766complexGaussianDist(data, base * 15, 0.08, 0.9);1767complexGaussianDist(data, base * 16, 0.08, 0.5);1768complexGaussianDist(data, base * 17, 0.08, 0.2);176917701771complexGaussianDist(data, base * 1, 10, 8);1772complexGaussianDist(data, base * 2, 10, 8);1773complexGaussianDist(data, base * 3, 10, 8);1774complexGaussianDist(data, base * 4, 10, 8);1775complexGaussianDist(data, base * 5, 10, 8);1776complexGaussianDist(data, base * 6, 20, 9);1777complexGaussianDist(data, base * 7, 20, 9);1778complexGaussianDist(data, base * 8, 20, 9);1779complexGaussianDist(data, base * 9, 20, 8);1780complexGaussianDist(data, base * 10, 30, 8);1781complexGaussianDist(data, base * 11, 30, 9);1782complexGaussianDist(data, base * 12, 30, 9);1783complexGaussianDist(data, base * 13, 30, 8);1784complexGaussianDist(data, base * 14, 30, 8);1785complexGaussianDist(data, base * 15, 30, 7);1786complexGaussianDist(data, base * 16, 30, 7);1787complexGaussianDist(data, base * 17, 30, 6);17881789SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base);1790SF2Layer layer = newLayer(sf2, "Clarinet", sample);1791SF2Region region = layer.getRegions().get(0);1792region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1793region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1794region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1795region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1796region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1797region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1798return layer;17991800}18011802public static SF2Layer new_timpani(SF2Soundbank sf2) {18031804double datab[];1805double datah[];18061807// Make Bass Part1808{1809int fftlen = 4096 * 8;1810double[] data = new double[2 * fftlen];1811double base = 48;1812complexGaussianDist(data, base * 2, 0.2, 1);1813complexGaussianDist(data, base * 3, 0.2, 0.7);1814complexGaussianDist(data, base * 5, 10, 1);1815complexGaussianDist(data, base * 6, 9, 1);1816complexGaussianDist(data, base * 8, 15, 1);1817complexGaussianDist(data, base * 9, 18, 0.8);1818complexGaussianDist(data, base * 11, 21, 0.5);1819complexGaussianDist(data, base * 13, 28, 0.3);1820complexGaussianDist(data, base * 14, 22, 0.1);1821randomPhase(data, new Random(3049912));1822ifft(data);1823normalize(data, 0.5);1824data = realPart(data);18251826double d_len = data.length;1827for (int i = 0; i < data.length; i++) {1828double g = (1.0 - (i / d_len));1829data[i] *= g * g;1830}1831fadeUp(data, 40);1832datab = data;1833}18341835// Make treble part1836{1837int fftlen = 4096 * 4;1838double[] data = new double[2 * fftlen];1839Random random = new Random(3049912);1840for (int i = 0; i < data.length; i += 2) {1841data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;1842}1843fft(data);1844// Remove all negative frequency1845for (int i = fftlen / 2; i < data.length; i++)1846data[i] = 0;1847for (int i = 1024 * 4; i < 2048 * 4; i++)1848data[i] = 1.0 - (i - 4096) / 4096.0;1849for (int i = 0; i < 300; i++) {1850double g = (1.0 - (i / 300.0));1851data[i] *= 1.0 + 20 * g * g;1852}1853for (int i = 0; i < 24; i++)1854data[i] = 0;1855randomPhase(data, new Random(3049912));1856ifft(data);1857normalize(data, 0.9);1858data = realPart(data);1859double gain = 1.0;1860for (int i = 0; i < data.length; i++) {1861data[i] *= gain;1862gain *= 0.9998;1863}1864datah = data;1865}18661867for (int i = 0; i < datah.length; i++)1868datab[i] += datah[i] * 0.02;18691870normalize(datab, 0.9);18711872SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab);18731874SF2Layer layer = new SF2Layer(sf2);1875layer.setName("Timpani");18761877SF2GlobalRegion global = new SF2GlobalRegion();1878layer.setGlobalZone(global);1879sf2.addResource(layer);18801881SF2LayerRegion region = new SF2LayerRegion();1882region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);1883region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1884region.setSample(sample);1885layer.getRegions().add(region);18861887return layer;1888}18891890public static SF2Layer new_melodic_toms(SF2Soundbank sf2) {18911892double datab[];1893double datah[];18941895// Make Bass Part1896{1897int fftlen = 4096 * 4;1898double[] data = new double[2 * fftlen];1899complexGaussianDist(data, 30, 0.5, 1);1900randomPhase(data, new Random(3049912));1901ifft(data);1902normalize(data, 0.8);1903data = realPart(data);19041905double d_len = data.length;1906for (int i = 0; i < data.length; i++)1907data[i] *= (1.0 - (i / d_len));1908datab = data;1909}19101911// Make treble part1912{1913int fftlen = 4096 * 4;1914double[] data = new double[2 * fftlen];1915Random random = new Random(3049912);1916for (int i = 0; i < data.length; i += 2)1917data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;1918fft(data);1919// Remove all negative frequency1920for (int i = fftlen / 2; i < data.length; i++)1921data[i] = 0;1922for (int i = 1024 * 4; i < 2048 * 4; i++)1923data[i] = 1.0 - (i - 4096) / 4096.0;1924for (int i = 0; i < 200; i++) {1925double g = (1.0 - (i / 200.0));1926data[i] *= 1.0 + 20 * g * g;1927}1928for (int i = 0; i < 30; i++)1929data[i] = 0;1930randomPhase(data, new Random(3049912));1931ifft(data);1932normalize(data, 0.9);1933data = realPart(data);1934double gain = 1.0;1935for (int i = 0; i < data.length; i++) {1936data[i] *= gain;1937gain *= 0.9996;1938}1939datah = data;1940}19411942for (int i = 0; i < datah.length; i++)1943datab[i] += datah[i] * 0.5;1944for (int i = 0; i < 5; i++)1945datab[i] *= i / 5.0;19461947normalize(datab, 0.99);19481949SF2Sample sample = newSimpleDrumSample(sf2, "Melodic Toms", datab);1950sample.setOriginalPitch(63);19511952SF2Layer layer = new SF2Layer(sf2);1953layer.setName("Melodic Toms");19541955SF2GlobalRegion global = new SF2GlobalRegion();1956layer.setGlobalZone(global);1957sf2.addResource(layer);19581959SF2LayerRegion region = new SF2LayerRegion();1960region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);1961//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);1962region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1963region.setSample(sample);1964layer.getRegions().add(region);19651966return layer;1967}19681969public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) {1970double datah[];1971{1972int fftlen = 4096 * 4;1973double[] data = new double[2 * fftlen];1974Random random = new Random(3049912);1975for (int i = 0; i < data.length; i += 2)1976data[i] = (2.0 * (random.nextDouble() - 0.5));1977for (int i = fftlen / 2; i < data.length; i++)1978data[i] = 0;1979for (int i = 0; i < 100; i++)1980data[i] = 0;19811982for (int i = 0; i < 512 * 2; i++) {1983double gain = (i / (512.0 * 2.0));1984data[i] = 1 - gain;1985}1986datah = data;1987}19881989SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal",1990datah, 100, 20);19911992SF2Layer layer = new SF2Layer(sf2);1993layer.setName("Reverse Cymbal");19941995SF2GlobalRegion global = new SF2GlobalRegion();1996layer.setGlobalZone(global);1997sf2.addResource(layer);19981999SF2LayerRegion region = new SF2LayerRegion();2000region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200);2001region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000);2002region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);2003region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);2004region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);2005region.setSample(sample);2006layer.getRegions().add(region);20072008return layer;2009}20102011public static SF2Layer new_snare_drum(SF2Soundbank sf2) {20122013double datab[];2014double datah[];20152016// Make Bass Part2017{2018int fftlen = 4096 * 4;2019double[] data = new double[2 * fftlen];2020complexGaussianDist(data, 24, 0.5, 1);2021randomPhase(data, new Random(3049912));2022ifft(data);2023normalize(data, 0.5);2024data = realPart(data);20252026double d_len = data.length;2027for (int i = 0; i < data.length; i++)2028data[i] *= (1.0 - (i / d_len));2029datab = data;2030}20312032// Make treble part2033{2034int fftlen = 4096 * 4;2035double[] data = new double[2 * fftlen];2036Random random = new Random(3049912);2037for (int i = 0; i < data.length; i += 2)2038data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2039fft(data);2040// Remove all negative frequency2041for (int i = fftlen / 2; i < data.length; i++)2042data[i] = 0;2043for (int i = 1024 * 4; i < 2048 * 4; i++)2044data[i] = 1.0 - (i - 4096) / 4096.0;2045for (int i = 0; i < 300; i++) {2046double g = (1.0 - (i / 300.0));2047data[i] *= 1.0 + 20 * g * g;2048}2049for (int i = 0; i < 24; i++)2050data[i] = 0;2051randomPhase(data, new Random(3049912));2052ifft(data);2053normalize(data, 0.9);2054data = realPart(data);2055double gain = 1.0;2056for (int i = 0; i < data.length; i++) {2057data[i] *= gain;2058gain *= 0.9998;2059}2060datah = data;2061}20622063for (int i = 0; i < datah.length; i++)2064datab[i] += datah[i];2065for (int i = 0; i < 5; i++)2066datab[i] *= i / 5.0;20672068SF2Sample sample = newSimpleDrumSample(sf2, "Snare Drum", datab);20692070SF2Layer layer = new SF2Layer(sf2);2071layer.setName("Snare Drum");20722073SF2GlobalRegion global = new SF2GlobalRegion();2074layer.setGlobalZone(global);2075sf2.addResource(layer);20762077SF2LayerRegion region = new SF2LayerRegion();2078region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2079region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2080region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);2081region.setSample(sample);2082layer.getRegions().add(region);20832084return layer;2085}20862087public static SF2Layer new_bass_drum(SF2Soundbank sf2) {20882089double datab[];2090double datah[];20912092// Make Bass Part2093{2094int fftlen = 4096 * 4;2095double[] data = new double[2 * fftlen];2096complexGaussianDist(data, 1.8 * 5 + 1, 2, 1);2097complexGaussianDist(data, 1.8 * 9 + 1, 2, 1);2098randomPhase(data, new Random(3049912));2099ifft(data);2100normalize(data, 0.9);2101data = realPart(data);2102double d_len = data.length;2103for (int i = 0; i < data.length; i++)2104data[i] *= (1.0 - (i / d_len));2105datab = data;2106}21072108// Make treble part2109{2110int fftlen = 4096;2111double[] data = new double[2 * fftlen];2112Random random = new Random(3049912);2113for (int i = 0; i < data.length; i += 2)2114data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2115fft(data);2116// Remove all negative frequency2117for (int i = fftlen / 2; i < data.length; i++)2118data[i] = 0;2119for (int i = 1024; i < 2048; i++)2120data[i] = 1.0 - (i - 1024) / 1024.0;2121for (int i = 0; i < 512; i++)2122data[i] = 10 * i / 512.0;2123for (int i = 0; i < 10; i++)2124data[i] = 0;2125randomPhase(data, new Random(3049912));2126ifft(data);2127normalize(data, 0.9);2128data = realPart(data);2129double gain = 1.0;2130for (int i = 0; i < data.length; i++) {2131data[i] *= gain;2132gain *= 0.999;2133}2134datah = data;2135}21362137for (int i = 0; i < datah.length; i++)2138datab[i] += datah[i] * 0.5;2139for (int i = 0; i < 5; i++)2140datab[i] *= i / 5.0;21412142SF2Sample sample = newSimpleDrumSample(sf2, "Bass Drum", datab);21432144SF2Layer layer = new SF2Layer(sf2);2145layer.setName("Bass Drum");21462147SF2GlobalRegion global = new SF2GlobalRegion();2148layer.setGlobalZone(global);2149sf2.addResource(layer);21502151SF2LayerRegion region = new SF2LayerRegion();2152region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2153region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2154region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);2155region.setSample(sample);2156layer.getRegions().add(region);21572158return layer;2159}21602161public static SF2Layer new_tom(SF2Soundbank sf2) {21622163double datab[];2164double datah[];21652166// Make Bass Part2167{2168int fftlen = 4096 * 4;2169double[] data = new double[2 * fftlen];2170complexGaussianDist(data, 30, 0.5, 1);2171randomPhase(data, new Random(3049912));2172ifft(data);2173normalize(data, 0.8);2174data = realPart(data);21752176double d_len = data.length;2177for (int i = 0; i < data.length; i++)2178data[i] *= (1.0 - (i / d_len));2179datab = data;2180}21812182// Make treble part2183{2184int fftlen = 4096 * 4;2185double[] data = new double[2 * fftlen];2186Random random = new Random(3049912);2187for (int i = 0; i < data.length; i += 2)2188data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2189fft(data);2190// Remove all negative frequency2191for (int i = fftlen / 2; i < data.length; i++)2192data[i] = 0;2193for (int i = 1024 * 4; i < 2048 * 4; i++)2194data[i] = 1.0 - (i - 4096) / 4096.0;2195for (int i = 0; i < 200; i++) {2196double g = (1.0 - (i / 200.0));2197data[i] *= 1.0 + 20 * g * g;2198}2199for (int i = 0; i < 30; i++)2200data[i] = 0;2201randomPhase(data, new Random(3049912));2202ifft(data);2203normalize(data, 0.9);2204data = realPart(data);2205double gain = 1.0;2206for (int i = 0; i < data.length; i++) {2207data[i] *= gain;2208gain *= 0.9996;2209}2210datah = data;2211}22122213for (int i = 0; i < datah.length; i++)2214datab[i] += datah[i] * 0.5;2215for (int i = 0; i < 5; i++)2216datab[i] *= i / 5.0;22172218normalize(datab, 0.99);22192220SF2Sample sample = newSimpleDrumSample(sf2, "Tom", datab);2221sample.setOriginalPitch(50);22222223SF2Layer layer = new SF2Layer(sf2);2224layer.setName("Tom");22252226SF2GlobalRegion global = new SF2GlobalRegion();2227layer.setGlobalZone(global);2228sf2.addResource(layer);22292230SF2LayerRegion region = new SF2LayerRegion();2231region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2232//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2233region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);2234region.setSample(sample);2235layer.getRegions().add(region);22362237return layer;2238}22392240public static SF2Layer new_closed_hihat(SF2Soundbank sf2) {2241double datah[];22422243// Make treble part2244{2245int fftlen = 4096 * 4;2246double[] data = new double[2 * fftlen];2247Random random = new Random(3049912);2248for (int i = 0; i < data.length; i += 2)2249data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2250fft(data);2251// Remove all negative frequency2252for (int i = fftlen / 2; i < data.length; i++)2253data[i] = 0;2254for (int i = 1024 * 4; i < 2048 * 4; i++)2255data[i] = 1.0 - (i - 4096) / 4096.0;2256for (int i = 0; i < 2048; i++)2257data[i] = 0.2 + 0.8 * (i / 2048.0);2258randomPhase(data, new Random(3049912));2259ifft(data);2260normalize(data, 0.9);2261data = realPart(data);2262double gain = 1.0;2263for (int i = 0; i < data.length; i++) {2264data[i] *= gain;2265gain *= 0.9996;2266}2267datah = data;2268}22692270for (int i = 0; i < 5; i++)2271datah[i] *= i / 5.0;2272SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah);22732274SF2Layer layer = new SF2Layer(sf2);2275layer.setName("Closed Hi-Hat");22762277SF2GlobalRegion global = new SF2GlobalRegion();2278layer.setGlobalZone(global);2279sf2.addResource(layer);22802281SF2LayerRegion region = new SF2LayerRegion();2282region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2283region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2284region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);2285region.setSample(sample);2286layer.getRegions().add(region);22872288return layer;2289}22902291public static SF2Layer new_open_hihat(SF2Soundbank sf2) {2292double datah[];2293{2294int fftlen = 4096 * 4;2295double[] data = new double[2 * fftlen];2296Random random = new Random(3049912);2297for (int i = 0; i < data.length; i += 2)2298data[i] = (2.0 * (random.nextDouble() - 0.5));2299for (int i = fftlen / 2; i < data.length; i++)2300data[i] = 0;2301for (int i = 0; i < 200; i++)2302data[i] = 0;2303for (int i = 0; i < 2048 * 4; i++) {2304double gain = (i / (2048.0 * 4.0));2305data[i] = gain;2306}2307datah = data;2308}23092310SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5);23112312SF2Layer layer = new SF2Layer(sf2);2313layer.setName("Open Hi-Hat");23142315SF2GlobalRegion global = new SF2GlobalRegion();2316layer.setGlobalZone(global);2317sf2.addResource(layer);23182319SF2LayerRegion region = new SF2LayerRegion();2320region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500);2321region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);2322region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500);2323region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);2324region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2325region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);2326region.setSample(sample);2327layer.getRegions().add(region);23282329return layer;2330}23312332public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) {2333double datah[];2334{2335int fftlen = 4096 * 4;2336double[] data = new double[2 * fftlen];2337Random random = new Random(3049912);2338for (int i = 0; i < data.length; i += 2)2339data[i] = (2.0 * (random.nextDouble() - 0.5));2340for (int i = fftlen / 2; i < data.length; i++)2341data[i] = 0;2342for (int i = 0; i < 100; i++)2343data[i] = 0;2344for (int i = 0; i < 512 * 2; i++) {2345double gain = (i / (512.0 * 2.0));2346data[i] = gain;2347}2348datah = data;2349}23502351SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5);23522353SF2Layer layer = new SF2Layer(sf2);2354layer.setName("Crash Cymbal");23552356SF2GlobalRegion global = new SF2GlobalRegion();2357layer.setGlobalZone(global);2358sf2.addResource(layer);23592360SF2LayerRegion region = new SF2LayerRegion();2361region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800);2362region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);2363region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800);2364region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);2365region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2366region.setSample(sample);2367layer.getRegions().add(region);23682369return layer;2370}23712372public static SF2Layer new_side_stick(SF2Soundbank sf2) {2373double datab[];23742375// Make treble part2376{2377int fftlen = 4096 * 4;2378double[] data = new double[2 * fftlen];2379Random random = new Random(3049912);2380for (int i = 0; i < data.length; i += 2)2381data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2382fft(data);2383// Remove all negative frequency2384for (int i = fftlen / 2; i < data.length; i++)2385data[i] = 0;2386for (int i = 1024 * 4; i < 2048 * 4; i++)2387data[i] = 1.0 - (i - 4096) / 4096.0;2388for (int i = 0; i < 200; i++) {2389double g = (1.0 - (i / 200.0));2390data[i] *= 1.0 + 20 * g * g;2391}2392for (int i = 0; i < 30; i++)2393data[i] = 0;2394randomPhase(data, new Random(3049912));2395ifft(data);2396normalize(data, 0.9);2397data = realPart(data);2398double gain = 1.0;2399for (int i = 0; i < data.length; i++) {2400data[i] *= gain;2401gain *= 0.9996;2402}2403datab = data;2404}24052406for (int i = 0; i < 10; i++)2407datab[i] *= i / 10.0;24082409SF2Sample sample = newSimpleDrumSample(sf2, "Side Stick", datab);24102411SF2Layer layer = new SF2Layer(sf2);2412layer.setName("Side Stick");24132414SF2GlobalRegion global = new SF2GlobalRegion();2415layer.setGlobalZone(global);2416sf2.addResource(layer);24172418SF2LayerRegion region = new SF2LayerRegion();2419region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2420region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2421region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -50);2422region.setSample(sample);2423layer.getRegions().add(region);24242425return layer;24262427}24282429public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,2430double[] data, double base) {2431return newSimpleFFTSample(sf2, name, data, base, 10);2432}24332434public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,2435double[] data, double base, int fadeuptime) {24362437int fftsize = data.length / 2;2438AudioFormat format = new AudioFormat(44100, 16, 1, true, false);2439double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;24402441randomPhase(data);2442ifft(data);2443data = realPart(data);2444normalize(data, 0.9);2445float[] fdata = toFloat(data);2446fdata = loopExtend(fdata, fdata.length + 512);2447fadeUp(fdata, fadeuptime);2448byte[] bdata = toBytes(fdata, format);24492450/*2451* Create SoundFont2 sample.2452*/2453SF2Sample sample = new SF2Sample(sf2);2454sample.setName(name);2455sample.setData(bdata);2456sample.setStartLoop(256);2457sample.setEndLoop(fftsize + 256);2458sample.setSampleRate((long) format.getSampleRate());2459double orgnote = (69 + 12)2460+ (12 * Math.log(basefreq / 440.0) / Math.log(2));2461sample.setOriginalPitch((int) orgnote);2462sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));2463sf2.addResource(sample);24642465return sample;2466}24672468public static SF2Sample newSimpleFFTSample_dist(SF2Soundbank sf2,2469String name, double[] data, double base, double preamp) {24702471int fftsize = data.length / 2;2472AudioFormat format = new AudioFormat(44100, 16, 1, true, false);2473double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;24742475randomPhase(data);2476ifft(data);2477data = realPart(data);24782479for (int i = 0; i < data.length; i++) {2480data[i] = (1 - Math.exp(-Math.abs(data[i] * preamp)))2481* Math.signum(data[i]);2482}24832484normalize(data, 0.9);2485float[] fdata = toFloat(data);2486fdata = loopExtend(fdata, fdata.length + 512);2487fadeUp(fdata, 80);2488byte[] bdata = toBytes(fdata, format);24892490/*2491* Create SoundFont2 sample.2492*/2493SF2Sample sample = new SF2Sample(sf2);2494sample.setName(name);2495sample.setData(bdata);2496sample.setStartLoop(256);2497sample.setEndLoop(fftsize + 256);2498sample.setSampleRate((long) format.getSampleRate());2499double orgnote = (69 + 12)2500+ (12 * Math.log(basefreq / 440.0) / Math.log(2));2501sample.setOriginalPitch((int) orgnote);2502sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));2503sf2.addResource(sample);25042505return sample;2506}25072508public static SF2Sample newSimpleDrumSample(SF2Soundbank sf2, String name,2509double[] data) {25102511int fftsize = data.length;2512AudioFormat format = new AudioFormat(44100, 16, 1, true, false);25132514byte[] bdata = toBytes(toFloat(realPart(data)), format);25152516/*2517* Create SoundFont2 sample.2518*/2519SF2Sample sample = new SF2Sample(sf2);2520sample.setName(name);2521sample.setData(bdata);2522sample.setStartLoop(256);2523sample.setEndLoop(fftsize + 256);2524sample.setSampleRate((long) format.getSampleRate());2525sample.setOriginalPitch(60);2526sf2.addResource(sample);25272528return sample;2529}25302531public static SF2Layer newLayer(SF2Soundbank sf2, String name, SF2Sample sample) {2532SF2LayerRegion region = new SF2LayerRegion();2533region.setSample(sample);25342535SF2Layer layer = new SF2Layer(sf2);2536layer.setName(name);2537layer.getRegions().add(region);2538sf2.addResource(layer);25392540return layer;2541}25422543public static SF2Instrument newInstrument(SF2Soundbank sf2, String name,2544Patch patch, SF2Layer... layers) {25452546/*2547* Create SoundFont2 instrument.2548*/2549SF2Instrument ins = new SF2Instrument(sf2);2550ins.setPatch(patch);2551ins.setName(name);2552sf2.addInstrument(ins);25532554/*2555* Create region for instrument.2556*/2557for (int i = 0; i < layers.length; i++) {2558SF2InstrumentRegion insregion = new SF2InstrumentRegion();2559insregion.setLayer(layers[i]);2560ins.getRegions().add(insregion);2561}25622563return ins;2564}25652566static public void ifft(double[] data) {2567new FFT(data.length / 2, 1).transform(data);2568}25692570static public void fft(double[] data) {2571new FFT(data.length / 2, -1).transform(data);2572}25732574public static void complexGaussianDist(double[] cdata, double m,2575double s, double v) {2576for (int x = 0; x < cdata.length / 4; x++) {2577cdata[x * 2] += v * (1.0 / (s * Math.sqrt(2 * Math.PI))2578* Math.exp((-1.0 / 2.0) * Math.pow((x - m) / s, 2.0)));2579}2580}25812582static public void randomPhase(double[] data) {2583for (int i = 0; i < data.length; i += 2) {2584double phase = Math.random() * 2 * Math.PI;2585double d = data[i];2586data[i] = Math.sin(phase) * d;2587data[i + 1] = Math.cos(phase) * d;2588}2589}25902591static public void randomPhase(double[] data, Random random) {2592for (int i = 0; i < data.length; i += 2) {2593double phase = random.nextDouble() * 2 * Math.PI;2594double d = data[i];2595data[i] = Math.sin(phase) * d;2596data[i + 1] = Math.cos(phase) * d;2597}2598}25992600static public void normalize(double[] data, double target) {2601double maxvalue = 0;2602for (int i = 0; i < data.length; i++) {2603if (data[i] > maxvalue)2604maxvalue = data[i];2605if (-data[i] > maxvalue)2606maxvalue = -data[i];2607}2608if (maxvalue == 0)2609return;2610double gain = target / maxvalue;2611for (int i = 0; i < data.length; i++)2612data[i] *= gain;2613}26142615static public void normalize(float[] data, double target) {2616double maxvalue = 0.5;2617for (int i = 0; i < data.length; i++) {2618if (data[i * 2] > maxvalue)2619maxvalue = data[i * 2];2620if (-data[i * 2] > maxvalue)2621maxvalue = -data[i * 2];2622}2623double gain = target / maxvalue;2624for (int i = 0; i < data.length; i++)2625data[i * 2] *= gain;2626}26272628static public double[] realPart(double[] in) {2629double[] out = new double[in.length / 2];2630for (int i = 0; i < out.length; i++) {2631out[i] = in[i * 2];2632}2633return out;2634}26352636static public double[] imgPart(double[] in) {2637double[] out = new double[in.length / 2];2638for (int i = 0; i < out.length; i++) {2639out[i] = in[i * 2];2640}2641return out;2642}26432644static public float[] toFloat(double[] in) {2645float[] out = new float[in.length];2646for (int i = 0; i < out.length; i++) {2647out[i] = (float) in[i];2648}2649return out;2650}26512652static public byte[] toBytes(float[] in, AudioFormat format) {2653byte[] out = new byte[in.length * format.getFrameSize()];2654return AudioFloatConverter.getConverter(format).toByteArray(in, out);2655}26562657static public void fadeUp(double[] data, int samples) {2658double dsamples = samples;2659for (int i = 0; i < samples; i++)2660data[i] *= i / dsamples;2661}26622663static public void fadeUp(float[] data, int samples) {2664double dsamples = samples;2665for (int i = 0; i < samples; i++)2666data[i] *= i / dsamples;2667}26682669static public double[] loopExtend(double[] data, int newsize) {2670double[] outdata = new double[newsize];2671int p_len = data.length;2672int p_ps = 0;2673for (int i = 0; i < outdata.length; i++) {2674outdata[i] = data[p_ps];2675p_ps++;2676if (p_ps == p_len)2677p_ps = 0;2678}2679return outdata;2680}26812682static public float[] loopExtend(float[] data, int newsize) {2683float[] outdata = new float[newsize];2684int p_len = data.length;2685int p_ps = 0;2686for (int i = 0; i < outdata.length; i++) {2687outdata[i] = data[p_ps];2688p_ps++;2689if (p_ps == p_len)2690p_ps = 0;2691}2692return outdata;2693}2694}269526962697