Path: blob/master/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java
41161 views
/*1* Copyright (c) 2007, 2018, 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*/2425package com.sun.media.sound;2627import java.util.Random;2829import javax.sound.midi.Patch;30import javax.sound.sampled.AudioFormat;3132/**33* Emergency Soundbank generator.34* Used when no other default soundbank can be found.35*36* @author Karl Helgason37*/38public final class EmergencySoundbank {3940private static final String[] general_midi_instruments = {41"Acoustic Grand Piano",42"Bright Acoustic Piano",43"Electric Grand Piano",44"Honky-tonk Piano",45"Electric Piano 1",46"Electric Piano 2",47"Harpsichord",48"Clavi",49"Celesta",50"Glockenspiel",51"Music Box",52"Vibraphone",53"Marimba",54"Xylophone",55"Tubular Bells",56"Dulcimer",57"Drawbar Organ",58"Percussive Organ",59"Rock Organ",60"Church Organ",61"Reed Organ",62"Accordion",63"Harmonica",64"Tango Accordion",65"Acoustic Guitar (nylon)",66"Acoustic Guitar (steel)",67"Electric Guitar (jazz)",68"Electric Guitar (clean)",69"Electric Guitar (muted)",70"Overdriven Guitar",71"Distortion Guitar",72"Guitar harmonics",73"Acoustic Bass",74"Electric Bass (finger)",75"Electric Bass (pick)",76"Fretless Bass",77"Slap Bass 1",78"Slap Bass 2",79"Synth Bass 1",80"Synth Bass 2",81"Violin",82"Viola",83"Cello",84"Contrabass",85"Tremolo Strings",86"Pizzicato Strings",87"Orchestral Harp",88"Timpani",89"String Ensemble 1",90"String Ensemble 2",91"SynthStrings 1",92"SynthStrings 2",93"Choir Aahs",94"Voice Oohs",95"Synth Voice",96"Orchestra Hit",97"Trumpet",98"Trombone",99"Tuba",100"Muted Trumpet",101"French Horn",102"Brass Section",103"SynthBrass 1",104"SynthBrass 2",105"Soprano Sax",106"Alto Sax",107"Tenor Sax",108"Baritone Sax",109"Oboe",110"English Horn",111"Bassoon",112"Clarinet",113"Piccolo",114"Flute",115"Recorder",116"Pan Flute",117"Blown Bottle",118"Shakuhachi",119"Whistle",120"Ocarina",121"Lead 1 (square)",122"Lead 2 (sawtooth)",123"Lead 3 (calliope)",124"Lead 4 (chiff)",125"Lead 5 (charang)",126"Lead 6 (voice)",127"Lead 7 (fifths)",128"Lead 8 (bass + lead)",129"Pad 1 (new age)",130"Pad 2 (warm)",131"Pad 3 (polysynth)",132"Pad 4 (choir)",133"Pad 5 (bowed)",134"Pad 6 (metallic)",135"Pad 7 (halo)",136"Pad 8 (sweep)",137"FX 1 (rain)",138"FX 2 (soundtrack)",139"FX 3 (crystal)",140"FX 4 (atmosphere)",141"FX 5 (brightness)",142"FX 6 (goblins)",143"FX 7 (echoes)",144"FX 8 (sci-fi)",145"Sitar",146"Banjo",147"Shamisen",148"Koto",149"Kalimba",150"Bag pipe",151"Fiddle",152"Shanai",153"Tinkle Bell",154"Agogo",155"Steel Drums",156"Woodblock",157"Taiko Drum",158"Melodic Tom",159"Synth Drum",160"Reverse Cymbal",161"Guitar Fret Noise",162"Breath Noise",163"Seashore",164"Bird Tweet",165"Telephone Ring",166"Helicopter",167"Applause",168"Gunshot"169};170171public static SF2Soundbank createSoundbank() throws Exception {172SF2Soundbank sf2 = new SF2Soundbank();173sf2.setName("Emergency GM sound set");174sf2.setVendor("Generated");175sf2.setDescription("Emergency generated soundbank");176177/*178* percussion instruments179*/180181SF2Layer bass_drum = new_bass_drum(sf2);182SF2Layer snare_drum = new_snare_drum(sf2);183SF2Layer tom = new_tom(sf2);184SF2Layer open_hihat = new_open_hihat(sf2);185SF2Layer closed_hihat = new_closed_hihat(sf2);186SF2Layer crash_cymbal = new_crash_cymbal(sf2);187SF2Layer side_stick = new_side_stick(sf2);188189SF2Layer[] drums = new SF2Layer[128];190drums[35] = bass_drum;191drums[36] = bass_drum;192drums[38] = snare_drum;193drums[40] = snare_drum;194drums[41] = tom;195drums[43] = tom;196drums[45] = tom;197drums[47] = tom;198drums[48] = tom;199drums[50] = tom;200drums[42] = closed_hihat;201drums[44] = closed_hihat;202drums[46] = open_hihat;203drums[49] = crash_cymbal;204drums[51] = crash_cymbal;205drums[52] = crash_cymbal;206drums[55] = crash_cymbal;207drums[57] = crash_cymbal;208drums[59] = crash_cymbal;209210// Use side_stick for missing drums:211drums[37] = side_stick;212drums[39] = side_stick;213drums[53] = side_stick;214drums[54] = side_stick;215drums[56] = side_stick;216drums[58] = side_stick;217drums[69] = side_stick;218drums[70] = side_stick;219drums[75] = side_stick;220drums[60] = side_stick;221drums[61] = side_stick;222drums[62] = side_stick;223drums[63] = side_stick;224drums[64] = side_stick;225drums[65] = side_stick;226drums[66] = side_stick;227drums[67] = side_stick;228drums[68] = side_stick;229drums[71] = side_stick;230drums[72] = side_stick;231drums[73] = side_stick;232drums[74] = side_stick;233drums[76] = side_stick;234drums[77] = side_stick;235drums[78] = side_stick;236drums[79] = side_stick;237drums[80] = side_stick;238drums[81] = side_stick;239240241SF2Instrument drum_instrument = new SF2Instrument(sf2);242drum_instrument.setName("Standard Kit");243drum_instrument.setPatch(new ModelPatch(0, 0, true));244sf2.addInstrument(drum_instrument);245for (int i = 0; i < drums.length; i++) {246if (drums[i] != null) {247SF2InstrumentRegion region = new SF2InstrumentRegion();248region.setLayer(drums[i]);249region.putBytes(SF2InstrumentRegion.GENERATOR_KEYRANGE,250new byte[]{(byte) i, (byte) i});251drum_instrument.getRegions().add(region);252}253}254255256/*257* melodic instruments258*/259260SF2Layer gpiano = new_gpiano(sf2);261SF2Layer gpiano2 = new_gpiano2(sf2);262SF2Layer gpiano_hammer = new_piano_hammer(sf2);263SF2Layer piano1 = new_piano1(sf2);264SF2Layer epiano1 = new_epiano1(sf2);265SF2Layer epiano2 = new_epiano2(sf2);266267SF2Layer guitar = new_guitar1(sf2);268SF2Layer guitar_pick = new_guitar_pick(sf2);269SF2Layer guitar_dist = new_guitar_dist(sf2);270SF2Layer bass1 = new_bass1(sf2);271SF2Layer bass2 = new_bass2(sf2);272SF2Layer synthbass = new_synthbass(sf2);273SF2Layer string2 = new_string2(sf2);274SF2Layer orchhit = new_orchhit(sf2);275SF2Layer choir = new_choir(sf2);276SF2Layer solostring = new_solostring(sf2);277SF2Layer organ = new_organ(sf2);278SF2Layer ch_organ = new_ch_organ(sf2);279SF2Layer bell = new_bell(sf2);280SF2Layer flute = new_flute(sf2);281282SF2Layer timpani = new_timpani(sf2);283SF2Layer melodic_toms = new_melodic_toms(sf2);284SF2Layer trumpet = new_trumpet(sf2);285SF2Layer trombone = new_trombone(sf2);286SF2Layer brass_section = new_brass_section(sf2);287SF2Layer horn = new_horn(sf2);288SF2Layer sax = new_sax(sf2);289SF2Layer oboe = new_oboe(sf2);290SF2Layer bassoon = new_bassoon(sf2);291SF2Layer clarinet = new_clarinet(sf2);292SF2Layer reverse_cymbal = new_reverse_cymbal(sf2);293294SF2Layer defaultsound = piano1;295296newInstrument(sf2, "Piano", new Patch(0, 0), gpiano, gpiano_hammer);297newInstrument(sf2, "Piano", new Patch(0, 1), gpiano2, gpiano_hammer);298newInstrument(sf2, "Piano", new Patch(0, 2), piano1);299{300SF2Instrument ins = newInstrument(sf2, "Honky-tonk Piano",301new Patch(0, 3), piano1, piano1);302SF2InstrumentRegion region = ins.getRegions().get(0);303region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 80);304region.putInteger(SF2Region.GENERATOR_FINETUNE, 30);305region = ins.getRegions().get(1);306region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 30);307}308newInstrument(sf2, "Rhodes", new Patch(0, 4), epiano2);309newInstrument(sf2, "Rhodes", new Patch(0, 5), epiano2);310newInstrument(sf2, "Clavinet", new Patch(0, 6), epiano1);311newInstrument(sf2, "Clavinet", new Patch(0, 7), epiano1);312newInstrument(sf2, "Rhodes", new Patch(0, 8), epiano2);313newInstrument(sf2, "Bell", new Patch(0, 9), bell);314newInstrument(sf2, "Bell", new Patch(0, 10), bell);315newInstrument(sf2, "Vibraphone", new Patch(0, 11), bell);316newInstrument(sf2, "Marimba", new Patch(0, 12), bell);317newInstrument(sf2, "Marimba", new Patch(0, 13), bell);318newInstrument(sf2, "Bell", new Patch(0, 14), bell);319newInstrument(sf2, "Rock Organ", new Patch(0, 15), organ);320newInstrument(sf2, "Rock Organ", new Patch(0, 16), organ);321newInstrument(sf2, "Perc Organ", new Patch(0, 17), organ);322newInstrument(sf2, "Rock Organ", new Patch(0, 18), organ);323newInstrument(sf2, "Church Organ", new Patch(0, 19), ch_organ);324newInstrument(sf2, "Accordion", new Patch(0, 20), organ);325newInstrument(sf2, "Accordion", new Patch(0, 21), organ);326newInstrument(sf2, "Accordion", new Patch(0, 22), organ);327newInstrument(sf2, "Accordion", new Patch(0, 23), organ);328newInstrument(sf2, "Guitar", new Patch(0, 24), guitar, guitar_pick);329newInstrument(sf2, "Guitar", new Patch(0, 25), guitar, guitar_pick);330newInstrument(sf2, "Guitar", new Patch(0, 26), guitar, guitar_pick);331newInstrument(sf2, "Guitar", new Patch(0, 27), guitar, guitar_pick);332newInstrument(sf2, "Guitar", new Patch(0, 28), guitar, guitar_pick);333newInstrument(sf2, "Distorted Guitar", new Patch(0, 29), guitar_dist);334newInstrument(sf2, "Distorted Guitar", new Patch(0, 30), guitar_dist);335newInstrument(sf2, "Guitar", new Patch(0, 31), guitar, guitar_pick);336newInstrument(sf2, "Finger Bass", new Patch(0, 32), bass1);337newInstrument(sf2, "Finger Bass", new Patch(0, 33), bass1);338newInstrument(sf2, "Finger Bass", new Patch(0, 34), bass1);339newInstrument(sf2, "Frettless Bass", new Patch(0, 35), bass2);340newInstrument(sf2, "Frettless Bass", new Patch(0, 36), bass2);341newInstrument(sf2, "Frettless Bass", new Patch(0, 37), bass2);342newInstrument(sf2, "Synth Bass1", new Patch(0, 38), synthbass);343newInstrument(sf2, "Synth Bass2", new Patch(0, 39), synthbass);344newInstrument(sf2, "Solo String", new Patch(0, 40), string2, solostring);345newInstrument(sf2, "Solo String", new Patch(0, 41), string2, solostring);346newInstrument(sf2, "Solo String", new Patch(0, 42), string2, solostring);347newInstrument(sf2, "Solo String", new Patch(0, 43), string2, solostring);348newInstrument(sf2, "Solo String", new Patch(0, 44), string2, solostring);349newInstrument(sf2, "Def", new Patch(0, 45), defaultsound);350newInstrument(sf2, "Harp", new Patch(0, 46), bell);351newInstrument(sf2, "Timpani", new Patch(0, 47), timpani);352newInstrument(sf2, "Strings", new Patch(0, 48), string2);353SF2Instrument slow_strings =354newInstrument(sf2, "Slow Strings", new Patch(0, 49), string2);355SF2InstrumentRegion region = slow_strings.getRegions().get(0);356region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, 2500);357region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 2000);358newInstrument(sf2, "Synth Strings", new Patch(0, 50), string2);359newInstrument(sf2, "Synth Strings", new Patch(0, 51), string2);360361362newInstrument(sf2, "Choir", new Patch(0, 52), choir);363newInstrument(sf2, "Choir", new Patch(0, 53), choir);364newInstrument(sf2, "Choir", new Patch(0, 54), choir);365{366SF2Instrument ins = newInstrument(sf2, "Orch Hit",367new Patch(0, 55), orchhit, orchhit, timpani);368region = ins.getRegions().get(0);369region.putInteger(SF2Region.GENERATOR_COARSETUNE, -12);370region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);371}372newInstrument(sf2, "Trumpet", new Patch(0, 56), trumpet);373newInstrument(sf2, "Trombone", new Patch(0, 57), trombone);374newInstrument(sf2, "Trombone", new Patch(0, 58), trombone);375newInstrument(sf2, "Trumpet", new Patch(0, 59), trumpet);376newInstrument(sf2, "Horn", new Patch(0, 60), horn);377newInstrument(sf2, "Brass Section", new Patch(0, 61), brass_section);378newInstrument(sf2, "Brass Section", new Patch(0, 62), brass_section);379newInstrument(sf2, "Brass Section", new Patch(0, 63), brass_section);380newInstrument(sf2, "Sax", new Patch(0, 64), sax);381newInstrument(sf2, "Sax", new Patch(0, 65), sax);382newInstrument(sf2, "Sax", new Patch(0, 66), sax);383newInstrument(sf2, "Sax", new Patch(0, 67), sax);384newInstrument(sf2, "Oboe", new Patch(0, 68), oboe);385newInstrument(sf2, "Horn", new Patch(0, 69), horn);386newInstrument(sf2, "Bassoon", new Patch(0, 70), bassoon);387newInstrument(sf2, "Clarinet", new Patch(0, 71), clarinet);388newInstrument(sf2, "Flute", new Patch(0, 72), flute);389newInstrument(sf2, "Flute", new Patch(0, 73), flute);390newInstrument(sf2, "Flute", new Patch(0, 74), flute);391newInstrument(sf2, "Flute", new Patch(0, 75), flute);392newInstrument(sf2, "Flute", new Patch(0, 76), flute);393newInstrument(sf2, "Flute", new Patch(0, 77), flute);394newInstrument(sf2, "Flute", new Patch(0, 78), flute);395newInstrument(sf2, "Flute", new Patch(0, 79), flute);396newInstrument(sf2, "Organ", new Patch(0, 80), organ);397newInstrument(sf2, "Organ", new Patch(0, 81), organ);398newInstrument(sf2, "Flute", new Patch(0, 82), flute);399newInstrument(sf2, "Organ", new Patch(0, 83), organ);400newInstrument(sf2, "Organ", new Patch(0, 84), organ);401newInstrument(sf2, "Choir", new Patch(0, 85), choir);402newInstrument(sf2, "Organ", new Patch(0, 86), organ);403newInstrument(sf2, "Organ", new Patch(0, 87), organ);404newInstrument(sf2, "Synth Strings", new Patch(0, 88), string2);405newInstrument(sf2, "Organ", new Patch(0, 89), organ);406newInstrument(sf2, "Def", new Patch(0, 90), defaultsound);407newInstrument(sf2, "Choir", new Patch(0, 91), choir);408newInstrument(sf2, "Organ", new Patch(0, 92), organ);409newInstrument(sf2, "Organ", new Patch(0, 93), organ);410newInstrument(sf2, "Organ", new Patch(0, 94), organ);411newInstrument(sf2, "Organ", new Patch(0, 95), organ);412newInstrument(sf2, "Organ", new Patch(0, 96), organ);413newInstrument(sf2, "Organ", new Patch(0, 97), organ);414newInstrument(sf2, "Bell", new Patch(0, 98), bell);415newInstrument(sf2, "Organ", new Patch(0, 99), organ);416newInstrument(sf2, "Organ", new Patch(0, 100), organ);417newInstrument(sf2, "Organ", new Patch(0, 101), organ);418newInstrument(sf2, "Def", new Patch(0, 102), defaultsound);419newInstrument(sf2, "Synth Strings", new Patch(0, 103), string2);420newInstrument(sf2, "Def", new Patch(0, 104), defaultsound);421newInstrument(sf2, "Def", new Patch(0, 105), defaultsound);422newInstrument(sf2, "Def", new Patch(0, 106), defaultsound);423newInstrument(sf2, "Def", new Patch(0, 107), defaultsound);424newInstrument(sf2, "Marimba", new Patch(0, 108), bell);425newInstrument(sf2, "Sax", new Patch(0, 109), sax);426newInstrument(sf2, "Solo String", new Patch(0, 110), string2, solostring);427newInstrument(sf2, "Oboe", new Patch(0, 111), oboe);428newInstrument(sf2, "Bell", new Patch(0, 112), bell);429newInstrument(sf2, "Melodic Toms", new Patch(0, 113), melodic_toms);430newInstrument(sf2, "Marimba", new Patch(0, 114), bell);431newInstrument(sf2, "Melodic Toms", new Patch(0, 115), melodic_toms);432newInstrument(sf2, "Melodic Toms", new Patch(0, 116), melodic_toms);433newInstrument(sf2, "Melodic Toms", new Patch(0, 117), melodic_toms);434newInstrument(sf2, "Reverse Cymbal", new Patch(0, 118), reverse_cymbal);435newInstrument(sf2, "Reverse Cymbal", new Patch(0, 119), reverse_cymbal);436newInstrument(sf2, "Guitar", new Patch(0, 120), guitar);437newInstrument(sf2, "Def", new Patch(0, 121), defaultsound);438{439SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",440new Patch(0, 122), reverse_cymbal);441region = ins.getRegions().get(0);442region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);443region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);444region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);445region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);446}447{448SF2Instrument ins = newInstrument(sf2, "Bird/Flute",449new Patch(0, 123), flute);450region = ins.getRegions().get(0);451region.putInteger(SF2Region.GENERATOR_COARSETUNE, 24);452region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -3000);453region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);454}455newInstrument(sf2, "Def", new Patch(0, 124), side_stick);456{457SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",458new Patch(0, 125), reverse_cymbal);459region = ins.getRegions().get(0);460region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);461region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);462region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);463region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);464}465newInstrument(sf2, "Applause/crash_cymbal",466new Patch(0, 126), crash_cymbal);467newInstrument(sf2, "Gunshot/side_stick", new Patch(0, 127), side_stick);468469for (SF2Instrument instrument : sf2.getInstruments()) {470Patch patch = instrument.getPatch();471if (patch instanceof ModelPatch) {472if (((ModelPatch) patch).isPercussion())473continue;474}475instrument.setName(general_midi_instruments[patch.getProgram()]);476}477478return sf2;479480}481482public static SF2Layer new_bell(SF2Soundbank sf2) {483Random random = new Random(102030201);484int x = 8;485int fftsize = 4096 * x;486double[] data = new double[fftsize * 2];487double base = x * 25;488double start_w = 0.01;489double end_w = 0.05;490double start_a = 0.2;491double end_a = 0.00001;492double a = start_a;493double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);494for (int i = 0; i < 40; i++) {495double detune = 1 + (random.nextDouble() * 2 - 1) * 0.01;496double w = start_w + (end_w - start_w) * (i / 40.0);497complexGaussianDist(data, base * (i + 1) * detune, w, a);498a *= a_step;499}500SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);501SF2Layer layer = newLayer(sf2, "EPiano", sample);502SF2Region region = layer.getRegions().get(0);503region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);504region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);505region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);506region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);507region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);508region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);509region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);510region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);511region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);512return layer;513}514515public static SF2Layer new_guitar1(SF2Soundbank sf2) {516517int x = 8;518int fftsize = 4096 * x;519double[] data = new double[fftsize * 2];520double base = x * 25;521double start_w = 0.01;522double end_w = 0.01;523double start_a = 2;524double end_a = 0.01;525double a = start_a;526double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);527528double[] aa = new double[40];529for (int i = 0; i < 40; i++) {530aa[i] = a;531a *= a_step;532}533534aa[0] = 2;535aa[1] = 0.5;536aa[2] = 0.45;537aa[3] = 0.2;538aa[4] = 1;539aa[5] = 0.5;540aa[6] = 2;541aa[7] = 1;542aa[8] = 0.5;543aa[9] = 1;544aa[9] = 0.5;545aa[10] = 0.2;546aa[11] = 1;547aa[12] = 0.7;548aa[13] = 0.5;549aa[14] = 1;550551for (int i = 0; i < 40; i++) {552double w = start_w + (end_w - start_w) * (i / 40.0);553complexGaussianDist(data, base * (i + 1), w, aa[i]);554}555556SF2Sample sample = newSimpleFFTSample(sf2, "Guitar", data, base);557SF2Layer layer = newLayer(sf2, "Guitar", sample);558SF2Region region = layer.getRegions().get(0);559region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);560region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);561region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);562region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);563region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);564565region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);566region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);567region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -6000);568region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);569region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);570return layer;571}572573public static SF2Layer new_guitar_dist(SF2Soundbank sf2) {574575int x = 8;576int fftsize = 4096 * x;577double[] data = new double[fftsize * 2];578double base = x * 25;579double start_w = 0.01;580double end_w = 0.01;581double start_a = 2;582double end_a = 0.01;583double a = start_a;584double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);585586double[] aa = new double[40];587for (int i = 0; i < 40; i++) {588aa[i] = a;589a *= a_step;590}591592aa[0] = 5;593aa[1] = 2;594aa[2] = 0.45;595aa[3] = 0.2;596aa[4] = 1;597aa[5] = 0.5;598aa[6] = 2;599aa[7] = 1;600aa[8] = 0.5;601aa[9] = 1;602aa[9] = 0.5;603aa[10] = 0.2;604aa[11] = 1;605aa[12] = 0.7;606aa[13] = 0.5;607aa[14] = 1;608609for (int i = 0; i < 40; i++) {610double w = start_w + (end_w - start_w) * (i / 40.0);611complexGaussianDist(data, base * (i + 1), w, aa[i]);612}613614615SF2Sample sample = newSimpleFFTSample_dist(sf2, "Distorted Guitar",616data, base, 10000.0);617618619SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample);620SF2Region region = layer.getRegions().get(0);621region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);622region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);623region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);624//region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);625//region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200);626627//region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);628//region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);629//region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000);630region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);631//region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);632return layer;633}634635public static SF2Layer new_guitar_pick(SF2Soundbank sf2) {636637double[] datab;638639// Make treble part640{641int m = 2;642int fftlen = 4096 * m;643double[] data = new double[2 * fftlen];644Random random = new Random(3049912);645for (int i = 0; i < data.length; i += 2)646data[i] = (2.0 * (random.nextDouble() - 0.5));647fft(data);648// Remove all negative frequency649for (int i = fftlen / 2; i < data.length; i++)650data[i] = 0;651for (int i = 0; i < 2048 * m; i++) {652data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2)653+ Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9);654}655randomPhase(data, new Random(3049912));656ifft(data);657normalize(data, 0.8);658data = realPart(data);659double gain = 1.0;660for (int i = 0; i < data.length; i++) {661data[i] *= gain;662gain *= 0.9994;663}664datab = data;665666fadeUp(data, 80);667}668669SF2Sample sample = newSimpleDrumSample(sf2, "Guitar Noise", datab);670671SF2Layer layer = new SF2Layer(sf2);672layer.setName("Guitar Noise");673674SF2GlobalRegion global = new SF2GlobalRegion();675layer.setGlobalZone(global);676sf2.addResource(layer);677678SF2LayerRegion region = new SF2LayerRegion();679region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);680//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);681// region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);682/*683region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);684region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);685region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);686region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);687region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);688*/689690region.setSample(sample);691layer.getRegions().add(region);692693return layer;694}695696public static SF2Layer new_gpiano(SF2Soundbank sf2) {697//Random random = new Random(302030201);698int x = 8;699int fftsize = 4096 * x;700double[] data = new double[fftsize * 2];701double base = x * 25;702double start_a = 0.2;703double end_a = 0.001;704double a = start_a;705double a_step = Math.pow(end_a / start_a, 1.0 / 15.0);706707double[] aa = new double[30];708for (int i = 0; i < 30; i++) {709aa[i] = a;710a *= a_step;711}712713aa[0] *= 2;714//aa[2] *= 0.1;715aa[4] *= 2;716717718aa[12] *= 0.9;719aa[13] *= 0.7;720for (int i = 14; i < 30; i++) {721aa[i] *= 0.5;722}723724725for (int i = 0; i < 30; i++) {726//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;727double w = 0.2;728double ai = aa[i];729if (i > 10) {730w = 5;731ai *= 10;732}733int adjust = 0;734if (i > 5) {735adjust = (i - 5) * 7;736}737complexGaussianDist(data, base * (i + 1) + adjust, w, ai);738}739740SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);741SF2Layer layer = newLayer(sf2, "Grand Piano", sample);742SF2Region region = layer.getRegions().get(0);743region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);744region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);745region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);746region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);747region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);748region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);749region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);750region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);751region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);752return layer;753}754755public static SF2Layer new_gpiano2(SF2Soundbank sf2) {756//Random random = new Random(302030201);757int x = 8;758int fftsize = 4096 * x;759double[] data = new double[fftsize * 2];760double base = x * 25;761double start_a = 0.2;762double end_a = 0.001;763double a = start_a;764double a_step = Math.pow(end_a / start_a, 1.0 / 20.0);765766double[] aa = new double[30];767for (int i = 0; i < 30; i++) {768aa[i] = a;769a *= a_step;770}771772aa[0] *= 1;773//aa[2] *= 0.1;774aa[4] *= 2;775776777aa[12] *= 0.9;778aa[13] *= 0.7;779for (int i = 14; i < 30; i++) {780aa[i] *= 0.5;781}782783784for (int i = 0; i < 30; i++) {785//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;786double w = 0.2;787double ai = aa[i];788if (i > 10) {789w = 5;790ai *= 10;791}792int adjust = 0;793if (i > 5) {794adjust = (i - 5) * 7;795}796complexGaussianDist(data, base * (i + 1) + adjust, w, ai);797}798799SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);800SF2Layer layer = newLayer(sf2, "Grand Piano", sample);801SF2Region region = layer.getRegions().get(0);802region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);803region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);804region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);805region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);806region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);807region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);808region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);809region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);810region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);811return layer;812}813814public static SF2Layer new_piano_hammer(SF2Soundbank sf2) {815816double[] datab;817818// Make treble part819{820int m = 2;821int fftlen = 4096 * m;822double[] data = new double[2 * fftlen];823Random random = new Random(3049912);824for (int i = 0; i < data.length; i += 2)825data[i] = (2.0 * (random.nextDouble() - 0.5));826fft(data);827// Remove all negative frequency828for (int i = fftlen / 2; i < data.length; i++)829data[i] = 0;830for (int i = 0; i < 2048 * m; i++)831data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05);832randomPhase(data, new Random(3049912));833ifft(data);834normalize(data, 0.6);835data = realPart(data);836double gain = 1.0;837for (int i = 0; i < data.length; i++) {838data[i] *= gain;839gain *= 0.9997;840}841datab = data;842843fadeUp(data, 80);844}845846SF2Sample sample = newSimpleDrumSample(sf2, "Piano Hammer", datab);847848SF2Layer layer = new SF2Layer(sf2);849layer.setName("Piano Hammer");850851SF2GlobalRegion global = new SF2GlobalRegion();852layer.setGlobalZone(global);853sf2.addResource(layer);854855SF2LayerRegion region = new SF2LayerRegion();856region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);857//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);858/*859region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);860region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);861region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);862region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);863region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);864*/865866region.setSample(sample);867layer.getRegions().add(region);868869return layer;870}871872public static SF2Layer new_piano1(SF2Soundbank sf2) {873//Random random = new Random(302030201);874int x = 8;875int fftsize = 4096 * x;876double[] data = new double[fftsize * 2];877double base = x * 25;878double start_a = 0.2;879double end_a = 0.0001;880double a = start_a;881double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);882883double[] aa = new double[30];884for (int i = 0; i < 30; i++) {885aa[i] = a;886a *= a_step;887}888889aa[0] *= 5;890aa[2] *= 0.1;891aa[7] *= 5;892893894for (int i = 0; i < 30; i++) {895//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;896double w = 0.2;897double ai = aa[i];898if (i > 12) {899w = 5;900ai *= 10;901}902int adjust = 0;903if (i > 5) {904adjust = (i - 5) * 7;905}906complexGaussianDist(data, base * (i + 1) + adjust, w, ai);907}908909complexGaussianDist(data, base * (15.5), 1, 0.1);910complexGaussianDist(data, base * (17.5), 1, 0.01);911912SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base, 200);913SF2Layer layer = newLayer(sf2, "EPiano", sample);914SF2Region region = layer.getRegions().get(0);915region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);916region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);917region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);918region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);919region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);920region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -1200);921region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);922region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);923region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);924return layer;925}926927public static SF2Layer new_epiano1(SF2Soundbank sf2) {928Random random = new Random(302030201);929int x = 8;930int fftsize = 4096 * x;931double[] data = new double[fftsize * 2];932double base = x * 25;933double start_w = 0.05;934double end_w = 0.05;935double start_a = 0.2;936double end_a = 0.0001;937double a = start_a;938double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);939for (int i = 0; i < 40; i++) {940double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;941double w = start_w + (end_w - start_w) * (i / 40.0);942complexGaussianDist(data, base * (i + 1) * detune, w, a);943a *= a_step;944}945946947948SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);949SF2Layer layer = newLayer(sf2, "EPiano", sample);950SF2Region region = layer.getRegions().get(0);951region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);952region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);953region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);954region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);955region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);956region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);957region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);958region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);959region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);960return layer;961}962963public static SF2Layer new_epiano2(SF2Soundbank sf2) {964Random random = new Random(302030201);965int x = 8;966int fftsize = 4096 * x;967double[] data = new double[fftsize * 2];968double base = x * 25;969double start_w = 0.01;970double end_w = 0.05;971double start_a = 0.2;972double end_a = 0.00001;973double a = start_a;974double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);975for (int i = 0; i < 40; i++) {976double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;977double w = start_w + (end_w - start_w) * (i / 40.0);978complexGaussianDist(data, base * (i + 1) * detune, w, a);979a *= a_step;980}981982SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);983SF2Layer layer = newLayer(sf2, "EPiano", sample);984SF2Region region = layer.getRegions().get(0);985region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);986region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);987region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);988region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 8000);989region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);990region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 2400);991region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);992region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);993region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);994region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);995return layer;996}997998public static SF2Layer new_bass1(SF2Soundbank sf2) {999int x = 8;1000int fftsize = 4096 * x;1001double[] data = new double[fftsize * 2];1002double base = x * 25;1003double start_w = 0.05;1004double end_w = 0.05;1005double start_a = 0.2;1006double end_a = 0.02;1007double a = start_a;1008double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);10091010double[] aa = new double[25];1011for (int i = 0; i < 25; i++) {1012aa[i] = a;1013a *= a_step;1014}10151016aa[0] *= 8;1017aa[1] *= 4;1018aa[3] *= 8;1019aa[5] *= 8;10201021for (int i = 0; i < 25; i++) {1022double w = start_w + (end_w - start_w) * (i / 40.0);1023complexGaussianDist(data, base * (i + 1), w, aa[i]);1024}102510261027SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);1028SF2Layer layer = newLayer(sf2, "Bass", sample);1029SF2Region region = layer.getRegions().get(0);1030region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1031region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);1032region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1033region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1034region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1035region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1036region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1037region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5000);1038region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 11000);1039region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1040return layer;1041}10421043public static SF2Layer new_synthbass(SF2Soundbank sf2) {1044int x = 8;1045int fftsize = 4096 * x;1046double[] data = new double[fftsize * 2];1047double base = x * 25;1048double start_w = 0.05;1049double end_w = 0.05;1050double start_a = 0.2;1051double end_a = 0.02;1052double a = start_a;1053double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);10541055double[] aa = new double[25];1056for (int i = 0; i < 25; i++) {1057aa[i] = a;1058a *= a_step;1059}10601061aa[0] *= 16;1062aa[1] *= 4;1063aa[3] *= 16;1064aa[5] *= 8;10651066for (int i = 0; i < 25; i++) {1067double w = start_w + (end_w - start_w) * (i / 40.0);1068complexGaussianDist(data, base * (i + 1), w, aa[i]);1069}107010711072SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);1073SF2Layer layer = newLayer(sf2, "Bass", sample);1074SF2Region region = layer.getRegions().get(0);1075region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1076region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);1077region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1078region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1079region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1080region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1081region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1082region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -3000);1083region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 100);1084region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);1085region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1086return layer;1087}10881089public static SF2Layer new_bass2(SF2Soundbank sf2) {1090int x = 8;1091int fftsize = 4096 * x;1092double[] data = new double[fftsize * 2];1093double base = x * 25;1094double start_w = 0.05;1095double end_w = 0.05;1096double start_a = 0.2;1097double end_a = 0.002;1098double a = start_a;1099double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);11001101double[] aa = new double[25];1102for (int i = 0; i < 25; i++) {1103aa[i] = a;1104a *= a_step;1105}11061107aa[0] *= 8;1108aa[1] *= 4;1109aa[3] *= 8;1110aa[5] *= 8;11111112for (int i = 0; i < 25; i++) {1113double w = start_w + (end_w - start_w) * (i / 40.0);1114complexGaussianDist(data, base * (i + 1), w, aa[i]);1115}111611171118SF2Sample sample = newSimpleFFTSample(sf2, "Bass2", data, base);1119SF2Layer layer = newLayer(sf2, "Bass2", sample);1120SF2Region region = layer.getRegions().get(0);1121region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1122region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);1123region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1124region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1125region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1126region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);1127region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1128region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 5000);1129region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1130return layer;1131}11321133public static SF2Layer new_solostring(SF2Soundbank sf2) {1134int x = 8;1135int fftsize = 4096 * x;1136double[] data = new double[fftsize * 2];1137double base = x * 25;1138double start_w = 2;1139double end_w = 2;1140double start_a = 0.2;1141double end_a = 0.01;11421143double[] aa = new double[18];1144double a = start_a;1145double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1146for (int i = 0; i < aa.length; i++) {1147a *= a_step;1148aa[i] = a;1149}11501151aa[0] *= 5;1152aa[1] *= 5;1153aa[2] *= 5;1154aa[3] *= 4;1155aa[4] *= 4;1156aa[5] *= 3;1157aa[6] *= 3;1158aa[7] *= 2;11591160for (int i = 0; i < aa.length; i++) {1161double w = start_w + (end_w - start_w) * (i / 40.0);1162complexGaussianDist(data, base * (i + 1), w, a);1163}1164SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);1165SF2Layer layer = newLayer(sf2, "Strings", sample);1166SF2Region region = layer.getRegions().get(0);1167region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1168region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1169region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);1170region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1171region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1172region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1173region.putInteger(SF2Region.GENERATOR_FREQVIBLFO, -1000);1174region.putInteger(SF2Region.GENERATOR_VIBLFOTOPITCH, 15);1175return layer;11761177}11781179public static SF2Layer new_orchhit(SF2Soundbank sf2) {1180int x = 8;1181int fftsize = 4096 * x;1182double[] data = new double[fftsize * 2];1183double base = x * 25;1184double start_w = 2;1185double end_w = 80;1186double start_a = 0.2;1187double end_a = 0.001;1188double a = start_a;1189double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1190for (int i = 0; i < 40; i++) {1191double w = start_w + (end_w - start_w) * (i / 40.0);1192complexGaussianDist(data, base * (i + 1), w, a);1193a *= a_step;1194}1195complexGaussianDist(data, base * 4, 300, 1);119611971198SF2Sample sample = newSimpleFFTSample(sf2, "Och Strings", data, base);1199SF2Layer layer = newLayer(sf2, "Och Strings", sample);1200SF2Region region = layer.getRegions().get(0);1201region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1202region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1203region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 200);1204region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 200);1205region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);1206region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1207return layer;12081209}12101211public static SF2Layer new_string2(SF2Soundbank sf2) {1212int x = 8;1213int fftsize = 4096 * x;1214double[] data = new double[fftsize * 2];1215double base = x * 25;1216double start_w = 2;1217double end_w = 80;1218double start_a = 0.2;1219double end_a = 0.001;1220double a = start_a;1221double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1222for (int i = 0; i < 40; i++) {1223double w = start_w + (end_w - start_w) * (i / 40.0);1224complexGaussianDist(data, base * (i + 1), w, a);1225a *= a_step;1226}1227SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);1228SF2Layer layer = newLayer(sf2, "Strings", sample);1229SF2Region region = layer.getRegions().get(0);1230region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1231region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1232region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);1233region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1234region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1235region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1236return layer;12371238}12391240public static SF2Layer new_choir(SF2Soundbank sf2) {1241int x = 8;1242int fftsize = 4096 * x;1243double[] data = new double[fftsize * 2];1244double base = x * 25;1245double start_w = 2;1246double end_w = 80;1247double start_a = 0.2;1248double end_a = 0.001;1249double a = start_a;1250double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1251double[] aa = new double[40];1252for (int i = 0; i < aa.length; i++) {1253a *= a_step;1254aa[i] = a;1255}12561257aa[5] *= 0.1;1258aa[6] *= 0.01;1259aa[7] *= 0.1;1260aa[8] *= 0.1;12611262for (int i = 0; i < aa.length; i++) {1263double w = start_w + (end_w - start_w) * (i / 40.0);1264complexGaussianDist(data, base * (i + 1), w, aa[i]);1265}1266SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);1267SF2Layer layer = newLayer(sf2, "Strings", sample);1268SF2Region region = layer.getRegions().get(0);1269region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1270region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);1271region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);1272region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1273region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1274region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1275return layer;12761277}12781279public static SF2Layer new_organ(SF2Soundbank sf2) {1280Random random = new Random(102030201);1281int x = 1;1282int fftsize = 4096 * x;1283double[] data = new double[fftsize * 2];1284double base = x * 15;1285double start_w = 0.01;1286double end_w = 0.01;1287double start_a = 0.2;1288double end_a = 0.001;1289double a = start_a;1290double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);12911292for (int i = 0; i < 12; i++) {1293double w = start_w + (end_w - start_w) * (i / 40.0);1294complexGaussianDist(data, base * (i + 1), w,1295a * (0.5 + 3 * (random.nextDouble())));1296a *= a_step;1297}1298SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);1299SF2Layer layer = newLayer(sf2, "Organ", sample);1300SF2Region region = layer.getRegions().get(0);1301region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1302region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1303region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1304region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1305region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1306region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1307return layer;13081309}13101311public static SF2Layer new_ch_organ(SF2Soundbank sf2) {1312int x = 1;1313int fftsize = 4096 * x;1314double[] data = new double[fftsize * 2];1315double base = x * 15;1316double start_w = 0.01;1317double end_w = 0.01;1318double start_a = 0.2;1319double end_a = 0.001;1320double a = start_a;1321double a_step = Math.pow(end_a / start_a, 1.0 / 60.0);13221323double[] aa = new double[60];1324for (int i = 0; i < aa.length; i++) {1325a *= a_step;1326aa[i] = a;1327}13281329aa[0] *= 5;1330aa[1] *= 2;1331aa[2] = 0;1332aa[4] = 0;1333aa[5] = 0;1334aa[7] *= 7;1335aa[9] = 0;1336aa[10] = 0;1337aa[12] = 0;1338aa[15] *= 7;1339aa[18] = 0;1340aa[20] = 0;1341aa[24] = 0;1342aa[27] *= 5;1343aa[29] = 0;1344aa[30] = 0;1345aa[33] = 0;1346aa[36] *= 4;1347aa[37] = 0;1348aa[39] = 0;1349aa[42] = 0;1350aa[43] = 0;1351aa[47] = 0;1352aa[50] *= 4;1353aa[52] = 0;1354aa[55] = 0;1355aa[57] = 0;135613571358aa[10] *= 0.1;1359aa[11] *= 0.1;1360aa[12] *= 0.1;1361aa[13] *= 0.1;13621363aa[17] *= 0.1;1364aa[18] *= 0.1;1365aa[19] *= 0.1;1366aa[20] *= 0.1;13671368for (int i = 0; i < 60; i++) {1369double w = start_w + (end_w - start_w) * (i / 40.0);1370complexGaussianDist(data, base * (i + 1), w, aa[i]);1371a *= a_step;1372}1373SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);1374SF2Layer layer = newLayer(sf2, "Organ", sample);1375SF2Region region = layer.getRegions().get(0);1376region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1377region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);1378region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1379return layer;13801381}13821383public static SF2Layer new_flute(SF2Soundbank sf2) {1384int x = 8;1385int fftsize = 4096 * x;1386double[] data = new double[fftsize * 2];1387double base = x * 15;13881389complexGaussianDist(data, base * 1, 0.001, 0.5);1390complexGaussianDist(data, base * 2, 0.001, 0.5);1391complexGaussianDist(data, base * 3, 0.001, 0.5);1392complexGaussianDist(data, base * 4, 0.01, 0.5);13931394complexGaussianDist(data, base * 4, 100, 120);1395complexGaussianDist(data, base * 6, 100, 40);1396complexGaussianDist(data, base * 8, 100, 80);13971398complexGaussianDist(data, base * 5, 0.001, 0.05);1399complexGaussianDist(data, base * 6, 0.001, 0.06);1400complexGaussianDist(data, base * 7, 0.001, 0.04);1401complexGaussianDist(data, base * 8, 0.005, 0.06);1402complexGaussianDist(data, base * 9, 0.005, 0.06);1403complexGaussianDist(data, base * 10, 0.01, 0.1);1404complexGaussianDist(data, base * 11, 0.08, 0.7);1405complexGaussianDist(data, base * 12, 0.08, 0.6);1406complexGaussianDist(data, base * 13, 0.08, 0.6);1407complexGaussianDist(data, base * 14, 0.08, 0.6);1408complexGaussianDist(data, base * 15, 0.08, 0.5);1409complexGaussianDist(data, base * 16, 0.08, 0.5);1410complexGaussianDist(data, base * 17, 0.08, 0.2);141114121413complexGaussianDist(data, base * 1, 10, 8);1414complexGaussianDist(data, base * 2, 10, 8);1415complexGaussianDist(data, base * 3, 10, 8);1416complexGaussianDist(data, base * 4, 10, 8);1417complexGaussianDist(data, base * 5, 10, 8);1418complexGaussianDist(data, base * 6, 20, 9);1419complexGaussianDist(data, base * 7, 20, 9);1420complexGaussianDist(data, base * 8, 20, 9);1421complexGaussianDist(data, base * 9, 20, 8);1422complexGaussianDist(data, base * 10, 30, 8);1423complexGaussianDist(data, base * 11, 30, 9);1424complexGaussianDist(data, base * 12, 30, 9);1425complexGaussianDist(data, base * 13, 30, 8);1426complexGaussianDist(data, base * 14, 30, 8);1427complexGaussianDist(data, base * 15, 30, 7);1428complexGaussianDist(data, base * 16, 30, 7);1429complexGaussianDist(data, base * 17, 30, 6);14301431SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);1432SF2Layer layer = newLayer(sf2, "Flute", sample);1433SF2Region region = layer.getRegions().get(0);1434region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1435region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1436region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1437region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1438region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1439region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1440return layer;14411442}14431444public static SF2Layer new_horn(SF2Soundbank sf2) {1445int x = 8;1446int fftsize = 4096 * x;1447double[] data = new double[fftsize * 2];1448double base = x * 15;14491450double start_a = 0.5;1451double end_a = 0.00000000001;1452double a = start_a;1453double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1454for (int i = 0; i < 40; i++) {1455if (i == 0)1456complexGaussianDist(data, base * (i + 1), 0.1, a * 0.2);1457else1458complexGaussianDist(data, base * (i + 1), 0.1, a);1459a *= a_step;1460}14611462complexGaussianDist(data, base * 2, 100, 1);146314641465SF2Sample sample = newSimpleFFTSample(sf2, "Horn", data, base);1466SF2Layer layer = newLayer(sf2, "Horn", sample);1467SF2Region region = layer.getRegions().get(0);1468region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1469region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1470region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1471region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1472region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);14731474region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -500);1475region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1476region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1477region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1478return layer;14791480}14811482public static SF2Layer new_trumpet(SF2Soundbank sf2) {1483int x = 8;1484int fftsize = 4096 * x;1485double[] data = new double[fftsize * 2];1486double base = x * 15;14871488double start_a = 0.5;1489double end_a = 0.00001;1490double a = start_a;1491double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);1492double[] aa = new double[80];1493for (int i = 0; i < 80; i++) {1494aa[i] = a;1495a *= a_step;1496}14971498aa[0] *= 0.05;1499aa[1] *= 0.2;1500aa[2] *= 0.5;1501aa[3] *= 0.85;15021503for (int i = 0; i < 80; i++) {1504complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);1505}15061507complexGaussianDist(data, base * 5, 300, 3);150815091510SF2Sample sample = newSimpleFFTSample(sf2, "Trumpet", data, base);1511SF2Layer layer = newLayer(sf2, "Trumpet", sample);1512SF2Region region = layer.getRegions().get(0);1513region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1514region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);1515region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);1516region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1517region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);15181519region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -4000);1520region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, -2500);1521region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1522region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1523region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);1524return layer;15251526}15271528public static SF2Layer new_brass_section(SF2Soundbank sf2) {1529int x = 8;1530int fftsize = 4096 * x;1531double[] data = new double[fftsize * 2];1532double base = x * 15;15331534double start_a = 0.5;1535double end_a = 0.005;1536double a = start_a;1537double a_step = Math.pow(end_a / start_a, 1.0 / 30.0);1538double[] aa = new double[30];1539for (int i = 0; i < 30; i++) {1540aa[i] = a;1541a *= a_step;1542}15431544aa[0] *= 0.8;1545aa[1] *= 0.9;15461547double w = 5;1548for (int i = 0; i < 30; i++) {1549complexGaussianDist(data, base * (i + 1), 0.1 * w, aa[i] * w);1550w += 6; //*= w_step;1551}15521553complexGaussianDist(data, base * 6, 300, 2);155415551556SF2Sample sample = newSimpleFFTSample(sf2, "Brass Section", data, base);1557SF2Layer layer = newLayer(sf2, "Brass Section", sample);1558SF2Region region = layer.getRegions().get(0);1559region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1560region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -9200);1561region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1562region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1563region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);15641565region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1566region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1567region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1568region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1569return layer;15701571}15721573public static SF2Layer new_trombone(SF2Soundbank sf2) {1574int x = 8;1575int fftsize = 4096 * x;1576double[] data = new double[fftsize * 2];1577double base = x * 15;15781579double start_a = 0.5;1580double end_a = 0.001;1581double a = start_a;1582double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);1583double[] aa = new double[80];1584for (int i = 0; i < 80; i++) {1585aa[i] = a;1586a *= a_step;1587}15881589aa[0] *= 0.3;1590aa[1] *= 0.7;15911592for (int i = 0; i < 80; i++) {1593complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);1594}15951596complexGaussianDist(data, base * 6, 300, 2);159715981599SF2Sample sample = newSimpleFFTSample(sf2, "Trombone", data, base);1600SF2Layer layer = newLayer(sf2, "Trombone", sample);1601SF2Region region = layer.getRegions().get(0);1602region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1603region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);1604region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1605region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1606region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);16071608region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -2000);1609region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1610region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1611region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1612region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);1613return layer;16141615}16161617public static SF2Layer new_sax(SF2Soundbank sf2) {1618int x = 8;1619int fftsize = 4096 * x;1620double[] data = new double[fftsize * 2];1621double base = x * 15;16221623double start_a = 0.5;1624double end_a = 0.01;1625double a = start_a;1626double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);1627for (int i = 0; i < 40; i++) {1628if (i == 0 || i == 2)1629complexGaussianDist(data, base * (i + 1), 0.1, a * 4);1630else1631complexGaussianDist(data, base * (i + 1), 0.1, a);1632a *= a_step;1633}16341635complexGaussianDist(data, base * 4, 200, 1);16361637SF2Sample sample = newSimpleFFTSample(sf2, "Sax", data, base);1638SF2Layer layer = newLayer(sf2, "Sax", sample);1639SF2Region region = layer.getRegions().get(0);1640region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1641region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1642region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1643region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1644region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);16451646region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);1647region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);1648region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);1649region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);1650return layer;16511652}16531654public static SF2Layer new_oboe(SF2Soundbank sf2) {1655int x = 8;1656int fftsize = 4096 * x;1657double[] data = new double[fftsize * 2];1658double base = x * 15;16591660complexGaussianDist(data, base * 5, 100, 80);166116621663complexGaussianDist(data, base * 1, 0.01, 0.53);1664complexGaussianDist(data, base * 2, 0.01, 0.51);1665complexGaussianDist(data, base * 3, 0.01, 0.48);1666complexGaussianDist(data, base * 4, 0.01, 0.49);1667complexGaussianDist(data, base * 5, 0.01, 5);1668complexGaussianDist(data, base * 6, 0.01, 0.51);1669complexGaussianDist(data, base * 7, 0.01, 0.50);1670complexGaussianDist(data, base * 8, 0.01, 0.59);1671complexGaussianDist(data, base * 9, 0.01, 0.61);1672complexGaussianDist(data, base * 10, 0.01, 0.52);1673complexGaussianDist(data, base * 11, 0.01, 0.49);1674complexGaussianDist(data, base * 12, 0.01, 0.51);1675complexGaussianDist(data, base * 13, 0.01, 0.48);1676complexGaussianDist(data, base * 14, 0.01, 0.51);1677complexGaussianDist(data, base * 15, 0.01, 0.46);1678complexGaussianDist(data, base * 16, 0.01, 0.35);1679complexGaussianDist(data, base * 17, 0.01, 0.20);1680complexGaussianDist(data, base * 18, 0.01, 0.10);1681complexGaussianDist(data, base * 19, 0.01, 0.5);1682complexGaussianDist(data, base * 20, 0.01, 0.1);168316841685SF2Sample sample = newSimpleFFTSample(sf2, "Oboe", data, base);1686SF2Layer layer = newLayer(sf2, "Oboe", sample);1687SF2Region region = layer.getRegions().get(0);1688region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1689region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1690region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1691region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1692region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1693region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1694return layer;16951696}16971698public static SF2Layer new_bassoon(SF2Soundbank sf2) {1699int x = 8;1700int fftsize = 4096 * x;1701double[] data = new double[fftsize * 2];1702double base = x * 15;17031704complexGaussianDist(data, base * 2, 100, 40);1705complexGaussianDist(data, base * 4, 100, 20);17061707complexGaussianDist(data, base * 1, 0.01, 0.53);1708complexGaussianDist(data, base * 2, 0.01, 5);1709complexGaussianDist(data, base * 3, 0.01, 0.51);1710complexGaussianDist(data, base * 4, 0.01, 0.48);1711complexGaussianDist(data, base * 5, 0.01, 1.49);1712complexGaussianDist(data, base * 6, 0.01, 0.51);1713complexGaussianDist(data, base * 7, 0.01, 0.50);1714complexGaussianDist(data, base * 8, 0.01, 0.59);1715complexGaussianDist(data, base * 9, 0.01, 0.61);1716complexGaussianDist(data, base * 10, 0.01, 0.52);1717complexGaussianDist(data, base * 11, 0.01, 0.49);1718complexGaussianDist(data, base * 12, 0.01, 0.51);1719complexGaussianDist(data, base * 13, 0.01, 0.48);1720complexGaussianDist(data, base * 14, 0.01, 0.51);1721complexGaussianDist(data, base * 15, 0.01, 0.46);1722complexGaussianDist(data, base * 16, 0.01, 0.35);1723complexGaussianDist(data, base * 17, 0.01, 0.20);1724complexGaussianDist(data, base * 18, 0.01, 0.10);1725complexGaussianDist(data, base * 19, 0.01, 0.5);1726complexGaussianDist(data, base * 20, 0.01, 0.1);172717281729SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);1730SF2Layer layer = newLayer(sf2, "Flute", sample);1731SF2Region region = layer.getRegions().get(0);1732region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1733region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1734region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1735region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1736region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1737region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1738return layer;17391740}17411742public static SF2Layer new_clarinet(SF2Soundbank sf2) {1743int x = 8;1744int fftsize = 4096 * x;1745double[] data = new double[fftsize * 2];1746double base = x * 15;17471748complexGaussianDist(data, base * 1, 0.001, 0.5);1749complexGaussianDist(data, base * 2, 0.001, 0.02);1750complexGaussianDist(data, base * 3, 0.001, 0.2);1751complexGaussianDist(data, base * 4, 0.01, 0.1);17521753complexGaussianDist(data, base * 4, 100, 60);1754complexGaussianDist(data, base * 6, 100, 20);1755complexGaussianDist(data, base * 8, 100, 20);17561757complexGaussianDist(data, base * 5, 0.001, 0.1);1758complexGaussianDist(data, base * 6, 0.001, 0.09);1759complexGaussianDist(data, base * 7, 0.001, 0.02);1760complexGaussianDist(data, base * 8, 0.005, 0.16);1761complexGaussianDist(data, base * 9, 0.005, 0.96);1762complexGaussianDist(data, base * 10, 0.01, 0.9);1763complexGaussianDist(data, base * 11, 0.08, 1.2);1764complexGaussianDist(data, base * 12, 0.08, 1.8);1765complexGaussianDist(data, base * 13, 0.08, 1.6);1766complexGaussianDist(data, base * 14, 0.08, 1.2);1767complexGaussianDist(data, base * 15, 0.08, 0.9);1768complexGaussianDist(data, base * 16, 0.08, 0.5);1769complexGaussianDist(data, base * 17, 0.08, 0.2);177017711772complexGaussianDist(data, base * 1, 10, 8);1773complexGaussianDist(data, base * 2, 10, 8);1774complexGaussianDist(data, base * 3, 10, 8);1775complexGaussianDist(data, base * 4, 10, 8);1776complexGaussianDist(data, base * 5, 10, 8);1777complexGaussianDist(data, base * 6, 20, 9);1778complexGaussianDist(data, base * 7, 20, 9);1779complexGaussianDist(data, base * 8, 20, 9);1780complexGaussianDist(data, base * 9, 20, 8);1781complexGaussianDist(data, base * 10, 30, 8);1782complexGaussianDist(data, base * 11, 30, 9);1783complexGaussianDist(data, base * 12, 30, 9);1784complexGaussianDist(data, base * 13, 30, 8);1785complexGaussianDist(data, base * 14, 30, 8);1786complexGaussianDist(data, base * 15, 30, 7);1787complexGaussianDist(data, base * 16, 30, 7);1788complexGaussianDist(data, base * 17, 30, 6);17891790SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base);1791SF2Layer layer = newLayer(sf2, "Clarinet", sample);1792SF2Region region = layer.getRegions().get(0);1793region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);1794region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);1795region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);1796region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);1797region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);1798region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);1799return layer;18001801}18021803public static SF2Layer new_timpani(SF2Soundbank sf2) {18041805double[] datab;1806double[] datah;18071808// Make Bass Part1809{1810int fftlen = 4096 * 8;1811double[] data = new double[2 * fftlen];1812double base = 48;1813complexGaussianDist(data, base * 2, 0.2, 1);1814complexGaussianDist(data, base * 3, 0.2, 0.7);1815complexGaussianDist(data, base * 5, 10, 1);1816complexGaussianDist(data, base * 6, 9, 1);1817complexGaussianDist(data, base * 8, 15, 1);1818complexGaussianDist(data, base * 9, 18, 0.8);1819complexGaussianDist(data, base * 11, 21, 0.5);1820complexGaussianDist(data, base * 13, 28, 0.3);1821complexGaussianDist(data, base * 14, 22, 0.1);1822randomPhase(data, new Random(3049912));1823ifft(data);1824normalize(data, 0.5);1825data = realPart(data);18261827double d_len = data.length;1828for (int i = 0; i < data.length; i++) {1829double g = (1.0 - (i / d_len));1830data[i] *= g * g;1831}1832fadeUp(data, 40);1833datab = data;1834}18351836// Make treble part1837{1838int fftlen = 4096 * 4;1839double[] data = new double[2 * fftlen];1840Random random = new Random(3049912);1841for (int i = 0; i < data.length; i += 2) {1842data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;1843}1844fft(data);1845// Remove all negative frequency1846for (int i = fftlen / 2; i < data.length; i++)1847data[i] = 0;1848for (int i = 1024 * 4; i < 2048 * 4; i++)1849data[i] = 1.0 - (i - 4096) / 4096.0;1850for (int i = 0; i < 300; i++) {1851double g = (1.0 - (i / 300.0));1852data[i] *= 1.0 + 20 * g * g;1853}1854for (int i = 0; i < 24; i++)1855data[i] = 0;1856randomPhase(data, new Random(3049912));1857ifft(data);1858normalize(data, 0.9);1859data = realPart(data);1860double gain = 1.0;1861for (int i = 0; i < data.length; i++) {1862data[i] *= gain;1863gain *= 0.9998;1864}1865datah = data;1866}18671868for (int i = 0; i < datah.length; i++)1869datab[i] += datah[i] * 0.02;18701871normalize(datab, 0.9);18721873SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab);18741875SF2Layer layer = new SF2Layer(sf2);1876layer.setName("Timpani");18771878SF2GlobalRegion global = new SF2GlobalRegion();1879layer.setGlobalZone(global);1880sf2.addResource(layer);18811882SF2LayerRegion region = new SF2LayerRegion();1883region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);1884region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1885region.setSample(sample);1886layer.getRegions().add(region);18871888return layer;1889}18901891public static SF2Layer new_melodic_toms(SF2Soundbank sf2) {18921893double[] datab;1894double[] datah;18951896// Make Bass Part1897{1898int fftlen = 4096 * 4;1899double[] data = new double[2 * fftlen];1900complexGaussianDist(data, 30, 0.5, 1);1901randomPhase(data, new Random(3049912));1902ifft(data);1903normalize(data, 0.8);1904data = realPart(data);19051906double d_len = data.length;1907for (int i = 0; i < data.length; i++)1908data[i] *= (1.0 - (i / d_len));1909datab = data;1910}19111912// Make treble part1913{1914int fftlen = 4096 * 4;1915double[] data = new double[2 * fftlen];1916Random random = new Random(3049912);1917for (int i = 0; i < data.length; i += 2)1918data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;1919fft(data);1920// Remove all negative frequency1921for (int i = fftlen / 2; i < data.length; i++)1922data[i] = 0;1923for (int i = 1024 * 4; i < 2048 * 4; i++)1924data[i] = 1.0 - (i - 4096) / 4096.0;1925for (int i = 0; i < 200; i++) {1926double g = (1.0 - (i / 200.0));1927data[i] *= 1.0 + 20 * g * g;1928}1929for (int i = 0; i < 30; i++)1930data[i] = 0;1931randomPhase(data, new Random(3049912));1932ifft(data);1933normalize(data, 0.9);1934data = realPart(data);1935double gain = 1.0;1936for (int i = 0; i < data.length; i++) {1937data[i] *= gain;1938gain *= 0.9996;1939}1940datah = data;1941}19421943for (int i = 0; i < datah.length; i++)1944datab[i] += datah[i] * 0.5;1945for (int i = 0; i < 5; i++)1946datab[i] *= i / 5.0;19471948normalize(datab, 0.99);19491950SF2Sample sample = newSimpleDrumSample(sf2, "Melodic Toms", datab);1951sample.setOriginalPitch(63);19521953SF2Layer layer = new SF2Layer(sf2);1954layer.setName("Melodic Toms");19551956SF2GlobalRegion global = new SF2GlobalRegion();1957layer.setGlobalZone(global);1958sf2.addResource(layer);19591960SF2LayerRegion region = new SF2LayerRegion();1961region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);1962//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);1963region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);1964region.setSample(sample);1965layer.getRegions().add(region);19661967return layer;1968}19691970public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) {1971double[] datah;1972{1973int fftlen = 4096 * 4;1974double[] data = new double[2 * fftlen];1975Random random = new Random(3049912);1976for (int i = 0; i < data.length; i += 2)1977data[i] = (2.0 * (random.nextDouble() - 0.5));1978for (int i = fftlen / 2; i < data.length; i++)1979data[i] = 0;1980for (int i = 0; i < 100; i++)1981data[i] = 0;19821983for (int i = 0; i < 512 * 2; i++) {1984double gain = (i / (512.0 * 2.0));1985data[i] = 1 - gain;1986}1987datah = data;1988}19891990SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal",1991datah, 100, 20);19921993SF2Layer layer = new SF2Layer(sf2);1994layer.setName("Reverse Cymbal");19951996SF2GlobalRegion global = new SF2GlobalRegion();1997layer.setGlobalZone(global);1998sf2.addResource(layer);19992000SF2LayerRegion region = new SF2LayerRegion();2001region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200);2002region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000);2003region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);2004region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);2005region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);2006region.setSample(sample);2007layer.getRegions().add(region);20082009return layer;2010}20112012public static SF2Layer new_snare_drum(SF2Soundbank sf2) {20132014double[] datab;2015double[] datah;20162017// Make Bass Part2018{2019int fftlen = 4096 * 4;2020double[] data = new double[2 * fftlen];2021complexGaussianDist(data, 24, 0.5, 1);2022randomPhase(data, new Random(3049912));2023ifft(data);2024normalize(data, 0.5);2025data = realPart(data);20262027double d_len = data.length;2028for (int i = 0; i < data.length; i++)2029data[i] *= (1.0 - (i / d_len));2030datab = data;2031}20322033// Make treble part2034{2035int fftlen = 4096 * 4;2036double[] data = new double[2 * fftlen];2037Random random = new Random(3049912);2038for (int i = 0; i < data.length; i += 2)2039data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2040fft(data);2041// Remove all negative frequency2042for (int i = fftlen / 2; i < data.length; i++)2043data[i] = 0;2044for (int i = 1024 * 4; i < 2048 * 4; i++)2045data[i] = 1.0 - (i - 4096) / 4096.0;2046for (int i = 0; i < 300; i++) {2047double g = (1.0 - (i / 300.0));2048data[i] *= 1.0 + 20 * g * g;2049}2050for (int i = 0; i < 24; i++)2051data[i] = 0;2052randomPhase(data, new Random(3049912));2053ifft(data);2054normalize(data, 0.9);2055data = realPart(data);2056double gain = 1.0;2057for (int i = 0; i < data.length; i++) {2058data[i] *= gain;2059gain *= 0.9998;2060}2061datah = data;2062}20632064for (int i = 0; i < datah.length; i++)2065datab[i] += datah[i];2066for (int i = 0; i < 5; i++)2067datab[i] *= i / 5.0;20682069SF2Sample sample = newSimpleDrumSample(sf2, "Snare Drum", datab);20702071SF2Layer layer = new SF2Layer(sf2);2072layer.setName("Snare Drum");20732074SF2GlobalRegion global = new SF2GlobalRegion();2075layer.setGlobalZone(global);2076sf2.addResource(layer);20772078SF2LayerRegion region = new SF2LayerRegion();2079region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2080region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2081region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);2082region.setSample(sample);2083layer.getRegions().add(region);20842085return layer;2086}20872088public static SF2Layer new_bass_drum(SF2Soundbank sf2) {20892090double[] datab;2091double[] datah;20922093// Make Bass Part2094{2095int fftlen = 4096 * 4;2096double[] data = new double[2 * fftlen];2097complexGaussianDist(data, 1.8 * 5 + 1, 2, 1);2098complexGaussianDist(data, 1.8 * 9 + 1, 2, 1);2099randomPhase(data, new Random(3049912));2100ifft(data);2101normalize(data, 0.9);2102data = realPart(data);2103double d_len = data.length;2104for (int i = 0; i < data.length; i++)2105data[i] *= (1.0 - (i / d_len));2106datab = data;2107}21082109// Make treble part2110{2111int fftlen = 4096;2112double[] data = new double[2 * fftlen];2113Random random = new Random(3049912);2114for (int i = 0; i < data.length; i += 2)2115data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2116fft(data);2117// Remove all negative frequency2118for (int i = fftlen / 2; i < data.length; i++)2119data[i] = 0;2120for (int i = 1024; i < 2048; i++)2121data[i] = 1.0 - (i - 1024) / 1024.0;2122for (int i = 0; i < 512; i++)2123data[i] = 10 * i / 512.0;2124for (int i = 0; i < 10; i++)2125data[i] = 0;2126randomPhase(data, new Random(3049912));2127ifft(data);2128normalize(data, 0.9);2129data = realPart(data);2130double gain = 1.0;2131for (int i = 0; i < data.length; i++) {2132data[i] *= gain;2133gain *= 0.999;2134}2135datah = data;2136}21372138for (int i = 0; i < datah.length; i++)2139datab[i] += datah[i] * 0.5;2140for (int i = 0; i < 5; i++)2141datab[i] *= i / 5.0;21422143SF2Sample sample = newSimpleDrumSample(sf2, "Bass Drum", datab);21442145SF2Layer layer = new SF2Layer(sf2);2146layer.setName("Bass Drum");21472148SF2GlobalRegion global = new SF2GlobalRegion();2149layer.setGlobalZone(global);2150sf2.addResource(layer);21512152SF2LayerRegion region = new SF2LayerRegion();2153region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2154region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2155region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);2156region.setSample(sample);2157layer.getRegions().add(region);21582159return layer;2160}21612162public static SF2Layer new_tom(SF2Soundbank sf2) {21632164double[] datab;2165double[] datah;21662167// Make Bass Part2168{2169int fftlen = 4096 * 4;2170double[] data = new double[2 * fftlen];2171complexGaussianDist(data, 30, 0.5, 1);2172randomPhase(data, new Random(3049912));2173ifft(data);2174normalize(data, 0.8);2175data = realPart(data);21762177double d_len = data.length;2178for (int i = 0; i < data.length; i++)2179data[i] *= (1.0 - (i / d_len));2180datab = data;2181}21822183// Make treble part2184{2185int fftlen = 4096 * 4;2186double[] data = new double[2 * fftlen];2187Random random = new Random(3049912);2188for (int i = 0; i < data.length; i += 2)2189data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2190fft(data);2191// Remove all negative frequency2192for (int i = fftlen / 2; i < data.length; i++)2193data[i] = 0;2194for (int i = 1024 * 4; i < 2048 * 4; i++)2195data[i] = 1.0 - (i - 4096) / 4096.0;2196for (int i = 0; i < 200; i++) {2197double g = (1.0 - (i / 200.0));2198data[i] *= 1.0 + 20 * g * g;2199}2200for (int i = 0; i < 30; i++)2201data[i] = 0;2202randomPhase(data, new Random(3049912));2203ifft(data);2204normalize(data, 0.9);2205data = realPart(data);2206double gain = 1.0;2207for (int i = 0; i < data.length; i++) {2208data[i] *= gain;2209gain *= 0.9996;2210}2211datah = data;2212}22132214for (int i = 0; i < datah.length; i++)2215datab[i] += datah[i] * 0.5;2216for (int i = 0; i < 5; i++)2217datab[i] *= i / 5.0;22182219normalize(datab, 0.99);22202221SF2Sample sample = newSimpleDrumSample(sf2, "Tom", datab);2222sample.setOriginalPitch(50);22232224SF2Layer layer = new SF2Layer(sf2);2225layer.setName("Tom");22262227SF2GlobalRegion global = new SF2GlobalRegion();2228layer.setGlobalZone(global);2229sf2.addResource(layer);22302231SF2LayerRegion region = new SF2LayerRegion();2232region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2233//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2234region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);2235region.setSample(sample);2236layer.getRegions().add(region);22372238return layer;2239}22402241public static SF2Layer new_closed_hihat(SF2Soundbank sf2) {2242double[] datah;22432244// Make treble part2245{2246int fftlen = 4096 * 4;2247double[] data = new double[2 * fftlen];2248Random random = new Random(3049912);2249for (int i = 0; i < data.length; i += 2)2250data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2251fft(data);2252// Remove all negative frequency2253for (int i = fftlen / 2; i < data.length; i++)2254data[i] = 0;2255for (int i = 1024 * 4; i < 2048 * 4; i++)2256data[i] = 1.0 - (i - 4096) / 4096.0;2257for (int i = 0; i < 2048; i++)2258data[i] = 0.2 + 0.8 * (i / 2048.0);2259randomPhase(data, new Random(3049912));2260ifft(data);2261normalize(data, 0.9);2262data = realPart(data);2263double gain = 1.0;2264for (int i = 0; i < data.length; i++) {2265data[i] *= gain;2266gain *= 0.9996;2267}2268datah = data;2269}22702271for (int i = 0; i < 5; i++)2272datah[i] *= i / 5.0;2273SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah);22742275SF2Layer layer = new SF2Layer(sf2);2276layer.setName("Closed Hi-Hat");22772278SF2GlobalRegion global = new SF2GlobalRegion();2279layer.setGlobalZone(global);2280sf2.addResource(layer);22812282SF2LayerRegion region = new SF2LayerRegion();2283region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2284region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2285region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);2286region.setSample(sample);2287layer.getRegions().add(region);22882289return layer;2290}22912292public static SF2Layer new_open_hihat(SF2Soundbank sf2) {2293double[] datah;2294{2295int fftlen = 4096 * 4;2296double[] data = new double[2 * fftlen];2297Random random = new Random(3049912);2298for (int i = 0; i < data.length; i += 2)2299data[i] = (2.0 * (random.nextDouble() - 0.5));2300for (int i = fftlen / 2; i < data.length; i++)2301data[i] = 0;2302for (int i = 0; i < 200; i++)2303data[i] = 0;2304for (int i = 0; i < 2048 * 4; i++) {2305double gain = (i / (2048.0 * 4.0));2306data[i] = gain;2307}2308datah = data;2309}23102311SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5);23122313SF2Layer layer = new SF2Layer(sf2);2314layer.setName("Open Hi-Hat");23152316SF2GlobalRegion global = new SF2GlobalRegion();2317layer.setGlobalZone(global);2318sf2.addResource(layer);23192320SF2LayerRegion region = new SF2LayerRegion();2321region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500);2322region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);2323region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500);2324region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);2325region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2326region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);2327region.setSample(sample);2328layer.getRegions().add(region);23292330return layer;2331}23322333public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) {2334double[] datah;2335{2336int fftlen = 4096 * 4;2337double[] data = new double[2 * fftlen];2338Random random = new Random(3049912);2339for (int i = 0; i < data.length; i += 2)2340data[i] = (2.0 * (random.nextDouble() - 0.5));2341for (int i = fftlen / 2; i < data.length; i++)2342data[i] = 0;2343for (int i = 0; i < 100; i++)2344data[i] = 0;2345for (int i = 0; i < 512 * 2; i++) {2346double gain = (i / (512.0 * 2.0));2347data[i] = gain;2348}2349datah = data;2350}23512352SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5);23532354SF2Layer layer = new SF2Layer(sf2);2355layer.setName("Crash Cymbal");23562357SF2GlobalRegion global = new SF2GlobalRegion();2358layer.setGlobalZone(global);2359sf2.addResource(layer);23602361SF2LayerRegion region = new SF2LayerRegion();2362region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800);2363region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);2364region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800);2365region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);2366region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2367region.setSample(sample);2368layer.getRegions().add(region);23692370return layer;2371}23722373public static SF2Layer new_side_stick(SF2Soundbank sf2) {2374double[] datab;23752376// Make treble part2377{2378int fftlen = 4096 * 4;2379double[] data = new double[2 * fftlen];2380Random random = new Random(3049912);2381for (int i = 0; i < data.length; i += 2)2382data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;2383fft(data);2384// Remove all negative frequency2385for (int i = fftlen / 2; i < data.length; i++)2386data[i] = 0;2387for (int i = 1024 * 4; i < 2048 * 4; i++)2388data[i] = 1.0 - (i - 4096) / 4096.0;2389for (int i = 0; i < 200; i++) {2390double g = (1.0 - (i / 200.0));2391data[i] *= 1.0 + 20 * g * g;2392}2393for (int i = 0; i < 30; i++)2394data[i] = 0;2395randomPhase(data, new Random(3049912));2396ifft(data);2397normalize(data, 0.9);2398data = realPart(data);2399double gain = 1.0;2400for (int i = 0; i < data.length; i++) {2401data[i] *= gain;2402gain *= 0.9996;2403}2404datab = data;2405}24062407for (int i = 0; i < 10; i++)2408datab[i] *= i / 10.0;24092410SF2Sample sample = newSimpleDrumSample(sf2, "Side Stick", datab);24112412SF2Layer layer = new SF2Layer(sf2);2413layer.setName("Side Stick");24142415SF2GlobalRegion global = new SF2GlobalRegion();2416layer.setGlobalZone(global);2417sf2.addResource(layer);24182419SF2LayerRegion region = new SF2LayerRegion();2420region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);2421region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);2422region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -50);2423region.setSample(sample);2424layer.getRegions().add(region);24252426return layer;24272428}24292430public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,2431double[] data, double base) {2432return newSimpleFFTSample(sf2, name, data, base, 10);2433}24342435public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,2436double[] data, double base, int fadeuptime) {24372438int fftsize = data.length / 2;2439AudioFormat format = new AudioFormat(44100, 16, 1, true, false);2440double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;24412442randomPhase(data);2443ifft(data);2444data = realPart(data);2445normalize(data, 0.9);2446float[] fdata = toFloat(data);2447fdata = loopExtend(fdata, fdata.length + 512);2448fadeUp(fdata, fadeuptime);2449byte[] bdata = toBytes(fdata, format);24502451/*2452* Create SoundFont2 sample.2453*/2454SF2Sample sample = new SF2Sample(sf2);2455sample.setName(name);2456sample.setData(bdata);2457sample.setStartLoop(256);2458sample.setEndLoop(fftsize + 256);2459sample.setSampleRate((long) format.getSampleRate());2460double orgnote = (69 + 12)2461+ (12 * Math.log(basefreq / 440.0) / Math.log(2));2462sample.setOriginalPitch((int) orgnote);2463sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));2464sf2.addResource(sample);24652466return sample;2467}24682469public static SF2Sample newSimpleFFTSample_dist(SF2Soundbank sf2,2470String name, double[] data, double base, double preamp) {24712472int fftsize = data.length / 2;2473AudioFormat format = new AudioFormat(44100, 16, 1, true, false);2474double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;24752476randomPhase(data);2477ifft(data);2478data = realPart(data);24792480for (int i = 0; i < data.length; i++) {2481data[i] = (1 - Math.exp(-Math.abs(data[i] * preamp)))2482* Math.signum(data[i]);2483}24842485normalize(data, 0.9);2486float[] fdata = toFloat(data);2487fdata = loopExtend(fdata, fdata.length + 512);2488fadeUp(fdata, 80);2489byte[] bdata = toBytes(fdata, format);24902491/*2492* Create SoundFont2 sample.2493*/2494SF2Sample sample = new SF2Sample(sf2);2495sample.setName(name);2496sample.setData(bdata);2497sample.setStartLoop(256);2498sample.setEndLoop(fftsize + 256);2499sample.setSampleRate((long) format.getSampleRate());2500double orgnote = (69 + 12)2501+ (12 * Math.log(basefreq / 440.0) / Math.log(2));2502sample.setOriginalPitch((int) orgnote);2503sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));2504sf2.addResource(sample);25052506return sample;2507}25082509public static SF2Sample newSimpleDrumSample(SF2Soundbank sf2, String name,2510double[] data) {25112512int fftsize = data.length;2513AudioFormat format = new AudioFormat(44100, 16, 1, true, false);25142515byte[] bdata = toBytes(toFloat(realPart(data)), format);25162517/*2518* Create SoundFont2 sample.2519*/2520SF2Sample sample = new SF2Sample(sf2);2521sample.setName(name);2522sample.setData(bdata);2523sample.setStartLoop(256);2524sample.setEndLoop(fftsize + 256);2525sample.setSampleRate((long) format.getSampleRate());2526sample.setOriginalPitch(60);2527sf2.addResource(sample);25282529return sample;2530}25312532public static SF2Layer newLayer(SF2Soundbank sf2, String name, SF2Sample sample) {2533SF2LayerRegion region = new SF2LayerRegion();2534region.setSample(sample);25352536SF2Layer layer = new SF2Layer(sf2);2537layer.setName(name);2538layer.getRegions().add(region);2539sf2.addResource(layer);25402541return layer;2542}25432544public static SF2Instrument newInstrument(SF2Soundbank sf2, String name,2545Patch patch, SF2Layer... layers) {25462547/*2548* Create SoundFont2 instrument.2549*/2550SF2Instrument ins = new SF2Instrument(sf2);2551ins.setPatch(patch);2552ins.setName(name);2553sf2.addInstrument(ins);25542555/*2556* Create region for instrument.2557*/2558for (int i = 0; i < layers.length; i++) {2559SF2InstrumentRegion insregion = new SF2InstrumentRegion();2560insregion.setLayer(layers[i]);2561ins.getRegions().add(insregion);2562}25632564return ins;2565}25662567public static void ifft(double[] data) {2568new FFT(data.length / 2, 1).transform(data);2569}25702571public static void fft(double[] data) {2572new FFT(data.length / 2, -1).transform(data);2573}25742575public static void complexGaussianDist(double[] cdata, double m,2576double s, double v) {2577for (int x = 0; x < cdata.length / 4; x++) {2578cdata[x * 2] += v * (1.0 / (s * Math.sqrt(2 * Math.PI))2579* Math.exp((-1.0 / 2.0) * Math.pow((x - m) / s, 2.0)));2580}2581}25822583public static void randomPhase(double[] data) {2584for (int i = 0; i < data.length; i += 2) {2585double phase = Math.random() * 2 * Math.PI;2586double d = data[i];2587data[i] = Math.sin(phase) * d;2588data[i + 1] = Math.cos(phase) * d;2589}2590}25912592public static void randomPhase(double[] data, Random random) {2593for (int i = 0; i < data.length; i += 2) {2594double phase = random.nextDouble() * 2 * Math.PI;2595double d = data[i];2596data[i] = Math.sin(phase) * d;2597data[i + 1] = Math.cos(phase) * d;2598}2599}26002601public static void normalize(double[] data, double target) {2602double maxvalue = 0;2603for (int i = 0; i < data.length; i++) {2604if (data[i] > maxvalue)2605maxvalue = data[i];2606if (-data[i] > maxvalue)2607maxvalue = -data[i];2608}2609if (maxvalue == 0)2610return;2611double gain = target / maxvalue;2612for (int i = 0; i < data.length; i++)2613data[i] *= gain;2614}26152616public static void normalize(float[] data, double target) {2617double maxvalue = 0.5;2618for (int i = 0; i < data.length; i++) {2619if (data[i * 2] > maxvalue)2620maxvalue = data[i * 2];2621if (-data[i * 2] > maxvalue)2622maxvalue = -data[i * 2];2623}2624double gain = target / maxvalue;2625for (int i = 0; i < data.length; i++)2626data[i * 2] *= gain;2627}26282629public static double[] realPart(double[] in) {2630double[] out = new double[in.length / 2];2631for (int i = 0; i < out.length; i++) {2632out[i] = in[i * 2];2633}2634return out;2635}26362637public static double[] imgPart(double[] in) {2638double[] out = new double[in.length / 2];2639for (int i = 0; i < out.length; i++) {2640out[i] = in[i * 2];2641}2642return out;2643}26442645public static float[] toFloat(double[] in) {2646float[] out = new float[in.length];2647for (int i = 0; i < out.length; i++) {2648out[i] = (float) in[i];2649}2650return out;2651}26522653public static byte[] toBytes(float[] in, AudioFormat format) {2654byte[] out = new byte[in.length * format.getFrameSize()];2655return AudioFloatConverter.getConverter(format).toByteArray(in, out);2656}26572658public static void fadeUp(double[] data, int samples) {2659double dsamples = samples;2660for (int i = 0; i < samples; i++)2661data[i] *= i / dsamples;2662}26632664public static void fadeUp(float[] data, int samples) {2665double dsamples = samples;2666for (int i = 0; i < samples; i++)2667data[i] *= i / dsamples;2668}26692670public static double[] loopExtend(double[] data, int newsize) {2671double[] outdata = new double[newsize];2672int p_len = data.length;2673int p_ps = 0;2674for (int i = 0; i < outdata.length; i++) {2675outdata[i] = data[p_ps];2676p_ps++;2677if (p_ps == p_len)2678p_ps = 0;2679}2680return outdata;2681}26822683public static float[] loopExtend(float[] data, int newsize) {2684float[] outdata = new float[newsize];2685int p_len = data.length;2686int p_ps = 0;2687for (int i = 0; i < outdata.length; i++) {2688outdata[i] = data[p_ps];2689p_ps++;2690if (p_ps == p_len)2691p_ps = 0;2692}2693return outdata;2694}2695}269626972698