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