1 /*
   2  * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package com.sun.media.sound;
  26 
  27 import java.util.Random;
  28 
  29 import javax.sound.midi.Patch;
  30 import javax.sound.sampled.AudioFormat;
  31 
  32 /**
  33  * Emergency Soundbank generator.
  34  * Used when no other default soundbank can be found.
  35  *
  36  * @author Karl Helgason
  37  */
  38 public final class EmergencySoundbank {
  39 
  40     private final static 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     };
 170 
 171     public static SF2Soundbank createSoundbank() throws Exception {
 172         SF2Soundbank sf2 = new SF2Soundbank();
 173         sf2.setName("Emergency GM sound set");
 174         sf2.setVendor("Generated");
 175         sf2.setDescription("Emergency generated soundbank");
 176 
 177         /*
 178          *  percussion instruments
 179          */
 180 
 181         SF2Layer bass_drum = new_bass_drum(sf2);
 182         SF2Layer snare_drum = new_snare_drum(sf2);
 183         SF2Layer tom = new_tom(sf2);
 184         SF2Layer open_hihat = new_open_hihat(sf2);
 185         SF2Layer closed_hihat = new_closed_hihat(sf2);
 186         SF2Layer crash_cymbal = new_crash_cymbal(sf2);
 187         SF2Layer side_stick = new_side_stick(sf2);
 188 
 189         SF2Layer[] drums = new SF2Layer[128];
 190         drums[35] = bass_drum;
 191         drums[36] = bass_drum;
 192         drums[38] = snare_drum;
 193         drums[40] = snare_drum;
 194         drums[41] = tom;
 195         drums[43] = tom;
 196         drums[45] = tom;
 197         drums[47] = tom;
 198         drums[48] = tom;
 199         drums[50] = tom;
 200         drums[42] = closed_hihat;
 201         drums[44] = closed_hihat;
 202         drums[46] = open_hihat;
 203         drums[49] = crash_cymbal;
 204         drums[51] = crash_cymbal;
 205         drums[52] = crash_cymbal;
 206         drums[55] = crash_cymbal;
 207         drums[57] = crash_cymbal;
 208         drums[59] = crash_cymbal;
 209 
 210         // Use side_stick for missing drums:
 211         drums[37] = side_stick;
 212         drums[39] = side_stick;
 213         drums[53] = side_stick;
 214         drums[54] = side_stick;
 215         drums[56] = side_stick;
 216         drums[58] = side_stick;
 217         drums[69] = side_stick;
 218         drums[70] = side_stick;
 219         drums[75] = side_stick;
 220         drums[60] = side_stick;
 221         drums[61] = side_stick;
 222         drums[62] = side_stick;
 223         drums[63] = side_stick;
 224         drums[64] = side_stick;
 225         drums[65] = side_stick;
 226         drums[66] = side_stick;
 227         drums[67] = side_stick;
 228         drums[68] = side_stick;
 229         drums[71] = side_stick;
 230         drums[72] = side_stick;
 231         drums[73] = side_stick;
 232         drums[74] = side_stick;
 233         drums[76] = side_stick;
 234         drums[77] = side_stick;
 235         drums[78] = side_stick;
 236         drums[79] = side_stick;
 237         drums[80] = side_stick;
 238         drums[81] = side_stick;
 239 
 240 
 241         SF2Instrument drum_instrument = new SF2Instrument(sf2);
 242         drum_instrument.setName("Standard Kit");
 243         drum_instrument.setPatch(new ModelPatch(0, 0, true));
 244         sf2.addInstrument(drum_instrument);
 245         for (int i = 0; i < drums.length; i++) {
 246             if (drums[i] != null) {
 247                 SF2InstrumentRegion region = new SF2InstrumentRegion();
 248                 region.setLayer(drums[i]);
 249                 region.putBytes(SF2InstrumentRegion.GENERATOR_KEYRANGE,
 250                         new byte[]{(byte) i, (byte) i});
 251                 drum_instrument.getRegions().add(region);
 252             }
 253         }
 254 
 255 
 256         /*
 257          *  melodic instruments
 258          */
 259 
 260         SF2Layer gpiano = new_gpiano(sf2);
 261         SF2Layer gpiano2 = new_gpiano2(sf2);
 262         SF2Layer gpiano_hammer = new_piano_hammer(sf2);
 263         SF2Layer piano1 = new_piano1(sf2);
 264         SF2Layer epiano1 = new_epiano1(sf2);
 265         SF2Layer epiano2 = new_epiano2(sf2);
 266 
 267         SF2Layer guitar = new_guitar1(sf2);
 268         SF2Layer guitar_pick = new_guitar_pick(sf2);
 269         SF2Layer guitar_dist = new_guitar_dist(sf2);
 270         SF2Layer bass1 = new_bass1(sf2);
 271         SF2Layer bass2 = new_bass2(sf2);
 272         SF2Layer synthbass = new_synthbass(sf2);
 273         SF2Layer string2 = new_string2(sf2);
 274         SF2Layer orchhit = new_orchhit(sf2);
 275         SF2Layer choir = new_choir(sf2);
 276         SF2Layer solostring = new_solostring(sf2);
 277         SF2Layer organ = new_organ(sf2);
 278         SF2Layer ch_organ = new_ch_organ(sf2);
 279         SF2Layer bell = new_bell(sf2);
 280         SF2Layer flute = new_flute(sf2);
 281 
 282         SF2Layer timpani = new_timpani(sf2);
 283         SF2Layer melodic_toms = new_melodic_toms(sf2);
 284         SF2Layer trumpet = new_trumpet(sf2);
 285         SF2Layer trombone = new_trombone(sf2);
 286         SF2Layer brass_section = new_brass_section(sf2);
 287         SF2Layer horn = new_horn(sf2);
 288         SF2Layer sax = new_sax(sf2);
 289         SF2Layer oboe = new_oboe(sf2);
 290         SF2Layer bassoon = new_bassoon(sf2);
 291         SF2Layer clarinet = new_clarinet(sf2);
 292         SF2Layer reverse_cymbal = new_reverse_cymbal(sf2);
 293 
 294         SF2Layer defaultsound = piano1;
 295 
 296         newInstrument(sf2, "Piano", new Patch(0, 0), gpiano, gpiano_hammer);
 297         newInstrument(sf2, "Piano", new Patch(0, 1), gpiano2, gpiano_hammer);
 298         newInstrument(sf2, "Piano", new Patch(0, 2), piano1);
 299         {
 300             SF2Instrument ins = newInstrument(sf2, "Honky-tonk Piano",
 301                     new Patch(0, 3), piano1, piano1);
 302             SF2InstrumentRegion region = ins.getRegions().get(0);
 303             region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 80);
 304             region.putInteger(SF2Region.GENERATOR_FINETUNE, 30);
 305             region = ins.getRegions().get(1);
 306             region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 30);
 307         }
 308         newInstrument(sf2, "Rhodes", new Patch(0, 4), epiano2);
 309         newInstrument(sf2, "Rhodes", new Patch(0, 5), epiano2);
 310         newInstrument(sf2, "Clavinet", new Patch(0, 6), epiano1);
 311         newInstrument(sf2, "Clavinet", new Patch(0, 7), epiano1);
 312         newInstrument(sf2, "Rhodes", new Patch(0, 8), epiano2);
 313         newInstrument(sf2, "Bell", new Patch(0, 9), bell);
 314         newInstrument(sf2, "Bell", new Patch(0, 10), bell);
 315         newInstrument(sf2, "Vibraphone", new Patch(0, 11), bell);
 316         newInstrument(sf2, "Marimba", new Patch(0, 12), bell);
 317         newInstrument(sf2, "Marimba", new Patch(0, 13), bell);
 318         newInstrument(sf2, "Bell", new Patch(0, 14), bell);
 319         newInstrument(sf2, "Rock Organ", new Patch(0, 15), organ);
 320         newInstrument(sf2, "Rock Organ", new Patch(0, 16), organ);
 321         newInstrument(sf2, "Perc Organ", new Patch(0, 17), organ);
 322         newInstrument(sf2, "Rock Organ", new Patch(0, 18), organ);
 323         newInstrument(sf2, "Church Organ", new Patch(0, 19), ch_organ);
 324         newInstrument(sf2, "Accordion", new Patch(0, 20), organ);
 325         newInstrument(sf2, "Accordion", new Patch(0, 21), organ);
 326         newInstrument(sf2, "Accordion", new Patch(0, 22), organ);
 327         newInstrument(sf2, "Accordion", new Patch(0, 23), organ);
 328         newInstrument(sf2, "Guitar", new Patch(0, 24), guitar, guitar_pick);
 329         newInstrument(sf2, "Guitar", new Patch(0, 25), guitar, guitar_pick);
 330         newInstrument(sf2, "Guitar", new Patch(0, 26), guitar, guitar_pick);
 331         newInstrument(sf2, "Guitar", new Patch(0, 27), guitar, guitar_pick);
 332         newInstrument(sf2, "Guitar", new Patch(0, 28), guitar, guitar_pick);
 333         newInstrument(sf2, "Distorted Guitar", new Patch(0, 29), guitar_dist);
 334         newInstrument(sf2, "Distorted Guitar", new Patch(0, 30), guitar_dist);
 335         newInstrument(sf2, "Guitar", new Patch(0, 31), guitar, guitar_pick);
 336         newInstrument(sf2, "Finger Bass", new Patch(0, 32), bass1);
 337         newInstrument(sf2, "Finger Bass", new Patch(0, 33), bass1);
 338         newInstrument(sf2, "Finger Bass", new Patch(0, 34), bass1);
 339         newInstrument(sf2, "Frettless Bass", new Patch(0, 35), bass2);
 340         newInstrument(sf2, "Frettless Bass", new Patch(0, 36), bass2);
 341         newInstrument(sf2, "Frettless Bass", new Patch(0, 37), bass2);
 342         newInstrument(sf2, "Synth Bass1", new Patch(0, 38), synthbass);
 343         newInstrument(sf2, "Synth Bass2", new Patch(0, 39), synthbass);
 344         newInstrument(sf2, "Solo String", new Patch(0, 40), string2, solostring);
 345         newInstrument(sf2, "Solo String", new Patch(0, 41), string2, solostring);
 346         newInstrument(sf2, "Solo String", new Patch(0, 42), string2, solostring);
 347         newInstrument(sf2, "Solo String", new Patch(0, 43), string2, solostring);
 348         newInstrument(sf2, "Solo String", new Patch(0, 44), string2, solostring);
 349         newInstrument(sf2, "Def", new Patch(0, 45), defaultsound);
 350         newInstrument(sf2, "Harp", new Patch(0, 46), bell);
 351         newInstrument(sf2, "Timpani", new Patch(0, 47), timpani);
 352         newInstrument(sf2, "Strings", new Patch(0, 48), string2);
 353         SF2Instrument slow_strings =
 354                 newInstrument(sf2, "Slow Strings", new Patch(0, 49), string2);
 355         SF2InstrumentRegion region = slow_strings.getRegions().get(0);
 356         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, 2500);
 357         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 2000);
 358         newInstrument(sf2, "Synth Strings", new Patch(0, 50), string2);
 359         newInstrument(sf2, "Synth Strings", new Patch(0, 51), string2);
 360 
 361 
 362         newInstrument(sf2, "Choir", new Patch(0, 52), choir);
 363         newInstrument(sf2, "Choir", new Patch(0, 53), choir);
 364         newInstrument(sf2, "Choir", new Patch(0, 54), choir);
 365         {
 366             SF2Instrument ins = newInstrument(sf2, "Orch Hit",
 367                     new Patch(0, 55), orchhit, orchhit, timpani);
 368             region = ins.getRegions().get(0);
 369             region.putInteger(SF2Region.GENERATOR_COARSETUNE, -12);
 370             region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
 371         }
 372         newInstrument(sf2, "Trumpet", new Patch(0, 56), trumpet);
 373         newInstrument(sf2, "Trombone", new Patch(0, 57), trombone);
 374         newInstrument(sf2, "Trombone", new Patch(0, 58), trombone);
 375         newInstrument(sf2, "Trumpet", new Patch(0, 59), trumpet);
 376         newInstrument(sf2, "Horn", new Patch(0, 60), horn);
 377         newInstrument(sf2, "Brass Section", new Patch(0, 61), brass_section);
 378         newInstrument(sf2, "Brass Section", new Patch(0, 62), brass_section);
 379         newInstrument(sf2, "Brass Section", new Patch(0, 63), brass_section);
 380         newInstrument(sf2, "Sax", new Patch(0, 64), sax);
 381         newInstrument(sf2, "Sax", new Patch(0, 65), sax);
 382         newInstrument(sf2, "Sax", new Patch(0, 66), sax);
 383         newInstrument(sf2, "Sax", new Patch(0, 67), sax);
 384         newInstrument(sf2, "Oboe", new Patch(0, 68), oboe);
 385         newInstrument(sf2, "Horn", new Patch(0, 69), horn);
 386         newInstrument(sf2, "Bassoon", new Patch(0, 70), bassoon);
 387         newInstrument(sf2, "Clarinet", new Patch(0, 71), clarinet);
 388         newInstrument(sf2, "Flute", new Patch(0, 72), flute);
 389         newInstrument(sf2, "Flute", new Patch(0, 73), flute);
 390         newInstrument(sf2, "Flute", new Patch(0, 74), flute);
 391         newInstrument(sf2, "Flute", new Patch(0, 75), flute);
 392         newInstrument(sf2, "Flute", new Patch(0, 76), flute);
 393         newInstrument(sf2, "Flute", new Patch(0, 77), flute);
 394         newInstrument(sf2, "Flute", new Patch(0, 78), flute);
 395         newInstrument(sf2, "Flute", new Patch(0, 79), flute);
 396         newInstrument(sf2, "Organ", new Patch(0, 80), organ);
 397         newInstrument(sf2, "Organ", new Patch(0, 81), organ);
 398         newInstrument(sf2, "Flute", new Patch(0, 82), flute);
 399         newInstrument(sf2, "Organ", new Patch(0, 83), organ);
 400         newInstrument(sf2, "Organ", new Patch(0, 84), organ);
 401         newInstrument(sf2, "Choir", new Patch(0, 85), choir);
 402         newInstrument(sf2, "Organ", new Patch(0, 86), organ);
 403         newInstrument(sf2, "Organ", new Patch(0, 87), organ);
 404         newInstrument(sf2, "Synth Strings", new Patch(0, 88), string2);
 405         newInstrument(sf2, "Organ", new Patch(0, 89), organ);
 406         newInstrument(sf2, "Def", new Patch(0, 90), defaultsound);
 407         newInstrument(sf2, "Choir", new Patch(0, 91), choir);
 408         newInstrument(sf2, "Organ", new Patch(0, 92), organ);
 409         newInstrument(sf2, "Organ", new Patch(0, 93), organ);
 410         newInstrument(sf2, "Organ", new Patch(0, 94), organ);
 411         newInstrument(sf2, "Organ", new Patch(0, 95), organ);
 412         newInstrument(sf2, "Organ", new Patch(0, 96), organ);
 413         newInstrument(sf2, "Organ", new Patch(0, 97), organ);
 414         newInstrument(sf2, "Bell", new Patch(0, 98), bell);
 415         newInstrument(sf2, "Organ", new Patch(0, 99), organ);
 416         newInstrument(sf2, "Organ", new Patch(0, 100), organ);
 417         newInstrument(sf2, "Organ", new Patch(0, 101), organ);
 418         newInstrument(sf2, "Def", new Patch(0, 102), defaultsound);
 419         newInstrument(sf2, "Synth Strings", new Patch(0, 103), string2);
 420         newInstrument(sf2, "Def", new Patch(0, 104), defaultsound);
 421         newInstrument(sf2, "Def", new Patch(0, 105), defaultsound);
 422         newInstrument(sf2, "Def", new Patch(0, 106), defaultsound);
 423         newInstrument(sf2, "Def", new Patch(0, 107), defaultsound);
 424         newInstrument(sf2, "Marimba", new Patch(0, 108), bell);
 425         newInstrument(sf2, "Sax", new Patch(0, 109), sax);
 426         newInstrument(sf2, "Solo String", new Patch(0, 110), string2, solostring);
 427         newInstrument(sf2, "Oboe", new Patch(0, 111), oboe);
 428         newInstrument(sf2, "Bell", new Patch(0, 112), bell);
 429         newInstrument(sf2, "Melodic Toms", new Patch(0, 113), melodic_toms);
 430         newInstrument(sf2, "Marimba", new Patch(0, 114), bell);
 431         newInstrument(sf2, "Melodic Toms", new Patch(0, 115), melodic_toms);
 432         newInstrument(sf2, "Melodic Toms", new Patch(0, 116), melodic_toms);
 433         newInstrument(sf2, "Melodic Toms", new Patch(0, 117), melodic_toms);
 434         newInstrument(sf2, "Reverse Cymbal", new Patch(0, 118), reverse_cymbal);
 435         newInstrument(sf2, "Reverse Cymbal", new Patch(0, 119), reverse_cymbal);
 436         newInstrument(sf2, "Guitar", new Patch(0, 120), guitar);
 437         newInstrument(sf2, "Def", new Patch(0, 121), defaultsound);
 438         {
 439             SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",
 440                     new Patch(0, 122), reverse_cymbal);
 441             region = ins.getRegions().get(0);
 442             region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 443             region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);
 444             region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);
 445             region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);
 446         }
 447         {
 448             SF2Instrument ins = newInstrument(sf2, "Bird/Flute",
 449                     new Patch(0, 123), flute);
 450             region = ins.getRegions().get(0);
 451             region.putInteger(SF2Region.GENERATOR_COARSETUNE, 24);
 452             region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -3000);
 453             region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 454         }
 455         newInstrument(sf2, "Def", new Patch(0, 124), side_stick);
 456         {
 457             SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",
 458                     new Patch(0, 125), reverse_cymbal);
 459             region = ins.getRegions().get(0);
 460             region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 461             region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);
 462             region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);
 463             region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);
 464         }
 465         newInstrument(sf2, "Applause/crash_cymbal",
 466                 new Patch(0, 126), crash_cymbal);
 467         newInstrument(sf2, "Gunshot/side_stick", new Patch(0, 127), side_stick);
 468 
 469         for (SF2Instrument instrument : sf2.getInstruments()) {
 470             Patch patch = instrument.getPatch();
 471             if (patch instanceof ModelPatch) {
 472                 if (((ModelPatch) patch).isPercussion())
 473                     continue;
 474             }
 475             instrument.setName(general_midi_instruments[patch.getProgram()]);
 476         }
 477 
 478         return sf2;
 479 
 480     }
 481 
 482     public static SF2Layer new_bell(SF2Soundbank sf2) {
 483         Random random = new Random(102030201);
 484         int x = 8;
 485         int fftsize = 4096 * x;
 486         double[] data = new double[fftsize * 2];
 487         double base = x * 25;
 488         double start_w = 0.01;
 489         double end_w = 0.05;
 490         double start_a = 0.2;
 491         double end_a = 0.00001;
 492         double a = start_a;
 493         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
 494         for (int i = 0; i < 40; i++) {
 495             double detune = 1 + (random.nextDouble() * 2 - 1) * 0.01;
 496             double w = start_w + (end_w - start_w) * (i / 40.0);
 497             complexGaussianDist(data, base * (i + 1) * detune, w, a);
 498             a *= a_step;
 499         }
 500         SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);
 501         SF2Layer layer = newLayer(sf2, "EPiano", sample);
 502         SF2Region region = layer.getRegions().get(0);
 503         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 504         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
 505         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 506         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
 507         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 508         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);
 509         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 510         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);
 511         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
 512         return layer;
 513     }
 514 
 515     public static SF2Layer new_guitar1(SF2Soundbank sf2) {
 516 
 517         int x = 8;
 518         int fftsize = 4096 * x;
 519         double[] data = new double[fftsize * 2];
 520         double base = x * 25;
 521         double start_w = 0.01;
 522         double end_w = 0.01;
 523         double start_a = 2;
 524         double end_a = 0.01;
 525         double a = start_a;
 526         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
 527 
 528         double[] aa = new double[40];
 529         for (int i = 0; i < 40; i++) {
 530             aa[i] = a;
 531             a *= a_step;
 532         }
 533 
 534         aa[0] = 2;
 535         aa[1] = 0.5;
 536         aa[2] = 0.45;
 537         aa[3] = 0.2;
 538         aa[4] = 1;
 539         aa[5] = 0.5;
 540         aa[6] = 2;
 541         aa[7] = 1;
 542         aa[8] = 0.5;
 543         aa[9] = 1;
 544         aa[9] = 0.5;
 545         aa[10] = 0.2;
 546         aa[11] = 1;
 547         aa[12] = 0.7;
 548         aa[13] = 0.5;
 549         aa[14] = 1;
 550 
 551         for (int i = 0; i < 40; i++) {
 552             double w = start_w + (end_w - start_w) * (i / 40.0);
 553             complexGaussianDist(data, base * (i + 1), w, aa[i]);
 554         }
 555 
 556         SF2Sample sample = newSimpleFFTSample(sf2, "Guitar", data, base);
 557         SF2Layer layer = newLayer(sf2, "Guitar", sample);
 558         SF2Region region = layer.getRegions().get(0);
 559         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 560         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
 561         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 562         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);
 563         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 564 
 565         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);
 566         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 567         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -6000);
 568         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
 569         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);
 570         return layer;
 571     }
 572 
 573     public static SF2Layer new_guitar_dist(SF2Soundbank sf2) {
 574 
 575         int x = 8;
 576         int fftsize = 4096 * x;
 577         double[] data = new double[fftsize * 2];
 578         double base = x * 25;
 579         double start_w = 0.01;
 580         double end_w = 0.01;
 581         double start_a = 2;
 582         double end_a = 0.01;
 583         double a = start_a;
 584         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
 585 
 586         double[] aa = new double[40];
 587         for (int i = 0; i < 40; i++) {
 588             aa[i] = a;
 589             a *= a_step;
 590         }
 591 
 592         aa[0] = 5;
 593         aa[1] = 2;
 594         aa[2] = 0.45;
 595         aa[3] = 0.2;
 596         aa[4] = 1;
 597         aa[5] = 0.5;
 598         aa[6] = 2;
 599         aa[7] = 1;
 600         aa[8] = 0.5;
 601         aa[9] = 1;
 602         aa[9] = 0.5;
 603         aa[10] = 0.2;
 604         aa[11] = 1;
 605         aa[12] = 0.7;
 606         aa[13] = 0.5;
 607         aa[14] = 1;
 608 
 609         for (int i = 0; i < 40; i++) {
 610             double w = start_w + (end_w - start_w) * (i / 40.0);
 611             complexGaussianDist(data, base * (i + 1), w, aa[i]);
 612         }
 613 
 614 
 615         SF2Sample sample = newSimpleFFTSample_dist(sf2, "Distorted Guitar",
 616                 data, base, 10000.0);
 617 
 618 
 619         SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample);
 620         SF2Region region = layer.getRegions().get(0);
 621         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 622         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
 623         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 624         //region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);
 625         //region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200);
 626 
 627         //region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);
 628         //region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 629         //region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000);
 630         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);
 631         //region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);
 632         return layer;
 633     }
 634 
 635     public static SF2Layer new_guitar_pick(SF2Soundbank sf2) {
 636 
 637         double datab[];
 638 
 639         // Make treble part
 640         {
 641             int m = 2;
 642             int fftlen = 4096 * m;
 643             double[] data = new double[2 * fftlen];
 644             Random random = new Random(3049912);
 645             for (int i = 0; i < data.length; i += 2)
 646                 data[i] = (2.0 * (random.nextDouble() - 0.5));
 647             fft(data);
 648             // Remove all negative frequency
 649             for (int i = fftlen / 2; i < data.length; i++)
 650                 data[i] = 0;
 651             for (int i = 0; i < 2048 * m; i++) {
 652                 data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2)
 653                         + Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9);
 654             }
 655             randomPhase(data, new Random(3049912));
 656             ifft(data);
 657             normalize(data, 0.8);
 658             data = realPart(data);
 659             double gain = 1.0;
 660             for (int i = 0; i < data.length; i++) {
 661                 data[i] *= gain;
 662                 gain *= 0.9994;
 663             }
 664             datab = data;
 665 
 666             fadeUp(data, 80);
 667         }
 668 
 669         SF2Sample sample = newSimpleDrumSample(sf2, "Guitar Noise", datab);
 670 
 671         SF2Layer layer = new SF2Layer(sf2);
 672         layer.setName("Guitar Noise");
 673 
 674         SF2GlobalRegion global = new SF2GlobalRegion();
 675         layer.setGlobalZone(global);
 676         sf2.addResource(layer);
 677 
 678         SF2LayerRegion region = new SF2LayerRegion();
 679         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
 680         //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
 681 //        region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
 682 /*
 683         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);
 684         region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);
 685         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 686         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);
 687         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);
 688          */
 689 
 690         region.setSample(sample);
 691         layer.getRegions().add(region);
 692 
 693         return layer;
 694     }
 695 
 696     public static SF2Layer new_gpiano(SF2Soundbank sf2) {
 697         //Random random = new Random(302030201);
 698         int x = 8;
 699         int fftsize = 4096 * x;
 700         double[] data = new double[fftsize * 2];
 701         double base = x * 25;
 702         double start_a = 0.2;
 703         double end_a = 0.001;
 704         double a = start_a;
 705         double a_step = Math.pow(end_a / start_a, 1.0 / 15.0);
 706 
 707         double[] aa = new double[30];
 708         for (int i = 0; i < 30; i++) {
 709             aa[i] = a;
 710             a *= a_step;
 711         }
 712 
 713         aa[0] *= 2;
 714         //aa[2] *= 0.1;
 715         aa[4] *= 2;
 716 
 717 
 718         aa[12] *= 0.9;
 719         aa[13] *= 0.7;
 720         for (int i = 14; i < 30; i++) {
 721             aa[i] *= 0.5;
 722         }
 723 
 724 
 725         for (int i = 0; i < 30; i++) {
 726             //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;
 727             double w = 0.2;
 728             double ai = aa[i];
 729             if (i > 10) {
 730                 w = 5;
 731                 ai *= 10;
 732             }
 733             int adjust = 0;
 734             if (i > 5) {
 735                 adjust = (i - 5) * 7;
 736             }
 737             complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
 738         }
 739 
 740         SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);
 741         SF2Layer layer = newLayer(sf2, "Grand Piano", sample);
 742         SF2Region region = layer.getRegions().get(0);
 743         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 744         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);
 745         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 746         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
 747         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 748         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
 749         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 750         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
 751         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);
 752         return layer;
 753     }
 754 
 755     public static SF2Layer new_gpiano2(SF2Soundbank sf2) {
 756         //Random random = new Random(302030201);
 757         int x = 8;
 758         int fftsize = 4096 * x;
 759         double[] data = new double[fftsize * 2];
 760         double base = x * 25;
 761         double start_a = 0.2;
 762         double end_a = 0.001;
 763         double a = start_a;
 764         double a_step = Math.pow(end_a / start_a, 1.0 / 20.0);
 765 
 766         double[] aa = new double[30];
 767         for (int i = 0; i < 30; i++) {
 768             aa[i] = a;
 769             a *= a_step;
 770         }
 771 
 772         aa[0] *= 1;
 773         //aa[2] *= 0.1;
 774         aa[4] *= 2;
 775 
 776 
 777         aa[12] *= 0.9;
 778         aa[13] *= 0.7;
 779         for (int i = 14; i < 30; i++) {
 780             aa[i] *= 0.5;
 781         }
 782 
 783 
 784         for (int i = 0; i < 30; i++) {
 785             //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;
 786             double w = 0.2;
 787             double ai = aa[i];
 788             if (i > 10) {
 789                 w = 5;
 790                 ai *= 10;
 791             }
 792             int adjust = 0;
 793             if (i > 5) {
 794                 adjust = (i - 5) * 7;
 795             }
 796             complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
 797         }
 798 
 799         SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);
 800         SF2Layer layer = newLayer(sf2, "Grand Piano", sample);
 801         SF2Region region = layer.getRegions().get(0);
 802         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 803         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);
 804         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 805         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
 806         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 807         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
 808         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 809         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
 810         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);
 811         return layer;
 812     }
 813 
 814     public static SF2Layer new_piano_hammer(SF2Soundbank sf2) {
 815 
 816         double datab[];
 817 
 818         // Make treble part
 819         {
 820             int m = 2;
 821             int fftlen = 4096 * m;
 822             double[] data = new double[2 * fftlen];
 823             Random random = new Random(3049912);
 824             for (int i = 0; i < data.length; i += 2)
 825                 data[i] = (2.0 * (random.nextDouble() - 0.5));
 826             fft(data);
 827             // Remove all negative frequency
 828             for (int i = fftlen / 2; i < data.length; i++)
 829                 data[i] = 0;
 830             for (int i = 0; i < 2048 * m; i++)
 831                 data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05);
 832             randomPhase(data, new Random(3049912));
 833             ifft(data);
 834             normalize(data, 0.6);
 835             data = realPart(data);
 836             double gain = 1.0;
 837             for (int i = 0; i < data.length; i++) {
 838                 data[i] *= gain;
 839                 gain *= 0.9997;
 840             }
 841             datab = data;
 842 
 843             fadeUp(data, 80);
 844         }
 845 
 846         SF2Sample sample = newSimpleDrumSample(sf2, "Piano Hammer", datab);
 847 
 848         SF2Layer layer = new SF2Layer(sf2);
 849         layer.setName("Piano Hammer");
 850 
 851         SF2GlobalRegion global = new SF2GlobalRegion();
 852         layer.setGlobalZone(global);
 853         sf2.addResource(layer);
 854 
 855         SF2LayerRegion region = new SF2LayerRegion();
 856         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
 857         //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
 858 /*
 859         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);
 860         region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);
 861         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 862         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);
 863         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);
 864          */
 865 
 866         region.setSample(sample);
 867         layer.getRegions().add(region);
 868 
 869         return layer;
 870     }
 871 
 872     public static SF2Layer new_piano1(SF2Soundbank sf2) {
 873         //Random random = new Random(302030201);
 874         int x = 8;
 875         int fftsize = 4096 * x;
 876         double[] data = new double[fftsize * 2];
 877         double base = x * 25;
 878         double start_a = 0.2;
 879         double end_a = 0.0001;
 880         double a = start_a;
 881         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
 882 
 883         double[] aa = new double[30];
 884         for (int i = 0; i < 30; i++) {
 885             aa[i] = a;
 886             a *= a_step;
 887         }
 888 
 889         aa[0] *= 5;
 890         aa[2] *= 0.1;
 891         aa[7] *= 5;
 892 
 893 
 894         for (int i = 0; i < 30; i++) {
 895             //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;
 896             double w = 0.2;
 897             double ai = aa[i];
 898             if (i > 12) {
 899                 w = 5;
 900                 ai *= 10;
 901             }
 902             int adjust = 0;
 903             if (i > 5) {
 904                 adjust = (i - 5) * 7;
 905             }
 906             complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
 907         }
 908 
 909         complexGaussianDist(data, base * (15.5), 1, 0.1);
 910         complexGaussianDist(data, base * (17.5), 1, 0.01);
 911 
 912         SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base, 200);
 913         SF2Layer layer = newLayer(sf2, "EPiano", sample);
 914         SF2Region region = layer.getRegions().get(0);
 915         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 916         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
 917         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 918         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
 919         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 920         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -1200);
 921         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 922         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
 923         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
 924         return layer;
 925     }
 926 
 927     public static SF2Layer new_epiano1(SF2Soundbank sf2) {
 928         Random random = new Random(302030201);
 929         int x = 8;
 930         int fftsize = 4096 * x;
 931         double[] data = new double[fftsize * 2];
 932         double base = x * 25;
 933         double start_w = 0.05;
 934         double end_w = 0.05;
 935         double start_a = 0.2;
 936         double end_a = 0.0001;
 937         double a = start_a;
 938         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
 939         for (int i = 0; i < 40; i++) {
 940             double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;
 941             double w = start_w + (end_w - start_w) * (i / 40.0);
 942             complexGaussianDist(data, base * (i + 1) * detune, w, a);
 943             a *= a_step;
 944         }
 945 
 946 
 947 
 948         SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);
 949         SF2Layer layer = newLayer(sf2, "EPiano", sample);
 950         SF2Region region = layer.getRegions().get(0);
 951         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 952         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
 953         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 954         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
 955         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 956         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);
 957         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 958         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);
 959         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
 960         return layer;
 961     }
 962 
 963     public static SF2Layer new_epiano2(SF2Soundbank sf2) {
 964         Random random = new Random(302030201);
 965         int x = 8;
 966         int fftsize = 4096 * x;
 967         double[] data = new double[fftsize * 2];
 968         double base = x * 25;
 969         double start_w = 0.01;
 970         double end_w = 0.05;
 971         double start_a = 0.2;
 972         double end_a = 0.00001;
 973         double a = start_a;
 974         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
 975         for (int i = 0; i < 40; i++) {
 976             double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;
 977             double w = start_w + (end_w - start_w) * (i / 40.0);
 978             complexGaussianDist(data, base * (i + 1) * detune, w, a);
 979             a *= a_step;
 980         }
 981 
 982         SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);
 983         SF2Layer layer = newLayer(sf2, "EPiano", sample);
 984         SF2Region region = layer.getRegions().get(0);
 985         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
 986         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
 987         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
 988         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 8000);
 989         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
 990         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 2400);
 991         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
 992         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);
 993         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
 994         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
 995         return layer;
 996     }
 997 
 998     public static SF2Layer new_bass1(SF2Soundbank sf2) {
 999         int x = 8;
1000         int fftsize = 4096 * x;
1001         double[] data = new double[fftsize * 2];
1002         double base = x * 25;
1003         double start_w = 0.05;
1004         double end_w = 0.05;
1005         double start_a = 0.2;
1006         double end_a = 0.02;
1007         double a = start_a;
1008         double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);
1009 
1010         double[] aa = new double[25];
1011         for (int i = 0; i < 25; i++) {
1012             aa[i] = a;
1013             a *= a_step;
1014         }
1015 
1016         aa[0] *= 8;
1017         aa[1] *= 4;
1018         aa[3] *= 8;
1019         aa[5] *= 8;
1020 
1021         for (int i = 0; i < 25; i++) {
1022             double w = start_w + (end_w - start_w) * (i / 40.0);
1023             complexGaussianDist(data, base * (i + 1), w, aa[i]);
1024         }
1025 
1026 
1027         SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);
1028         SF2Layer layer = newLayer(sf2, "Bass", sample);
1029         SF2Region region = layer.getRegions().get(0);
1030         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1031         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
1032         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
1033         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1034         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
1035         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
1036         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1037         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5000);
1038         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 11000);
1039         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1040         return layer;
1041     }
1042 
1043     public static SF2Layer new_synthbass(SF2Soundbank sf2) {
1044         int x = 8;
1045         int fftsize = 4096 * x;
1046         double[] data = new double[fftsize * 2];
1047         double base = x * 25;
1048         double start_w = 0.05;
1049         double end_w = 0.05;
1050         double start_a = 0.2;
1051         double end_a = 0.02;
1052         double a = start_a;
1053         double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);
1054 
1055         double[] aa = new double[25];
1056         for (int i = 0; i < 25; i++) {
1057             aa[i] = a;
1058             a *= a_step;
1059         }
1060 
1061         aa[0] *= 16;
1062         aa[1] *= 4;
1063         aa[3] *= 16;
1064         aa[5] *= 8;
1065 
1066         for (int i = 0; i < 25; i++) {
1067             double w = start_w + (end_w - start_w) * (i / 40.0);
1068             complexGaussianDist(data, base * (i + 1), w, aa[i]);
1069         }
1070 
1071 
1072         SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);
1073         SF2Layer layer = newLayer(sf2, "Bass", sample);
1074         SF2Region region = layer.getRegions().get(0);
1075         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1076         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
1077         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
1078         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1079         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
1080         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
1081         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1082         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -3000);
1083         region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 100);
1084         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);
1085         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1086         return layer;
1087     }
1088 
1089     public static SF2Layer new_bass2(SF2Soundbank sf2) {
1090         int x = 8;
1091         int fftsize = 4096 * x;
1092         double[] data = new double[fftsize * 2];
1093         double base = x * 25;
1094         double start_w = 0.05;
1095         double end_w = 0.05;
1096         double start_a = 0.2;
1097         double end_a = 0.002;
1098         double a = start_a;
1099         double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);
1100 
1101         double[] aa = new double[25];
1102         for (int i = 0; i < 25; i++) {
1103             aa[i] = a;
1104             a *= a_step;
1105         }
1106 
1107         aa[0] *= 8;
1108         aa[1] *= 4;
1109         aa[3] *= 8;
1110         aa[5] *= 8;
1111 
1112         for (int i = 0; i < 25; i++) {
1113             double w = start_w + (end_w - start_w) * (i / 40.0);
1114             complexGaussianDist(data, base * (i + 1), w, aa[i]);
1115         }
1116 
1117 
1118         SF2Sample sample = newSimpleFFTSample(sf2, "Bass2", data, base);
1119         SF2Layer layer = newLayer(sf2, "Bass2", sample);
1120         SF2Region region = layer.getRegions().get(0);
1121         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1122         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);
1123         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
1124         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1125         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
1126         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
1127         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1128         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 5000);
1129         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1130         return layer;
1131     }
1132 
1133     public static SF2Layer new_solostring(SF2Soundbank sf2) {
1134         int x = 8;
1135         int fftsize = 4096 * x;
1136         double[] data = new double[fftsize * 2];
1137         double base = x * 25;
1138         double start_w = 2;
1139         double end_w = 2;
1140         double start_a = 0.2;
1141         double end_a = 0.01;
1142 
1143         double[] aa = new double[18];
1144         double a = start_a;
1145         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1146         for (int i = 0; i < aa.length; i++) {
1147             a *= a_step;
1148             aa[i] = a;
1149         }
1150 
1151         aa[0] *= 5;
1152         aa[1] *= 5;
1153         aa[2] *= 5;
1154         aa[3] *= 4;
1155         aa[4] *= 4;
1156         aa[5] *= 3;
1157         aa[6] *= 3;
1158         aa[7] *= 2;
1159 
1160         for (int i = 0; i < aa.length; i++) {
1161             double w = start_w + (end_w - start_w) * (i / 40.0);
1162             complexGaussianDist(data, base * (i + 1), w, a);
1163         }
1164         SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);
1165         SF2Layer layer = newLayer(sf2, "Strings", sample);
1166         SF2Region region = layer.getRegions().get(0);
1167         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1168         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
1169         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);
1170         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1171         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1172         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1173         region.putInteger(SF2Region.GENERATOR_FREQVIBLFO, -1000);
1174         region.putInteger(SF2Region.GENERATOR_VIBLFOTOPITCH, 15);
1175         return layer;
1176 
1177     }
1178 
1179     public static SF2Layer new_orchhit(SF2Soundbank sf2) {
1180         int x = 8;
1181         int fftsize = 4096 * x;
1182         double[] data = new double[fftsize * 2];
1183         double base = x * 25;
1184         double start_w = 2;
1185         double end_w = 80;
1186         double start_a = 0.2;
1187         double end_a = 0.001;
1188         double a = start_a;
1189         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1190         for (int i = 0; i < 40; i++) {
1191             double w = start_w + (end_w - start_w) * (i / 40.0);
1192             complexGaussianDist(data, base * (i + 1), w, a);
1193             a *= a_step;
1194         }
1195         complexGaussianDist(data, base * 4, 300, 1);
1196 
1197 
1198         SF2Sample sample = newSimpleFFTSample(sf2, "Och Strings", data, base);
1199         SF2Layer layer = newLayer(sf2, "Och Strings", sample);
1200         SF2Region region = layer.getRegions().get(0);
1201         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1202         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
1203         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 200);
1204         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 200);
1205         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
1206         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1207         return layer;
1208 
1209     }
1210 
1211     public static SF2Layer new_string2(SF2Soundbank sf2) {
1212         int x = 8;
1213         int fftsize = 4096 * x;
1214         double[] data = new double[fftsize * 2];
1215         double base = x * 25;
1216         double start_w = 2;
1217         double end_w = 80;
1218         double start_a = 0.2;
1219         double end_a = 0.001;
1220         double a = start_a;
1221         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1222         for (int i = 0; i < 40; i++) {
1223             double w = start_w + (end_w - start_w) * (i / 40.0);
1224             complexGaussianDist(data, base * (i + 1), w, a);
1225             a *= a_step;
1226         }
1227         SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);
1228         SF2Layer layer = newLayer(sf2, "Strings", sample);
1229         SF2Region region = layer.getRegions().get(0);
1230         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1231         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
1232         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);
1233         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1234         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1235         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1236         return layer;
1237 
1238     }
1239 
1240     public static SF2Layer new_choir(SF2Soundbank sf2) {
1241         int x = 8;
1242         int fftsize = 4096 * x;
1243         double[] data = new double[fftsize * 2];
1244         double base = x * 25;
1245         double start_w = 2;
1246         double end_w = 80;
1247         double start_a = 0.2;
1248         double end_a = 0.001;
1249         double a = start_a;
1250         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1251         double[] aa = new double[40];
1252         for (int i = 0; i < aa.length; i++) {
1253             a *= a_step;
1254             aa[i] = a;
1255         }
1256 
1257         aa[5] *= 0.1;
1258         aa[6] *= 0.01;
1259         aa[7] *= 0.1;
1260         aa[8] *= 0.1;
1261 
1262         for (int i = 0; i < aa.length; i++) {
1263             double w = start_w + (end_w - start_w) * (i / 40.0);
1264             complexGaussianDist(data, base * (i + 1), w, aa[i]);
1265         }
1266         SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);
1267         SF2Layer layer = newLayer(sf2, "Strings", sample);
1268         SF2Region region = layer.getRegions().get(0);
1269         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1270         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
1271         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);
1272         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1273         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1274         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1275         return layer;
1276 
1277     }
1278 
1279     public static SF2Layer new_organ(SF2Soundbank sf2) {
1280         Random random = new Random(102030201);
1281         int x = 1;
1282         int fftsize = 4096 * x;
1283         double[] data = new double[fftsize * 2];
1284         double base = x * 15;
1285         double start_w = 0.01;
1286         double end_w = 0.01;
1287         double start_a = 0.2;
1288         double end_a = 0.001;
1289         double a = start_a;
1290         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1291 
1292         for (int i = 0; i < 12; i++) {
1293             double w = start_w + (end_w - start_w) * (i / 40.0);
1294             complexGaussianDist(data, base * (i + 1), w,
1295                     a * (0.5 + 3 * (random.nextDouble())));
1296             a *= a_step;
1297         }
1298         SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);
1299         SF2Layer layer = newLayer(sf2, "Organ", sample);
1300         SF2Region region = layer.getRegions().get(0);
1301         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1302         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1303         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1304         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1305         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1306         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1307         return layer;
1308 
1309     }
1310 
1311     public static SF2Layer new_ch_organ(SF2Soundbank sf2) {
1312         int x = 1;
1313         int fftsize = 4096 * x;
1314         double[] data = new double[fftsize * 2];
1315         double base = x * 15;
1316         double start_w = 0.01;
1317         double end_w = 0.01;
1318         double start_a = 0.2;
1319         double end_a = 0.001;
1320         double a = start_a;
1321         double a_step = Math.pow(end_a / start_a, 1.0 / 60.0);
1322 
1323         double[] aa = new double[60];
1324         for (int i = 0; i < aa.length; i++) {
1325             a *= a_step;
1326             aa[i] = a;
1327         }
1328 
1329         aa[0] *= 5;
1330         aa[1] *= 2;
1331         aa[2] = 0;
1332         aa[4] = 0;
1333         aa[5] = 0;
1334         aa[7] *= 7;
1335         aa[9] = 0;
1336         aa[10] = 0;
1337         aa[12] = 0;
1338         aa[15] *= 7;
1339         aa[18] = 0;
1340         aa[20] = 0;
1341         aa[24] = 0;
1342         aa[27] *= 5;
1343         aa[29] = 0;
1344         aa[30] = 0;
1345         aa[33] = 0;
1346         aa[36] *= 4;
1347         aa[37] = 0;
1348         aa[39] = 0;
1349         aa[42] = 0;
1350         aa[43] = 0;
1351         aa[47] = 0;
1352         aa[50] *= 4;
1353         aa[52] = 0;
1354         aa[55] = 0;
1355         aa[57] = 0;
1356 
1357 
1358         aa[10] *= 0.1;
1359         aa[11] *= 0.1;
1360         aa[12] *= 0.1;
1361         aa[13] *= 0.1;
1362 
1363         aa[17] *= 0.1;
1364         aa[18] *= 0.1;
1365         aa[19] *= 0.1;
1366         aa[20] *= 0.1;
1367 
1368         for (int i = 0; i < 60; i++) {
1369             double w = start_w + (end_w - start_w) * (i / 40.0);
1370             complexGaussianDist(data, base * (i + 1), w, aa[i]);
1371             a *= a_step;
1372         }
1373         SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);
1374         SF2Layer layer = newLayer(sf2, "Organ", sample);
1375         SF2Region region = layer.getRegions().get(0);
1376         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1377         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);
1378         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1379         return layer;
1380 
1381     }
1382 
1383     public static SF2Layer new_flute(SF2Soundbank sf2) {
1384         int x = 8;
1385         int fftsize = 4096 * x;
1386         double[] data = new double[fftsize * 2];
1387         double base = x * 15;
1388 
1389         complexGaussianDist(data, base * 1, 0.001, 0.5);
1390         complexGaussianDist(data, base * 2, 0.001, 0.5);
1391         complexGaussianDist(data, base * 3, 0.001, 0.5);
1392         complexGaussianDist(data, base * 4, 0.01, 0.5);
1393 
1394         complexGaussianDist(data, base * 4, 100, 120);
1395         complexGaussianDist(data, base * 6, 100, 40);
1396         complexGaussianDist(data, base * 8, 100, 80);
1397 
1398         complexGaussianDist(data, base * 5, 0.001, 0.05);
1399         complexGaussianDist(data, base * 6, 0.001, 0.06);
1400         complexGaussianDist(data, base * 7, 0.001, 0.04);
1401         complexGaussianDist(data, base * 8, 0.005, 0.06);
1402         complexGaussianDist(data, base * 9, 0.005, 0.06);
1403         complexGaussianDist(data, base * 10, 0.01, 0.1);
1404         complexGaussianDist(data, base * 11, 0.08, 0.7);
1405         complexGaussianDist(data, base * 12, 0.08, 0.6);
1406         complexGaussianDist(data, base * 13, 0.08, 0.6);
1407         complexGaussianDist(data, base * 14, 0.08, 0.6);
1408         complexGaussianDist(data, base * 15, 0.08, 0.5);
1409         complexGaussianDist(data, base * 16, 0.08, 0.5);
1410         complexGaussianDist(data, base * 17, 0.08, 0.2);
1411 
1412 
1413         complexGaussianDist(data, base * 1, 10, 8);
1414         complexGaussianDist(data, base * 2, 10, 8);
1415         complexGaussianDist(data, base * 3, 10, 8);
1416         complexGaussianDist(data, base * 4, 10, 8);
1417         complexGaussianDist(data, base * 5, 10, 8);
1418         complexGaussianDist(data, base * 6, 20, 9);
1419         complexGaussianDist(data, base * 7, 20, 9);
1420         complexGaussianDist(data, base * 8, 20, 9);
1421         complexGaussianDist(data, base * 9, 20, 8);
1422         complexGaussianDist(data, base * 10, 30, 8);
1423         complexGaussianDist(data, base * 11, 30, 9);
1424         complexGaussianDist(data, base * 12, 30, 9);
1425         complexGaussianDist(data, base * 13, 30, 8);
1426         complexGaussianDist(data, base * 14, 30, 8);
1427         complexGaussianDist(data, base * 15, 30, 7);
1428         complexGaussianDist(data, base * 16, 30, 7);
1429         complexGaussianDist(data, base * 17, 30, 6);
1430 
1431         SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);
1432         SF2Layer layer = newLayer(sf2, "Flute", sample);
1433         SF2Region region = layer.getRegions().get(0);
1434         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1435         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1436         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1437         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1438         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1439         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1440         return layer;
1441 
1442     }
1443 
1444     public static SF2Layer new_horn(SF2Soundbank sf2) {
1445         int x = 8;
1446         int fftsize = 4096 * x;
1447         double[] data = new double[fftsize * 2];
1448         double base = x * 15;
1449 
1450         double start_a = 0.5;
1451         double end_a = 0.00000000001;
1452         double a = start_a;
1453         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1454         for (int i = 0; i < 40; i++) {
1455             if (i == 0)
1456                 complexGaussianDist(data, base * (i + 1), 0.1, a * 0.2);
1457             else
1458                 complexGaussianDist(data, base * (i + 1), 0.1, a);
1459             a *= a_step;
1460         }
1461 
1462         complexGaussianDist(data, base * 2, 100, 1);
1463 
1464 
1465         SF2Sample sample = newSimpleFFTSample(sf2, "Horn", data, base);
1466         SF2Layer layer = newLayer(sf2, "Horn", sample);
1467         SF2Region region = layer.getRegions().get(0);
1468         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1469         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1470         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1471         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1472         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1473 
1474         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -500);
1475         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1476         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
1477         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
1478         return layer;
1479 
1480     }
1481 
1482     public static SF2Layer new_trumpet(SF2Soundbank sf2) {
1483         int x = 8;
1484         int fftsize = 4096 * x;
1485         double[] data = new double[fftsize * 2];
1486         double base = x * 15;
1487 
1488         double start_a = 0.5;
1489         double end_a = 0.00001;
1490         double a = start_a;
1491         double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);
1492         double[] aa = new double[80];
1493         for (int i = 0; i < 80; i++) {
1494             aa[i] = a;
1495             a *= a_step;
1496         }
1497 
1498         aa[0] *= 0.05;
1499         aa[1] *= 0.2;
1500         aa[2] *= 0.5;
1501         aa[3] *= 0.85;
1502 
1503         for (int i = 0; i < 80; i++) {
1504             complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);
1505         }
1506 
1507         complexGaussianDist(data, base * 5, 300, 3);
1508 
1509 
1510         SF2Sample sample = newSimpleFFTSample(sf2, "Trumpet", data, base);
1511         SF2Layer layer = newLayer(sf2, "Trumpet", sample);
1512         SF2Region region = layer.getRegions().get(0);
1513         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1514         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);
1515         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
1516         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1517         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1518 
1519         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -4000);
1520         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, -2500);
1521         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
1522         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
1523         region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);
1524         return layer;
1525 
1526     }
1527 
1528     public static SF2Layer new_brass_section(SF2Soundbank sf2) {
1529         int x = 8;
1530         int fftsize = 4096 * x;
1531         double[] data = new double[fftsize * 2];
1532         double base = x * 15;
1533 
1534         double start_a = 0.5;
1535         double end_a = 0.005;
1536         double a = start_a;
1537         double a_step = Math.pow(end_a / start_a, 1.0 / 30.0);
1538         double[] aa = new double[30];
1539         for (int i = 0; i < 30; i++) {
1540             aa[i] = a;
1541             a *= a_step;
1542         }
1543 
1544         aa[0] *= 0.8;
1545         aa[1] *= 0.9;
1546 
1547         double w = 5;
1548         for (int i = 0; i < 30; i++) {
1549             complexGaussianDist(data, base * (i + 1), 0.1 * w, aa[i] * w);
1550             w += 6; //*= w_step;
1551         }
1552 
1553         complexGaussianDist(data, base * 6, 300, 2);
1554 
1555 
1556         SF2Sample sample = newSimpleFFTSample(sf2, "Brass Section", data, base);
1557         SF2Layer layer = newLayer(sf2, "Brass Section", sample);
1558         SF2Region region = layer.getRegions().get(0);
1559         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1560         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -9200);
1561         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1562         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1563         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1564 
1565         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
1566         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1567         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
1568         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
1569         return layer;
1570 
1571     }
1572 
1573     public static SF2Layer new_trombone(SF2Soundbank sf2) {
1574         int x = 8;
1575         int fftsize = 4096 * x;
1576         double[] data = new double[fftsize * 2];
1577         double base = x * 15;
1578 
1579         double start_a = 0.5;
1580         double end_a = 0.001;
1581         double a = start_a;
1582         double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);
1583         double[] aa = new double[80];
1584         for (int i = 0; i < 80; i++) {
1585             aa[i] = a;
1586             a *= a_step;
1587         }
1588 
1589         aa[0] *= 0.3;
1590         aa[1] *= 0.7;
1591 
1592         for (int i = 0; i < 80; i++) {
1593             complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);
1594         }
1595 
1596         complexGaussianDist(data, base * 6, 300, 2);
1597 
1598 
1599         SF2Sample sample = newSimpleFFTSample(sf2, "Trombone", data, base);
1600         SF2Layer layer = newLayer(sf2, "Trombone", sample);
1601         SF2Region region = layer.getRegions().get(0);
1602         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1603         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);
1604         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1605         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1606         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1607 
1608         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -2000);
1609         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1610         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
1611         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
1612         region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);
1613         return layer;
1614 
1615     }
1616 
1617     public static SF2Layer new_sax(SF2Soundbank sf2) {
1618         int x = 8;
1619         int fftsize = 4096 * x;
1620         double[] data = new double[fftsize * 2];
1621         double base = x * 15;
1622 
1623         double start_a = 0.5;
1624         double end_a = 0.01;
1625         double a = start_a;
1626         double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
1627         for (int i = 0; i < 40; i++) {
1628             if (i == 0 || i == 2)
1629                 complexGaussianDist(data, base * (i + 1), 0.1, a * 4);
1630             else
1631                 complexGaussianDist(data, base * (i + 1), 0.1, a);
1632             a *= a_step;
1633         }
1634 
1635         complexGaussianDist(data, base * 4, 200, 1);
1636 
1637         SF2Sample sample = newSimpleFFTSample(sf2, "Sax", data, base);
1638         SF2Layer layer = newLayer(sf2, "Sax", sample);
1639         SF2Region region = layer.getRegions().get(0);
1640         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1641         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1642         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1643         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1644         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1645 
1646         region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
1647         region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
1648         region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
1649         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
1650         return layer;
1651 
1652     }
1653 
1654     public static SF2Layer new_oboe(SF2Soundbank sf2) {
1655         int x = 8;
1656         int fftsize = 4096 * x;
1657         double[] data = new double[fftsize * 2];
1658         double base = x * 15;
1659 
1660         complexGaussianDist(data, base * 5, 100, 80);
1661 
1662 
1663         complexGaussianDist(data, base * 1, 0.01, 0.53);
1664         complexGaussianDist(data, base * 2, 0.01, 0.51);
1665         complexGaussianDist(data, base * 3, 0.01, 0.48);
1666         complexGaussianDist(data, base * 4, 0.01, 0.49);
1667         complexGaussianDist(data, base * 5, 0.01, 5);
1668         complexGaussianDist(data, base * 6, 0.01, 0.51);
1669         complexGaussianDist(data, base * 7, 0.01, 0.50);
1670         complexGaussianDist(data, base * 8, 0.01, 0.59);
1671         complexGaussianDist(data, base * 9, 0.01, 0.61);
1672         complexGaussianDist(data, base * 10, 0.01, 0.52);
1673         complexGaussianDist(data, base * 11, 0.01, 0.49);
1674         complexGaussianDist(data, base * 12, 0.01, 0.51);
1675         complexGaussianDist(data, base * 13, 0.01, 0.48);
1676         complexGaussianDist(data, base * 14, 0.01, 0.51);
1677         complexGaussianDist(data, base * 15, 0.01, 0.46);
1678         complexGaussianDist(data, base * 16, 0.01, 0.35);
1679         complexGaussianDist(data, base * 17, 0.01, 0.20);
1680         complexGaussianDist(data, base * 18, 0.01, 0.10);
1681         complexGaussianDist(data, base * 19, 0.01, 0.5);
1682         complexGaussianDist(data, base * 20, 0.01, 0.1);
1683 
1684 
1685         SF2Sample sample = newSimpleFFTSample(sf2, "Oboe", data, base);
1686         SF2Layer layer = newLayer(sf2, "Oboe", sample);
1687         SF2Region region = layer.getRegions().get(0);
1688         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1689         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1690         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1691         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1692         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1693         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1694         return layer;
1695 
1696     }
1697 
1698     public static SF2Layer new_bassoon(SF2Soundbank sf2) {
1699         int x = 8;
1700         int fftsize = 4096 * x;
1701         double[] data = new double[fftsize * 2];
1702         double base = x * 15;
1703 
1704         complexGaussianDist(data, base * 2, 100, 40);
1705         complexGaussianDist(data, base * 4, 100, 20);
1706 
1707         complexGaussianDist(data, base * 1, 0.01, 0.53);
1708         complexGaussianDist(data, base * 2, 0.01, 5);
1709         complexGaussianDist(data, base * 3, 0.01, 0.51);
1710         complexGaussianDist(data, base * 4, 0.01, 0.48);
1711         complexGaussianDist(data, base * 5, 0.01, 1.49);
1712         complexGaussianDist(data, base * 6, 0.01, 0.51);
1713         complexGaussianDist(data, base * 7, 0.01, 0.50);
1714         complexGaussianDist(data, base * 8, 0.01, 0.59);
1715         complexGaussianDist(data, base * 9, 0.01, 0.61);
1716         complexGaussianDist(data, base * 10, 0.01, 0.52);
1717         complexGaussianDist(data, base * 11, 0.01, 0.49);
1718         complexGaussianDist(data, base * 12, 0.01, 0.51);
1719         complexGaussianDist(data, base * 13, 0.01, 0.48);
1720         complexGaussianDist(data, base * 14, 0.01, 0.51);
1721         complexGaussianDist(data, base * 15, 0.01, 0.46);
1722         complexGaussianDist(data, base * 16, 0.01, 0.35);
1723         complexGaussianDist(data, base * 17, 0.01, 0.20);
1724         complexGaussianDist(data, base * 18, 0.01, 0.10);
1725         complexGaussianDist(data, base * 19, 0.01, 0.5);
1726         complexGaussianDist(data, base * 20, 0.01, 0.1);
1727 
1728 
1729         SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);
1730         SF2Layer layer = newLayer(sf2, "Flute", sample);
1731         SF2Region region = layer.getRegions().get(0);
1732         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1733         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1734         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1735         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1736         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1737         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1738         return layer;
1739 
1740     }
1741 
1742     public static SF2Layer new_clarinet(SF2Soundbank sf2) {
1743         int x = 8;
1744         int fftsize = 4096 * x;
1745         double[] data = new double[fftsize * 2];
1746         double base = x * 15;
1747 
1748         complexGaussianDist(data, base * 1, 0.001, 0.5);
1749         complexGaussianDist(data, base * 2, 0.001, 0.02);
1750         complexGaussianDist(data, base * 3, 0.001, 0.2);
1751         complexGaussianDist(data, base * 4, 0.01, 0.1);
1752 
1753         complexGaussianDist(data, base * 4, 100, 60);
1754         complexGaussianDist(data, base * 6, 100, 20);
1755         complexGaussianDist(data, base * 8, 100, 20);
1756 
1757         complexGaussianDist(data, base * 5, 0.001, 0.1);
1758         complexGaussianDist(data, base * 6, 0.001, 0.09);
1759         complexGaussianDist(data, base * 7, 0.001, 0.02);
1760         complexGaussianDist(data, base * 8, 0.005, 0.16);
1761         complexGaussianDist(data, base * 9, 0.005, 0.96);
1762         complexGaussianDist(data, base * 10, 0.01, 0.9);
1763         complexGaussianDist(data, base * 11, 0.08, 1.2);
1764         complexGaussianDist(data, base * 12, 0.08, 1.8);
1765         complexGaussianDist(data, base * 13, 0.08, 1.6);
1766         complexGaussianDist(data, base * 14, 0.08, 1.2);
1767         complexGaussianDist(data, base * 15, 0.08, 0.9);
1768         complexGaussianDist(data, base * 16, 0.08, 0.5);
1769         complexGaussianDist(data, base * 17, 0.08, 0.2);
1770 
1771 
1772         complexGaussianDist(data, base * 1, 10, 8);
1773         complexGaussianDist(data, base * 2, 10, 8);
1774         complexGaussianDist(data, base * 3, 10, 8);
1775         complexGaussianDist(data, base * 4, 10, 8);
1776         complexGaussianDist(data, base * 5, 10, 8);
1777         complexGaussianDist(data, base * 6, 20, 9);
1778         complexGaussianDist(data, base * 7, 20, 9);
1779         complexGaussianDist(data, base * 8, 20, 9);
1780         complexGaussianDist(data, base * 9, 20, 8);
1781         complexGaussianDist(data, base * 10, 30, 8);
1782         complexGaussianDist(data, base * 11, 30, 9);
1783         complexGaussianDist(data, base * 12, 30, 9);
1784         complexGaussianDist(data, base * 13, 30, 8);
1785         complexGaussianDist(data, base * 14, 30, 8);
1786         complexGaussianDist(data, base * 15, 30, 7);
1787         complexGaussianDist(data, base * 16, 30, 7);
1788         complexGaussianDist(data, base * 17, 30, 6);
1789 
1790         SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base);
1791         SF2Layer layer = newLayer(sf2, "Clarinet", sample);
1792         SF2Region region = layer.getRegions().get(0);
1793         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1794         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1795         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1796         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1797         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1798         region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1799         return layer;
1800 
1801     }
1802 
1803     public static SF2Layer new_timpani(SF2Soundbank sf2) {
1804 
1805         double datab[];
1806         double datah[];
1807 
1808         // Make Bass Part
1809         {
1810             int fftlen = 4096 * 8;
1811             double[] data = new double[2 * fftlen];
1812             double base = 48;
1813             complexGaussianDist(data, base * 2, 0.2, 1);
1814             complexGaussianDist(data, base * 3, 0.2, 0.7);
1815             complexGaussianDist(data, base * 5, 10, 1);
1816             complexGaussianDist(data, base * 6, 9, 1);
1817             complexGaussianDist(data, base * 8, 15, 1);
1818             complexGaussianDist(data, base * 9, 18, 0.8);
1819             complexGaussianDist(data, base * 11, 21, 0.5);
1820             complexGaussianDist(data, base * 13, 28, 0.3);
1821             complexGaussianDist(data, base * 14, 22, 0.1);
1822             randomPhase(data, new Random(3049912));
1823             ifft(data);
1824             normalize(data, 0.5);
1825             data = realPart(data);
1826 
1827             double d_len = data.length;
1828             for (int i = 0; i < data.length; i++) {
1829                 double g = (1.0 - (i / d_len));
1830                 data[i] *= g * g;
1831             }
1832             fadeUp(data, 40);
1833             datab = data;
1834         }
1835 
1836         // Make treble part
1837         {
1838             int fftlen = 4096 * 4;
1839             double[] data = new double[2 * fftlen];
1840             Random random = new Random(3049912);
1841             for (int i = 0; i < data.length; i += 2) {
1842                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
1843             }
1844             fft(data);
1845             // Remove all negative frequency
1846             for (int i = fftlen / 2; i < data.length; i++)
1847                 data[i] = 0;
1848             for (int i = 1024 * 4; i < 2048 * 4; i++)
1849                 data[i] = 1.0 - (i - 4096) / 4096.0;
1850             for (int i = 0; i < 300; i++) {
1851                 double g = (1.0 - (i / 300.0));
1852                 data[i] *= 1.0 + 20 * g * g;
1853             }
1854             for (int i = 0; i < 24; i++)
1855                 data[i] = 0;
1856             randomPhase(data, new Random(3049912));
1857             ifft(data);
1858             normalize(data, 0.9);
1859             data = realPart(data);
1860             double gain = 1.0;
1861             for (int i = 0; i < data.length; i++) {
1862                 data[i] *= gain;
1863                 gain *= 0.9998;
1864             }
1865             datah = data;
1866         }
1867 
1868         for (int i = 0; i < datah.length; i++)
1869             datab[i] += datah[i] * 0.02;
1870 
1871         normalize(datab, 0.9);
1872 
1873         SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab);
1874 
1875         SF2Layer layer = new SF2Layer(sf2);
1876         layer.setName("Timpani");
1877 
1878         SF2GlobalRegion global = new SF2GlobalRegion();
1879         layer.setGlobalZone(global);
1880         sf2.addResource(layer);
1881 
1882         SF2LayerRegion region = new SF2LayerRegion();
1883         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
1884         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1885         region.setSample(sample);
1886         layer.getRegions().add(region);
1887 
1888         return layer;
1889     }
1890 
1891     public static SF2Layer new_melodic_toms(SF2Soundbank sf2) {
1892 
1893         double datab[];
1894         double datah[];
1895 
1896         // Make Bass Part
1897         {
1898             int fftlen = 4096 * 4;
1899             double[] data = new double[2 * fftlen];
1900             complexGaussianDist(data, 30, 0.5, 1);
1901             randomPhase(data, new Random(3049912));
1902             ifft(data);
1903             normalize(data, 0.8);
1904             data = realPart(data);
1905 
1906             double d_len = data.length;
1907             for (int i = 0; i < data.length; i++)
1908                 data[i] *= (1.0 - (i / d_len));
1909             datab = data;
1910         }
1911 
1912         // Make treble part
1913         {
1914             int fftlen = 4096 * 4;
1915             double[] data = new double[2 * fftlen];
1916             Random random = new Random(3049912);
1917             for (int i = 0; i < data.length; i += 2)
1918                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
1919             fft(data);
1920             // Remove all negative frequency
1921             for (int i = fftlen / 2; i < data.length; i++)
1922                 data[i] = 0;
1923             for (int i = 1024 * 4; i < 2048 * 4; i++)
1924                 data[i] = 1.0 - (i - 4096) / 4096.0;
1925             for (int i = 0; i < 200; i++) {
1926                 double g = (1.0 - (i / 200.0));
1927                 data[i] *= 1.0 + 20 * g * g;
1928             }
1929             for (int i = 0; i < 30; i++)
1930                 data[i] = 0;
1931             randomPhase(data, new Random(3049912));
1932             ifft(data);
1933             normalize(data, 0.9);
1934             data = realPart(data);
1935             double gain = 1.0;
1936             for (int i = 0; i < data.length; i++) {
1937                 data[i] *= gain;
1938                 gain *= 0.9996;
1939             }
1940             datah = data;
1941         }
1942 
1943         for (int i = 0; i < datah.length; i++)
1944             datab[i] += datah[i] * 0.5;
1945         for (int i = 0; i < 5; i++)
1946             datab[i] *= i / 5.0;
1947 
1948         normalize(datab, 0.99);
1949 
1950         SF2Sample sample = newSimpleDrumSample(sf2, "Melodic Toms", datab);
1951         sample.setOriginalPitch(63);
1952 
1953         SF2Layer layer = new SF2Layer(sf2);
1954         layer.setName("Melodic Toms");
1955 
1956         SF2GlobalRegion global = new SF2GlobalRegion();
1957         layer.setGlobalZone(global);
1958         sf2.addResource(layer);
1959 
1960         SF2LayerRegion region = new SF2LayerRegion();
1961         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
1962         //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
1963         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1964         region.setSample(sample);
1965         layer.getRegions().add(region);
1966 
1967         return layer;
1968     }
1969 
1970     public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) {
1971         double datah[];
1972         {
1973             int fftlen = 4096 * 4;
1974             double[] data = new double[2 * fftlen];
1975             Random random = new Random(3049912);
1976             for (int i = 0; i < data.length; i += 2)
1977                 data[i] = (2.0 * (random.nextDouble() - 0.5));
1978             for (int i = fftlen / 2; i < data.length; i++)
1979                 data[i] = 0;
1980             for (int i = 0; i < 100; i++)
1981                 data[i] = 0;
1982 
1983             for (int i = 0; i < 512 * 2; i++) {
1984                 double gain = (i / (512.0 * 2.0));
1985                 data[i] = 1 - gain;
1986             }
1987             datah = data;
1988         }
1989 
1990         SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal",
1991                 datah, 100, 20);
1992 
1993         SF2Layer layer = new SF2Layer(sf2);
1994         layer.setName("Reverse Cymbal");
1995 
1996         SF2GlobalRegion global = new SF2GlobalRegion();
1997         layer.setGlobalZone(global);
1998         sf2.addResource(layer);
1999 
2000         SF2LayerRegion region = new SF2LayerRegion();
2001         region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200);
2002         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000);
2003         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2004         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
2005         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2006         region.setSample(sample);
2007         layer.getRegions().add(region);
2008 
2009         return layer;
2010     }
2011 
2012     public static SF2Layer new_snare_drum(SF2Soundbank sf2) {
2013 
2014         double datab[];
2015         double datah[];
2016 
2017         // Make Bass Part
2018         {
2019             int fftlen = 4096 * 4;
2020             double[] data = new double[2 * fftlen];
2021             complexGaussianDist(data, 24, 0.5, 1);
2022             randomPhase(data, new Random(3049912));
2023             ifft(data);
2024             normalize(data, 0.5);
2025             data = realPart(data);
2026 
2027             double d_len = data.length;
2028             for (int i = 0; i < data.length; i++)
2029                 data[i] *= (1.0 - (i / d_len));
2030             datab = data;
2031         }
2032 
2033         // Make treble part
2034         {
2035             int fftlen = 4096 * 4;
2036             double[] data = new double[2 * fftlen];
2037             Random random = new Random(3049912);
2038             for (int i = 0; i < data.length; i += 2)
2039                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2040             fft(data);
2041             // Remove all negative frequency
2042             for (int i = fftlen / 2; i < data.length; i++)
2043                 data[i] = 0;
2044             for (int i = 1024 * 4; i < 2048 * 4; i++)
2045                 data[i] = 1.0 - (i - 4096) / 4096.0;
2046             for (int i = 0; i < 300; i++) {
2047                 double g = (1.0 - (i / 300.0));
2048                 data[i] *= 1.0 + 20 * g * g;
2049             }
2050             for (int i = 0; i < 24; i++)
2051                 data[i] = 0;
2052             randomPhase(data, new Random(3049912));
2053             ifft(data);
2054             normalize(data, 0.9);
2055             data = realPart(data);
2056             double gain = 1.0;
2057             for (int i = 0; i < data.length; i++) {
2058                 data[i] *= gain;
2059                 gain *= 0.9998;
2060             }
2061             datah = data;
2062         }
2063 
2064         for (int i = 0; i < datah.length; i++)
2065             datab[i] += datah[i];
2066         for (int i = 0; i < 5; i++)
2067             datab[i] *= i / 5.0;
2068 
2069         SF2Sample sample = newSimpleDrumSample(sf2, "Snare Drum", datab);
2070 
2071         SF2Layer layer = new SF2Layer(sf2);
2072         layer.setName("Snare Drum");
2073 
2074         SF2GlobalRegion global = new SF2GlobalRegion();
2075         layer.setGlobalZone(global);
2076         sf2.addResource(layer);
2077 
2078         SF2LayerRegion region = new SF2LayerRegion();
2079         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2080         region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2081         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2082         region.setSample(sample);
2083         layer.getRegions().add(region);
2084 
2085         return layer;
2086     }
2087 
2088     public static SF2Layer new_bass_drum(SF2Soundbank sf2) {
2089 
2090         double datab[];
2091         double datah[];
2092 
2093         // Make Bass Part
2094         {
2095             int fftlen = 4096 * 4;
2096             double[] data = new double[2 * fftlen];
2097             complexGaussianDist(data, 1.8 * 5 + 1, 2, 1);
2098             complexGaussianDist(data, 1.8 * 9 + 1, 2, 1);
2099             randomPhase(data, new Random(3049912));
2100             ifft(data);
2101             normalize(data, 0.9);
2102             data = realPart(data);
2103             double d_len = data.length;
2104             for (int i = 0; i < data.length; i++)
2105                 data[i] *= (1.0 - (i / d_len));
2106             datab = data;
2107         }
2108 
2109         // Make treble part
2110         {
2111             int fftlen = 4096;
2112             double[] data = new double[2 * fftlen];
2113             Random random = new Random(3049912);
2114             for (int i = 0; i < data.length; i += 2)
2115                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2116             fft(data);
2117             // Remove all negative frequency
2118             for (int i = fftlen / 2; i < data.length; i++)
2119                 data[i] = 0;
2120             for (int i = 1024; i < 2048; i++)
2121                 data[i] = 1.0 - (i - 1024) / 1024.0;
2122             for (int i = 0; i < 512; i++)
2123                 data[i] = 10 * i / 512.0;
2124             for (int i = 0; i < 10; i++)
2125                 data[i] = 0;
2126             randomPhase(data, new Random(3049912));
2127             ifft(data);
2128             normalize(data, 0.9);
2129             data = realPart(data);
2130             double gain = 1.0;
2131             for (int i = 0; i < data.length; i++) {
2132                 data[i] *= gain;
2133                 gain *= 0.999;
2134             }
2135             datah = data;
2136         }
2137 
2138         for (int i = 0; i < datah.length; i++)
2139             datab[i] += datah[i] * 0.5;
2140         for (int i = 0; i < 5; i++)
2141             datab[i] *= i / 5.0;
2142 
2143         SF2Sample sample = newSimpleDrumSample(sf2, "Bass Drum", datab);
2144 
2145         SF2Layer layer = new SF2Layer(sf2);
2146         layer.setName("Bass Drum");
2147 
2148         SF2GlobalRegion global = new SF2GlobalRegion();
2149         layer.setGlobalZone(global);
2150         sf2.addResource(layer);
2151 
2152         SF2LayerRegion region = new SF2LayerRegion();
2153         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2154         region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2155         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2156         region.setSample(sample);
2157         layer.getRegions().add(region);
2158 
2159         return layer;
2160     }
2161 
2162     public static SF2Layer new_tom(SF2Soundbank sf2) {
2163 
2164         double datab[];
2165         double datah[];
2166 
2167         // Make Bass Part
2168         {
2169             int fftlen = 4096 * 4;
2170             double[] data = new double[2 * fftlen];
2171             complexGaussianDist(data, 30, 0.5, 1);
2172             randomPhase(data, new Random(3049912));
2173             ifft(data);
2174             normalize(data, 0.8);
2175             data = realPart(data);
2176 
2177             double d_len = data.length;
2178             for (int i = 0; i < data.length; i++)
2179                 data[i] *= (1.0 - (i / d_len));
2180             datab = data;
2181         }
2182 
2183         // Make treble part
2184         {
2185             int fftlen = 4096 * 4;
2186             double[] data = new double[2 * fftlen];
2187             Random random = new Random(3049912);
2188             for (int i = 0; i < data.length; i += 2)
2189                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2190             fft(data);
2191             // Remove all negative frequency
2192             for (int i = fftlen / 2; i < data.length; i++)
2193                 data[i] = 0;
2194             for (int i = 1024 * 4; i < 2048 * 4; i++)
2195                 data[i] = 1.0 - (i - 4096) / 4096.0;
2196             for (int i = 0; i < 200; i++) {
2197                 double g = (1.0 - (i / 200.0));
2198                 data[i] *= 1.0 + 20 * g * g;
2199             }
2200             for (int i = 0; i < 30; i++)
2201                 data[i] = 0;
2202             randomPhase(data, new Random(3049912));
2203             ifft(data);
2204             normalize(data, 0.9);
2205             data = realPart(data);
2206             double gain = 1.0;
2207             for (int i = 0; i < data.length; i++) {
2208                 data[i] *= gain;
2209                 gain *= 0.9996;
2210             }
2211             datah = data;
2212         }
2213 
2214         for (int i = 0; i < datah.length; i++)
2215             datab[i] += datah[i] * 0.5;
2216         for (int i = 0; i < 5; i++)
2217             datab[i] *= i / 5.0;
2218 
2219         normalize(datab, 0.99);
2220 
2221         SF2Sample sample = newSimpleDrumSample(sf2, "Tom", datab);
2222         sample.setOriginalPitch(50);
2223 
2224         SF2Layer layer = new SF2Layer(sf2);
2225         layer.setName("Tom");
2226 
2227         SF2GlobalRegion global = new SF2GlobalRegion();
2228         layer.setGlobalZone(global);
2229         sf2.addResource(layer);
2230 
2231         SF2LayerRegion region = new SF2LayerRegion();
2232         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2233         //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2234         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2235         region.setSample(sample);
2236         layer.getRegions().add(region);
2237 
2238         return layer;
2239     }
2240 
2241     public static SF2Layer new_closed_hihat(SF2Soundbank sf2) {
2242         double datah[];
2243 
2244         // Make treble part
2245         {
2246             int fftlen = 4096 * 4;
2247             double[] data = new double[2 * fftlen];
2248             Random random = new Random(3049912);
2249             for (int i = 0; i < data.length; i += 2)
2250                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2251             fft(data);
2252             // Remove all negative frequency
2253             for (int i = fftlen / 2; i < data.length; i++)
2254                 data[i] = 0;
2255             for (int i = 1024 * 4; i < 2048 * 4; i++)
2256                 data[i] = 1.0 - (i - 4096) / 4096.0;
2257             for (int i = 0; i < 2048; i++)
2258                 data[i] = 0.2 + 0.8 * (i / 2048.0);
2259             randomPhase(data, new Random(3049912));
2260             ifft(data);
2261             normalize(data, 0.9);
2262             data = realPart(data);
2263             double gain = 1.0;
2264             for (int i = 0; i < data.length; i++) {
2265                 data[i] *= gain;
2266                 gain *= 0.9996;
2267             }
2268             datah = data;
2269         }
2270 
2271         for (int i = 0; i < 5; i++)
2272             datah[i] *= i / 5.0;
2273         SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah);
2274 
2275         SF2Layer layer = new SF2Layer(sf2);
2276         layer.setName("Closed Hi-Hat");
2277 
2278         SF2GlobalRegion global = new SF2GlobalRegion();
2279         layer.setGlobalZone(global);
2280         sf2.addResource(layer);
2281 
2282         SF2LayerRegion region = new SF2LayerRegion();
2283         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2284         region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2285         region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
2286         region.setSample(sample);
2287         layer.getRegions().add(region);
2288 
2289         return layer;
2290     }
2291 
2292     public static SF2Layer new_open_hihat(SF2Soundbank sf2) {
2293         double datah[];
2294         {
2295             int fftlen = 4096 * 4;
2296             double[] data = new double[2 * fftlen];
2297             Random random = new Random(3049912);
2298             for (int i = 0; i < data.length; i += 2)
2299                 data[i] = (2.0 * (random.nextDouble() - 0.5));
2300             for (int i = fftlen / 2; i < data.length; i++)
2301                 data[i] = 0;
2302             for (int i = 0; i < 200; i++)
2303                 data[i] = 0;
2304             for (int i = 0; i < 2048 * 4; i++) {
2305                 double gain = (i / (2048.0 * 4.0));
2306                 data[i] = gain;
2307             }
2308             datah = data;
2309         }
2310 
2311         SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5);
2312 
2313         SF2Layer layer = new SF2Layer(sf2);
2314         layer.setName("Open Hi-Hat");
2315 
2316         SF2GlobalRegion global = new SF2GlobalRegion();
2317         layer.setGlobalZone(global);
2318         sf2.addResource(layer);
2319 
2320         SF2LayerRegion region = new SF2LayerRegion();
2321         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500);
2322         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2323         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500);
2324         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2325         region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2326         region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
2327         region.setSample(sample);
2328         layer.getRegions().add(region);
2329 
2330         return layer;
2331     }
2332 
2333     public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) {
2334         double datah[];
2335         {
2336             int fftlen = 4096 * 4;
2337             double[] data = new double[2 * fftlen];
2338             Random random = new Random(3049912);
2339             for (int i = 0; i < data.length; i += 2)
2340                 data[i] = (2.0 * (random.nextDouble() - 0.5));
2341             for (int i = fftlen / 2; i < data.length; i++)
2342                 data[i] = 0;
2343             for (int i = 0; i < 100; i++)
2344                 data[i] = 0;
2345             for (int i = 0; i < 512 * 2; i++) {
2346                 double gain = (i / (512.0 * 2.0));
2347                 data[i] = gain;
2348             }
2349             datah = data;
2350         }
2351 
2352         SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5);
2353 
2354         SF2Layer layer = new SF2Layer(sf2);
2355         layer.setName("Crash Cymbal");
2356 
2357         SF2GlobalRegion global = new SF2GlobalRegion();
2358         layer.setGlobalZone(global);
2359         sf2.addResource(layer);
2360 
2361         SF2LayerRegion region = new SF2LayerRegion();
2362         region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800);
2363         region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2364         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800);
2365         region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2366         region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2367         region.setSample(sample);
2368         layer.getRegions().add(region);
2369 
2370         return layer;
2371     }
2372 
2373     public static SF2Layer new_side_stick(SF2Soundbank sf2) {
2374         double datab[];
2375 
2376         // Make treble part
2377         {
2378             int fftlen = 4096 * 4;
2379             double[] data = new double[2 * fftlen];
2380             Random random = new Random(3049912);
2381             for (int i = 0; i < data.length; i += 2)
2382                 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2383             fft(data);
2384             // Remove all negative frequency
2385             for (int i = fftlen / 2; i < data.length; i++)
2386                 data[i] = 0;
2387             for (int i = 1024 * 4; i < 2048 * 4; i++)
2388                 data[i] = 1.0 - (i - 4096) / 4096.0;
2389             for (int i = 0; i < 200; i++) {
2390                 double g = (1.0 - (i / 200.0));
2391                 data[i] *= 1.0 + 20 * g * g;
2392             }
2393             for (int i = 0; i < 30; i++)
2394                 data[i] = 0;
2395             randomPhase(data, new Random(3049912));
2396             ifft(data);
2397             normalize(data, 0.9);
2398             data = realPart(data);
2399             double gain = 1.0;
2400             for (int i = 0; i < data.length; i++) {
2401                 data[i] *= gain;
2402                 gain *= 0.9996;
2403             }
2404             datab = data;
2405         }
2406 
2407         for (int i = 0; i < 10; i++)
2408             datab[i] *= i / 10.0;
2409 
2410         SF2Sample sample = newSimpleDrumSample(sf2, "Side Stick", datab);
2411 
2412         SF2Layer layer = new SF2Layer(sf2);
2413         layer.setName("Side Stick");
2414 
2415         SF2GlobalRegion global = new SF2GlobalRegion();
2416         layer.setGlobalZone(global);
2417         sf2.addResource(layer);
2418 
2419         SF2LayerRegion region = new SF2LayerRegion();
2420         region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2421         region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2422         region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -50);
2423         region.setSample(sample);
2424         layer.getRegions().add(region);
2425 
2426         return layer;
2427 
2428     }
2429 
2430     public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,
2431             double[] data, double base) {
2432         return newSimpleFFTSample(sf2, name, data, base, 10);
2433     }
2434 
2435     public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,
2436             double[] data, double base, int fadeuptime) {
2437 
2438         int fftsize = data.length / 2;
2439         AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
2440         double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;
2441 
2442         randomPhase(data);
2443         ifft(data);
2444         data = realPart(data);
2445         normalize(data, 0.9);
2446         float[] fdata = toFloat(data);
2447         fdata = loopExtend(fdata, fdata.length + 512);
2448         fadeUp(fdata, fadeuptime);
2449         byte[] bdata = toBytes(fdata, format);
2450 
2451         /*
2452          * Create SoundFont2 sample.
2453          */
2454         SF2Sample sample = new SF2Sample(sf2);
2455         sample.setName(name);
2456         sample.setData(bdata);
2457         sample.setStartLoop(256);
2458         sample.setEndLoop(fftsize + 256);
2459         sample.setSampleRate((long) format.getSampleRate());
2460         double orgnote = (69 + 12)
2461                 + (12 * Math.log(basefreq / 440.0) / Math.log(2));
2462         sample.setOriginalPitch((int) orgnote);
2463         sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));
2464         sf2.addResource(sample);
2465 
2466         return sample;
2467     }
2468 
2469     public static SF2Sample newSimpleFFTSample_dist(SF2Soundbank sf2,
2470             String name, double[] data, double base, double preamp) {
2471 
2472         int fftsize = data.length / 2;
2473         AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
2474         double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;
2475 
2476         randomPhase(data);
2477         ifft(data);
2478         data = realPart(data);
2479 
2480         for (int i = 0; i < data.length; i++) {
2481             data[i] = (1 - Math.exp(-Math.abs(data[i] * preamp)))
2482                     * Math.signum(data[i]);
2483         }
2484 
2485         normalize(data, 0.9);
2486         float[] fdata = toFloat(data);
2487         fdata = loopExtend(fdata, fdata.length + 512);
2488         fadeUp(fdata, 80);
2489         byte[] bdata = toBytes(fdata, format);
2490 
2491         /*
2492          * Create SoundFont2 sample.
2493          */
2494         SF2Sample sample = new SF2Sample(sf2);
2495         sample.setName(name);
2496         sample.setData(bdata);
2497         sample.setStartLoop(256);
2498         sample.setEndLoop(fftsize + 256);
2499         sample.setSampleRate((long) format.getSampleRate());
2500         double orgnote = (69 + 12)
2501                 + (12 * Math.log(basefreq / 440.0) / Math.log(2));
2502         sample.setOriginalPitch((int) orgnote);
2503         sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));
2504         sf2.addResource(sample);
2505 
2506         return sample;
2507     }
2508 
2509     public static SF2Sample newSimpleDrumSample(SF2Soundbank sf2, String name,
2510             double[] data) {
2511 
2512         int fftsize = data.length;
2513         AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
2514 
2515         byte[] bdata = toBytes(toFloat(realPart(data)), format);
2516 
2517         /*
2518          * Create SoundFont2 sample.
2519          */
2520         SF2Sample sample = new SF2Sample(sf2);
2521         sample.setName(name);
2522         sample.setData(bdata);
2523         sample.setStartLoop(256);
2524         sample.setEndLoop(fftsize + 256);
2525         sample.setSampleRate((long) format.getSampleRate());
2526         sample.setOriginalPitch(60);
2527         sf2.addResource(sample);
2528 
2529         return sample;
2530     }
2531 
2532     public static SF2Layer newLayer(SF2Soundbank sf2, String name, SF2Sample sample) {
2533         SF2LayerRegion region = new SF2LayerRegion();
2534         region.setSample(sample);
2535 
2536         SF2Layer layer = new SF2Layer(sf2);
2537         layer.setName(name);
2538         layer.getRegions().add(region);
2539         sf2.addResource(layer);
2540 
2541         return layer;
2542     }
2543 
2544     public static SF2Instrument newInstrument(SF2Soundbank sf2, String name,
2545             Patch patch, SF2Layer... layers) {
2546 
2547         /*
2548          * Create SoundFont2 instrument.
2549          */
2550         SF2Instrument ins = new SF2Instrument(sf2);
2551         ins.setPatch(patch);
2552         ins.setName(name);
2553         sf2.addInstrument(ins);
2554 
2555         /*
2556          * Create region for instrument.
2557          */
2558         for (int i = 0; i < layers.length; i++) {
2559             SF2InstrumentRegion insregion = new SF2InstrumentRegion();
2560             insregion.setLayer(layers[i]);
2561             ins.getRegions().add(insregion);
2562         }
2563 
2564         return ins;
2565     }
2566 
2567     static public void ifft(double[] data) {
2568         new FFT(data.length / 2, 1).transform(data);
2569     }
2570 
2571     static public void fft(double[] data) {
2572         new FFT(data.length / 2, -1).transform(data);
2573     }
2574 
2575     public static void complexGaussianDist(double[] cdata, double m,
2576             double s, double v) {
2577         for (int x = 0; x < cdata.length / 4; x++) {
2578             cdata[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     }
2582 
2583     static public void randomPhase(double[] data) {
2584         for (int i = 0; i < data.length; i += 2) {
2585             double phase = Math.random() * 2 * Math.PI;
2586             double d = data[i];
2587             data[i] = Math.sin(phase) * d;
2588             data[i + 1] = Math.cos(phase) * d;
2589         }
2590     }
2591 
2592     static public void randomPhase(double[] data, Random random) {
2593         for (int i = 0; i < data.length; i += 2) {
2594             double phase = random.nextDouble() * 2 * Math.PI;
2595             double d = data[i];
2596             data[i] = Math.sin(phase) * d;
2597             data[i + 1] = Math.cos(phase) * d;
2598         }
2599     }
2600 
2601     static public void normalize(double[] data, double target) {
2602         double maxvalue = 0;
2603         for (int i = 0; i < data.length; i++) {
2604             if (data[i] > maxvalue)
2605                 maxvalue = data[i];
2606             if (-data[i] > maxvalue)
2607                 maxvalue = -data[i];
2608         }
2609         if (maxvalue == 0)
2610             return;
2611         double gain = target / maxvalue;
2612         for (int i = 0; i < data.length; i++)
2613             data[i] *= gain;
2614     }
2615 
2616     static public void normalize(float[] data, double target) {
2617         double maxvalue = 0.5;
2618         for (int i = 0; i < data.length; i++) {
2619             if (data[i * 2] > maxvalue)
2620                 maxvalue = data[i * 2];
2621             if (-data[i * 2] > maxvalue)
2622                 maxvalue = -data[i * 2];
2623         }
2624         double gain = target / maxvalue;
2625         for (int i = 0; i < data.length; i++)
2626             data[i * 2] *= gain;
2627     }
2628 
2629     static public double[] realPart(double[] in) {
2630         double[] out = new double[in.length / 2];
2631         for (int i = 0; i < out.length; i++) {
2632             out[i] = in[i * 2];
2633         }
2634         return out;
2635     }
2636 
2637     static public double[] imgPart(double[] in) {
2638         double[] out = new double[in.length / 2];
2639         for (int i = 0; i < out.length; i++) {
2640             out[i] = in[i * 2];
2641         }
2642         return out;
2643     }
2644 
2645     static public float[] toFloat(double[] in) {
2646         float[] out = new float[in.length];
2647         for (int i = 0; i < out.length; i++) {
2648             out[i] = (float) in[i];
2649         }
2650         return out;
2651     }
2652 
2653     static public byte[] toBytes(float[] in, AudioFormat format) {
2654         byte[] out = new byte[in.length * format.getFrameSize()];
2655         return AudioFloatConverter.getConverter(format).toByteArray(in, out);
2656     }
2657 
2658     static public void fadeUp(double[] data, int samples) {
2659         double dsamples = samples;
2660         for (int i = 0; i < samples; i++)
2661             data[i] *= i / dsamples;
2662     }
2663 
2664     static public void fadeUp(float[] data, int samples) {
2665         double dsamples = samples;
2666         for (int i = 0; i < samples; i++)
2667             data[i] *= i / dsamples;
2668     }
2669 
2670     static public double[] loopExtend(double[] data, int newsize) {
2671         double[] outdata = new double[newsize];
2672         int p_len = data.length;
2673         int p_ps = 0;
2674         for (int i = 0; i < outdata.length; i++) {
2675             outdata[i] = data[p_ps];
2676             p_ps++;
2677             if (p_ps == p_len)
2678                 p_ps = 0;
2679         }
2680         return outdata;
2681     }
2682 
2683     static public float[] loopExtend(float[] data, int newsize) {
2684         float[] outdata = new float[newsize];
2685         int p_len = data.length;
2686         int p_ps = 0;
2687         for (int i = 0; i < outdata.length; i++) {
2688             outdata[i] = data[p_ps];
2689             p_ps++;
2690             if (p_ps == p_len)
2691                 p_ps = 0;
2692         }
2693         return outdata;
2694     }
2695 }