1 /* 2 * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 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 }