2696 lines
98 KiB
Java
2696 lines
98 KiB
Java
/*
|
|
* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
package com.sun.media.sound;
|
|
|
|
import java.util.Random;
|
|
|
|
import javax.sound.midi.Patch;
|
|
import javax.sound.sampled.AudioFormat;
|
|
|
|
/**
|
|
* Emergency Soundbank generator.
|
|
* Used when no other default soundbank can be found.
|
|
*
|
|
* @author Karl Helgason
|
|
*/
|
|
public final class EmergencySoundbank {
|
|
|
|
private final static String[] general_midi_instruments = {
|
|
"Acoustic Grand Piano",
|
|
"Bright Acoustic Piano",
|
|
"Electric Grand Piano",
|
|
"Honky-tonk Piano",
|
|
"Electric Piano 1",
|
|
"Electric Piano 2",
|
|
"Harpsichord",
|
|
"Clavi",
|
|
"Celesta",
|
|
"Glockenspiel",
|
|
"Music Box",
|
|
"Vibraphone",
|
|
"Marimba",
|
|
"Xylophone",
|
|
"Tubular Bells",
|
|
"Dulcimer",
|
|
"Drawbar Organ",
|
|
"Percussive Organ",
|
|
"Rock Organ",
|
|
"Church Organ",
|
|
"Reed Organ",
|
|
"Accordion",
|
|
"Harmonica",
|
|
"Tango Accordion",
|
|
"Acoustic Guitar (nylon)",
|
|
"Acoustic Guitar (steel)",
|
|
"Electric Guitar (jazz)",
|
|
"Electric Guitar (clean)",
|
|
"Electric Guitar (muted)",
|
|
"Overdriven Guitar",
|
|
"Distortion Guitar",
|
|
"Guitar harmonics",
|
|
"Acoustic Bass",
|
|
"Electric Bass (finger)",
|
|
"Electric Bass (pick)",
|
|
"Fretless Bass",
|
|
"Slap Bass 1",
|
|
"Slap Bass 2",
|
|
"Synth Bass 1",
|
|
"Synth Bass 2",
|
|
"Violin",
|
|
"Viola",
|
|
"Cello",
|
|
"Contrabass",
|
|
"Tremolo Strings",
|
|
"Pizzicato Strings",
|
|
"Orchestral Harp",
|
|
"Timpani",
|
|
"String Ensemble 1",
|
|
"String Ensemble 2",
|
|
"SynthStrings 1",
|
|
"SynthStrings 2",
|
|
"Choir Aahs",
|
|
"Voice Oohs",
|
|
"Synth Voice",
|
|
"Orchestra Hit",
|
|
"Trumpet",
|
|
"Trombone",
|
|
"Tuba",
|
|
"Muted Trumpet",
|
|
"French Horn",
|
|
"Brass Section",
|
|
"SynthBrass 1",
|
|
"SynthBrass 2",
|
|
"Soprano Sax",
|
|
"Alto Sax",
|
|
"Tenor Sax",
|
|
"Baritone Sax",
|
|
"Oboe",
|
|
"English Horn",
|
|
"Bassoon",
|
|
"Clarinet",
|
|
"Piccolo",
|
|
"Flute",
|
|
"Recorder",
|
|
"Pan Flute",
|
|
"Blown Bottle",
|
|
"Shakuhachi",
|
|
"Whistle",
|
|
"Ocarina",
|
|
"Lead 1 (square)",
|
|
"Lead 2 (sawtooth)",
|
|
"Lead 3 (calliope)",
|
|
"Lead 4 (chiff)",
|
|
"Lead 5 (charang)",
|
|
"Lead 6 (voice)",
|
|
"Lead 7 (fifths)",
|
|
"Lead 8 (bass + lead)",
|
|
"Pad 1 (new age)",
|
|
"Pad 2 (warm)",
|
|
"Pad 3 (polysynth)",
|
|
"Pad 4 (choir)",
|
|
"Pad 5 (bowed)",
|
|
"Pad 6 (metallic)",
|
|
"Pad 7 (halo)",
|
|
"Pad 8 (sweep)",
|
|
"FX 1 (rain)",
|
|
"FX 2 (soundtrack)",
|
|
"FX 3 (crystal)",
|
|
"FX 4 (atmosphere)",
|
|
"FX 5 (brightness)",
|
|
"FX 6 (goblins)",
|
|
"FX 7 (echoes)",
|
|
"FX 8 (sci-fi)",
|
|
"Sitar",
|
|
"Banjo",
|
|
"Shamisen",
|
|
"Koto",
|
|
"Kalimba",
|
|
"Bag pipe",
|
|
"Fiddle",
|
|
"Shanai",
|
|
"Tinkle Bell",
|
|
"Agogo",
|
|
"Steel Drums",
|
|
"Woodblock",
|
|
"Taiko Drum",
|
|
"Melodic Tom",
|
|
"Synth Drum",
|
|
"Reverse Cymbal",
|
|
"Guitar Fret Noise",
|
|
"Breath Noise",
|
|
"Seashore",
|
|
"Bird Tweet",
|
|
"Telephone Ring",
|
|
"Helicopter",
|
|
"Applause",
|
|
"Gunshot"
|
|
};
|
|
|
|
public static SF2Soundbank createSoundbank() throws Exception {
|
|
SF2Soundbank sf2 = new SF2Soundbank();
|
|
sf2.setName("Emergency GM sound set");
|
|
sf2.setVendor("Generated");
|
|
sf2.setDescription("Emergency generated soundbank");
|
|
|
|
/*
|
|
* percussion instruments
|
|
*/
|
|
|
|
SF2Layer bass_drum = new_bass_drum(sf2);
|
|
SF2Layer snare_drum = new_snare_drum(sf2);
|
|
SF2Layer tom = new_tom(sf2);
|
|
SF2Layer open_hihat = new_open_hihat(sf2);
|
|
SF2Layer closed_hihat = new_closed_hihat(sf2);
|
|
SF2Layer crash_cymbal = new_crash_cymbal(sf2);
|
|
SF2Layer side_stick = new_side_stick(sf2);
|
|
|
|
SF2Layer[] drums = new SF2Layer[128];
|
|
drums[35] = bass_drum;
|
|
drums[36] = bass_drum;
|
|
drums[38] = snare_drum;
|
|
drums[40] = snare_drum;
|
|
drums[41] = tom;
|
|
drums[43] = tom;
|
|
drums[45] = tom;
|
|
drums[47] = tom;
|
|
drums[48] = tom;
|
|
drums[50] = tom;
|
|
drums[42] = closed_hihat;
|
|
drums[44] = closed_hihat;
|
|
drums[46] = open_hihat;
|
|
drums[49] = crash_cymbal;
|
|
drums[51] = crash_cymbal;
|
|
drums[52] = crash_cymbal;
|
|
drums[55] = crash_cymbal;
|
|
drums[57] = crash_cymbal;
|
|
drums[59] = crash_cymbal;
|
|
|
|
// Use side_stick for missing drums:
|
|
drums[37] = side_stick;
|
|
drums[39] = side_stick;
|
|
drums[53] = side_stick;
|
|
drums[54] = side_stick;
|
|
drums[56] = side_stick;
|
|
drums[58] = side_stick;
|
|
drums[69] = side_stick;
|
|
drums[70] = side_stick;
|
|
drums[75] = side_stick;
|
|
drums[60] = side_stick;
|
|
drums[61] = side_stick;
|
|
drums[62] = side_stick;
|
|
drums[63] = side_stick;
|
|
drums[64] = side_stick;
|
|
drums[65] = side_stick;
|
|
drums[66] = side_stick;
|
|
drums[67] = side_stick;
|
|
drums[68] = side_stick;
|
|
drums[71] = side_stick;
|
|
drums[72] = side_stick;
|
|
drums[73] = side_stick;
|
|
drums[74] = side_stick;
|
|
drums[76] = side_stick;
|
|
drums[77] = side_stick;
|
|
drums[78] = side_stick;
|
|
drums[79] = side_stick;
|
|
drums[80] = side_stick;
|
|
drums[81] = side_stick;
|
|
|
|
|
|
SF2Instrument drum_instrument = new SF2Instrument(sf2);
|
|
drum_instrument.setName("Standard Kit");
|
|
drum_instrument.setPatch(new ModelPatch(0, 0, true));
|
|
sf2.addInstrument(drum_instrument);
|
|
for (int i = 0; i < drums.length; i++) {
|
|
if (drums[i] != null) {
|
|
SF2InstrumentRegion region = new SF2InstrumentRegion();
|
|
region.setLayer(drums[i]);
|
|
region.putBytes(SF2InstrumentRegion.GENERATOR_KEYRANGE,
|
|
new byte[]{(byte) i, (byte) i});
|
|
drum_instrument.getRegions().add(region);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* melodic instruments
|
|
*/
|
|
|
|
SF2Layer gpiano = new_gpiano(sf2);
|
|
SF2Layer gpiano2 = new_gpiano2(sf2);
|
|
SF2Layer gpiano_hammer = new_piano_hammer(sf2);
|
|
SF2Layer piano1 = new_piano1(sf2);
|
|
SF2Layer epiano1 = new_epiano1(sf2);
|
|
SF2Layer epiano2 = new_epiano2(sf2);
|
|
|
|
SF2Layer guitar = new_guitar1(sf2);
|
|
SF2Layer guitar_pick = new_guitar_pick(sf2);
|
|
SF2Layer guitar_dist = new_guitar_dist(sf2);
|
|
SF2Layer bass1 = new_bass1(sf2);
|
|
SF2Layer bass2 = new_bass2(sf2);
|
|
SF2Layer synthbass = new_synthbass(sf2);
|
|
SF2Layer string2 = new_string2(sf2);
|
|
SF2Layer orchhit = new_orchhit(sf2);
|
|
SF2Layer choir = new_choir(sf2);
|
|
SF2Layer solostring = new_solostring(sf2);
|
|
SF2Layer organ = new_organ(sf2);
|
|
SF2Layer ch_organ = new_ch_organ(sf2);
|
|
SF2Layer bell = new_bell(sf2);
|
|
SF2Layer flute = new_flute(sf2);
|
|
|
|
SF2Layer timpani = new_timpani(sf2);
|
|
SF2Layer melodic_toms = new_melodic_toms(sf2);
|
|
SF2Layer trumpet = new_trumpet(sf2);
|
|
SF2Layer trombone = new_trombone(sf2);
|
|
SF2Layer brass_section = new_brass_section(sf2);
|
|
SF2Layer horn = new_horn(sf2);
|
|
SF2Layer sax = new_sax(sf2);
|
|
SF2Layer oboe = new_oboe(sf2);
|
|
SF2Layer bassoon = new_bassoon(sf2);
|
|
SF2Layer clarinet = new_clarinet(sf2);
|
|
SF2Layer reverse_cymbal = new_reverse_cymbal(sf2);
|
|
|
|
SF2Layer defaultsound = piano1;
|
|
|
|
newInstrument(sf2, "Piano", new Patch(0, 0), gpiano, gpiano_hammer);
|
|
newInstrument(sf2, "Piano", new Patch(0, 1), gpiano2, gpiano_hammer);
|
|
newInstrument(sf2, "Piano", new Patch(0, 2), piano1);
|
|
{
|
|
SF2Instrument ins = newInstrument(sf2, "Honky-tonk Piano",
|
|
new Patch(0, 3), piano1, piano1);
|
|
SF2InstrumentRegion region = ins.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 80);
|
|
region.putInteger(SF2Region.GENERATOR_FINETUNE, 30);
|
|
region = ins.getRegions().get(1);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 30);
|
|
}
|
|
newInstrument(sf2, "Rhodes", new Patch(0, 4), epiano2);
|
|
newInstrument(sf2, "Rhodes", new Patch(0, 5), epiano2);
|
|
newInstrument(sf2, "Clavinet", new Patch(0, 6), epiano1);
|
|
newInstrument(sf2, "Clavinet", new Patch(0, 7), epiano1);
|
|
newInstrument(sf2, "Rhodes", new Patch(0, 8), epiano2);
|
|
newInstrument(sf2, "Bell", new Patch(0, 9), bell);
|
|
newInstrument(sf2, "Bell", new Patch(0, 10), bell);
|
|
newInstrument(sf2, "Vibraphone", new Patch(0, 11), bell);
|
|
newInstrument(sf2, "Marimba", new Patch(0, 12), bell);
|
|
newInstrument(sf2, "Marimba", new Patch(0, 13), bell);
|
|
newInstrument(sf2, "Bell", new Patch(0, 14), bell);
|
|
newInstrument(sf2, "Rock Organ", new Patch(0, 15), organ);
|
|
newInstrument(sf2, "Rock Organ", new Patch(0, 16), organ);
|
|
newInstrument(sf2, "Perc Organ", new Patch(0, 17), organ);
|
|
newInstrument(sf2, "Rock Organ", new Patch(0, 18), organ);
|
|
newInstrument(sf2, "Church Organ", new Patch(0, 19), ch_organ);
|
|
newInstrument(sf2, "Accordion", new Patch(0, 20), organ);
|
|
newInstrument(sf2, "Accordion", new Patch(0, 21), organ);
|
|
newInstrument(sf2, "Accordion", new Patch(0, 22), organ);
|
|
newInstrument(sf2, "Accordion", new Patch(0, 23), organ);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 24), guitar, guitar_pick);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 25), guitar, guitar_pick);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 26), guitar, guitar_pick);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 27), guitar, guitar_pick);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 28), guitar, guitar_pick);
|
|
newInstrument(sf2, "Distorted Guitar", new Patch(0, 29), guitar_dist);
|
|
newInstrument(sf2, "Distorted Guitar", new Patch(0, 30), guitar_dist);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 31), guitar, guitar_pick);
|
|
newInstrument(sf2, "Finger Bass", new Patch(0, 32), bass1);
|
|
newInstrument(sf2, "Finger Bass", new Patch(0, 33), bass1);
|
|
newInstrument(sf2, "Finger Bass", new Patch(0, 34), bass1);
|
|
newInstrument(sf2, "Frettless Bass", new Patch(0, 35), bass2);
|
|
newInstrument(sf2, "Frettless Bass", new Patch(0, 36), bass2);
|
|
newInstrument(sf2, "Frettless Bass", new Patch(0, 37), bass2);
|
|
newInstrument(sf2, "Synth Bass1", new Patch(0, 38), synthbass);
|
|
newInstrument(sf2, "Synth Bass2", new Patch(0, 39), synthbass);
|
|
newInstrument(sf2, "Solo String", new Patch(0, 40), string2, solostring);
|
|
newInstrument(sf2, "Solo String", new Patch(0, 41), string2, solostring);
|
|
newInstrument(sf2, "Solo String", new Patch(0, 42), string2, solostring);
|
|
newInstrument(sf2, "Solo String", new Patch(0, 43), string2, solostring);
|
|
newInstrument(sf2, "Solo String", new Patch(0, 44), string2, solostring);
|
|
newInstrument(sf2, "Def", new Patch(0, 45), defaultsound);
|
|
newInstrument(sf2, "Harp", new Patch(0, 46), bell);
|
|
newInstrument(sf2, "Timpani", new Patch(0, 47), timpani);
|
|
newInstrument(sf2, "Strings", new Patch(0, 48), string2);
|
|
SF2Instrument slow_strings =
|
|
newInstrument(sf2, "Slow Strings", new Patch(0, 49), string2);
|
|
SF2InstrumentRegion region = slow_strings.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, 2500);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 2000);
|
|
newInstrument(sf2, "Synth Strings", new Patch(0, 50), string2);
|
|
newInstrument(sf2, "Synth Strings", new Patch(0, 51), string2);
|
|
|
|
|
|
newInstrument(sf2, "Choir", new Patch(0, 52), choir);
|
|
newInstrument(sf2, "Choir", new Patch(0, 53), choir);
|
|
newInstrument(sf2, "Choir", new Patch(0, 54), choir);
|
|
{
|
|
SF2Instrument ins = newInstrument(sf2, "Orch Hit",
|
|
new Patch(0, 55), orchhit, orchhit, timpani);
|
|
region = ins.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_COARSETUNE, -12);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
}
|
|
newInstrument(sf2, "Trumpet", new Patch(0, 56), trumpet);
|
|
newInstrument(sf2, "Trombone", new Patch(0, 57), trombone);
|
|
newInstrument(sf2, "Trombone", new Patch(0, 58), trombone);
|
|
newInstrument(sf2, "Trumpet", new Patch(0, 59), trumpet);
|
|
newInstrument(sf2, "Horn", new Patch(0, 60), horn);
|
|
newInstrument(sf2, "Brass Section", new Patch(0, 61), brass_section);
|
|
newInstrument(sf2, "Brass Section", new Patch(0, 62), brass_section);
|
|
newInstrument(sf2, "Brass Section", new Patch(0, 63), brass_section);
|
|
newInstrument(sf2, "Sax", new Patch(0, 64), sax);
|
|
newInstrument(sf2, "Sax", new Patch(0, 65), sax);
|
|
newInstrument(sf2, "Sax", new Patch(0, 66), sax);
|
|
newInstrument(sf2, "Sax", new Patch(0, 67), sax);
|
|
newInstrument(sf2, "Oboe", new Patch(0, 68), oboe);
|
|
newInstrument(sf2, "Horn", new Patch(0, 69), horn);
|
|
newInstrument(sf2, "Bassoon", new Patch(0, 70), bassoon);
|
|
newInstrument(sf2, "Clarinet", new Patch(0, 71), clarinet);
|
|
newInstrument(sf2, "Flute", new Patch(0, 72), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 73), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 74), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 75), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 76), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 77), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 78), flute);
|
|
newInstrument(sf2, "Flute", new Patch(0, 79), flute);
|
|
newInstrument(sf2, "Organ", new Patch(0, 80), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 81), organ);
|
|
newInstrument(sf2, "Flute", new Patch(0, 82), flute);
|
|
newInstrument(sf2, "Organ", new Patch(0, 83), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 84), organ);
|
|
newInstrument(sf2, "Choir", new Patch(0, 85), choir);
|
|
newInstrument(sf2, "Organ", new Patch(0, 86), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 87), organ);
|
|
newInstrument(sf2, "Synth Strings", new Patch(0, 88), string2);
|
|
newInstrument(sf2, "Organ", new Patch(0, 89), organ);
|
|
newInstrument(sf2, "Def", new Patch(0, 90), defaultsound);
|
|
newInstrument(sf2, "Choir", new Patch(0, 91), choir);
|
|
newInstrument(sf2, "Organ", new Patch(0, 92), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 93), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 94), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 95), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 96), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 97), organ);
|
|
newInstrument(sf2, "Bell", new Patch(0, 98), bell);
|
|
newInstrument(sf2, "Organ", new Patch(0, 99), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 100), organ);
|
|
newInstrument(sf2, "Organ", new Patch(0, 101), organ);
|
|
newInstrument(sf2, "Def", new Patch(0, 102), defaultsound);
|
|
newInstrument(sf2, "Synth Strings", new Patch(0, 103), string2);
|
|
newInstrument(sf2, "Def", new Patch(0, 104), defaultsound);
|
|
newInstrument(sf2, "Def", new Patch(0, 105), defaultsound);
|
|
newInstrument(sf2, "Def", new Patch(0, 106), defaultsound);
|
|
newInstrument(sf2, "Def", new Patch(0, 107), defaultsound);
|
|
newInstrument(sf2, "Marimba", new Patch(0, 108), bell);
|
|
newInstrument(sf2, "Sax", new Patch(0, 109), sax);
|
|
newInstrument(sf2, "Solo String", new Patch(0, 110), string2, solostring);
|
|
newInstrument(sf2, "Oboe", new Patch(0, 111), oboe);
|
|
newInstrument(sf2, "Bell", new Patch(0, 112), bell);
|
|
newInstrument(sf2, "Melodic Toms", new Patch(0, 113), melodic_toms);
|
|
newInstrument(sf2, "Marimba", new Patch(0, 114), bell);
|
|
newInstrument(sf2, "Melodic Toms", new Patch(0, 115), melodic_toms);
|
|
newInstrument(sf2, "Melodic Toms", new Patch(0, 116), melodic_toms);
|
|
newInstrument(sf2, "Melodic Toms", new Patch(0, 117), melodic_toms);
|
|
newInstrument(sf2, "Reverse Cymbal", new Patch(0, 118), reverse_cymbal);
|
|
newInstrument(sf2, "Reverse Cymbal", new Patch(0, 119), reverse_cymbal);
|
|
newInstrument(sf2, "Guitar", new Patch(0, 120), guitar);
|
|
newInstrument(sf2, "Def", new Patch(0, 121), defaultsound);
|
|
{
|
|
SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",
|
|
new Patch(0, 122), reverse_cymbal);
|
|
region = ins.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);
|
|
}
|
|
{
|
|
SF2Instrument ins = newInstrument(sf2, "Bird/Flute",
|
|
new Patch(0, 123), flute);
|
|
region = ins.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_COARSETUNE, 24);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -3000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
}
|
|
newInstrument(sf2, "Def", new Patch(0, 124), side_stick);
|
|
{
|
|
SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal",
|
|
new Patch(0, 125), reverse_cymbal);
|
|
region = ins.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500);
|
|
}
|
|
newInstrument(sf2, "Applause/crash_cymbal",
|
|
new Patch(0, 126), crash_cymbal);
|
|
newInstrument(sf2, "Gunshot/side_stick", new Patch(0, 127), side_stick);
|
|
|
|
for (SF2Instrument instrument : sf2.getInstruments()) {
|
|
Patch patch = instrument.getPatch();
|
|
if (patch instanceof ModelPatch) {
|
|
if (((ModelPatch) patch).isPercussion())
|
|
continue;
|
|
}
|
|
instrument.setName(general_midi_instruments[patch.getProgram()]);
|
|
}
|
|
|
|
return sf2;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_bell(SF2Soundbank sf2) {
|
|
Random random = new Random(102030201);
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.01;
|
|
double end_w = 0.05;
|
|
double start_a = 0.2;
|
|
double end_a = 0.00001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
double detune = 1 + (random.nextDouble() * 2 - 1) * 0.01;
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1) * detune, w, a);
|
|
a *= a_step;
|
|
}
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);
|
|
SF2Layer layer = newLayer(sf2, "EPiano", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_guitar1(SF2Soundbank sf2) {
|
|
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.01;
|
|
double end_w = 0.01;
|
|
double start_a = 2;
|
|
double end_a = 0.01;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
|
|
double[] aa = new double[40];
|
|
for (int i = 0; i < 40; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] = 2;
|
|
aa[1] = 0.5;
|
|
aa[2] = 0.45;
|
|
aa[3] = 0.2;
|
|
aa[4] = 1;
|
|
aa[5] = 0.5;
|
|
aa[6] = 2;
|
|
aa[7] = 1;
|
|
aa[8] = 0.5;
|
|
aa[9] = 1;
|
|
aa[9] = 0.5;
|
|
aa[10] = 0.2;
|
|
aa[11] = 1;
|
|
aa[12] = 0.7;
|
|
aa[13] = 0.5;
|
|
aa[14] = 1;
|
|
|
|
for (int i = 0; i < 40; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Guitar", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Guitar", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_guitar_dist(SF2Soundbank sf2) {
|
|
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.01;
|
|
double end_w = 0.01;
|
|
double start_a = 2;
|
|
double end_a = 0.01;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
|
|
double[] aa = new double[40];
|
|
for (int i = 0; i < 40; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] = 5;
|
|
aa[1] = 2;
|
|
aa[2] = 0.45;
|
|
aa[3] = 0.2;
|
|
aa[4] = 1;
|
|
aa[5] = 0.5;
|
|
aa[6] = 2;
|
|
aa[7] = 1;
|
|
aa[8] = 0.5;
|
|
aa[9] = 1;
|
|
aa[9] = 0.5;
|
|
aa[10] = 0.2;
|
|
aa[11] = 1;
|
|
aa[12] = 0.7;
|
|
aa[13] = 0.5;
|
|
aa[14] = 1;
|
|
|
|
for (int i = 0; i < 40; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
}
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample_dist(sf2, "Distorted Guitar",
|
|
data, base, 10000.0);
|
|
|
|
|
|
SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
//region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);
|
|
//region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200);
|
|
|
|
//region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);
|
|
//region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
//region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);
|
|
//region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_guitar_pick(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
|
|
// Make treble part
|
|
{
|
|
int m = 2;
|
|
int fftlen = 4096 * m;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5));
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 2048 * m; i++) {
|
|
data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2)
|
|
+ Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9);
|
|
}
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.8);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9994;
|
|
}
|
|
datab = data;
|
|
|
|
fadeUp(data, 80);
|
|
}
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Guitar Noise", datab);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Guitar Noise");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
// region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
/*
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);
|
|
*/
|
|
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_gpiano(SF2Soundbank sf2) {
|
|
//Random random = new Random(302030201);
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 15.0);
|
|
|
|
double[] aa = new double[30];
|
|
for (int i = 0; i < 30; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 2;
|
|
//aa[2] *= 0.1;
|
|
aa[4] *= 2;
|
|
|
|
|
|
aa[12] *= 0.9;
|
|
aa[13] *= 0.7;
|
|
for (int i = 14; i < 30; i++) {
|
|
aa[i] *= 0.5;
|
|
}
|
|
|
|
|
|
for (int i = 0; i < 30; i++) {
|
|
//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;
|
|
double w = 0.2;
|
|
double ai = aa[i];
|
|
if (i > 10) {
|
|
w = 5;
|
|
ai *= 10;
|
|
}
|
|
int adjust = 0;
|
|
if (i > 5) {
|
|
adjust = (i - 5) * 7;
|
|
}
|
|
complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);
|
|
SF2Layer layer = newLayer(sf2, "Grand Piano", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_gpiano2(SF2Soundbank sf2) {
|
|
//Random random = new Random(302030201);
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 20.0);
|
|
|
|
double[] aa = new double[30];
|
|
for (int i = 0; i < 30; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 1;
|
|
//aa[2] *= 0.1;
|
|
aa[4] *= 2;
|
|
|
|
|
|
aa[12] *= 0.9;
|
|
aa[13] *= 0.7;
|
|
for (int i = 14; i < 30; i++) {
|
|
aa[i] *= 0.5;
|
|
}
|
|
|
|
|
|
for (int i = 0; i < 30; i++) {
|
|
//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;
|
|
double w = 0.2;
|
|
double ai = aa[i];
|
|
if (i > 10) {
|
|
w = 5;
|
|
ai *= 10;
|
|
}
|
|
int adjust = 0;
|
|
if (i > 5) {
|
|
adjust = (i - 5) * 7;
|
|
}
|
|
complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);
|
|
SF2Layer layer = newLayer(sf2, "Grand Piano", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_piano_hammer(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
|
|
// Make treble part
|
|
{
|
|
int m = 2;
|
|
int fftlen = 4096 * m;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5));
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 2048 * m; i++)
|
|
data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.6);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9997;
|
|
}
|
|
datab = data;
|
|
|
|
fadeUp(data, 80);
|
|
}
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Piano Hammer", datab);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Piano Hammer");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
/*
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000);
|
|
*/
|
|
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_piano1(SF2Soundbank sf2) {
|
|
//Random random = new Random(302030201);
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_a = 0.2;
|
|
double end_a = 0.0001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
|
|
double[] aa = new double[30];
|
|
for (int i = 0; i < 30; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 5;
|
|
aa[2] *= 0.1;
|
|
aa[7] *= 5;
|
|
|
|
|
|
for (int i = 0; i < 30; i++) {
|
|
//double detune = 1 + (random.nextDouble()*2 - 1)*0.0001;
|
|
double w = 0.2;
|
|
double ai = aa[i];
|
|
if (i > 12) {
|
|
w = 5;
|
|
ai *= 10;
|
|
}
|
|
int adjust = 0;
|
|
if (i > 5) {
|
|
adjust = (i - 5) * 7;
|
|
}
|
|
complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
|
|
}
|
|
|
|
complexGaussianDist(data, base * (15.5), 1, 0.1);
|
|
complexGaussianDist(data, base * (17.5), 1, 0.01);
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base, 200);
|
|
SF2Layer layer = newLayer(sf2, "EPiano", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -1200);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_epiano1(SF2Soundbank sf2) {
|
|
Random random = new Random(302030201);
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.05;
|
|
double end_w = 0.05;
|
|
double start_a = 0.2;
|
|
double end_a = 0.0001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1) * detune, w, a);
|
|
a *= a_step;
|
|
}
|
|
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);
|
|
SF2Layer layer = newLayer(sf2, "EPiano", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_epiano2(SF2Soundbank sf2) {
|
|
Random random = new Random(302030201);
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.01;
|
|
double end_w = 0.05;
|
|
double start_a = 0.2;
|
|
double end_a = 0.00001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001;
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1) * detune, w, a);
|
|
a *= a_step;
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base);
|
|
SF2Layer layer = newLayer(sf2, "EPiano", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 8000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 2400);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_bass1(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.05;
|
|
double end_w = 0.05;
|
|
double start_a = 0.2;
|
|
double end_a = 0.02;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);
|
|
|
|
double[] aa = new double[25];
|
|
for (int i = 0; i < 25; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 8;
|
|
aa[1] *= 4;
|
|
aa[3] *= 8;
|
|
aa[5] *= 8;
|
|
|
|
for (int i = 0; i < 25; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
}
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Bass", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 11000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_synthbass(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.05;
|
|
double end_w = 0.05;
|
|
double start_a = 0.2;
|
|
double end_a = 0.02;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);
|
|
|
|
double[] aa = new double[25];
|
|
for (int i = 0; i < 25; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 16;
|
|
aa[1] *= 4;
|
|
aa[3] *= 16;
|
|
aa[5] *= 8;
|
|
|
|
for (int i = 0; i < 25; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
}
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Bass", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -3000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_bass2(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 0.05;
|
|
double end_w = 0.05;
|
|
double start_a = 0.2;
|
|
double end_a = 0.002;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 25.0);
|
|
|
|
double[] aa = new double[25];
|
|
for (int i = 0; i < 25; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 8;
|
|
aa[1] *= 4;
|
|
aa[3] *= 8;
|
|
aa[5] *= 8;
|
|
|
|
for (int i = 0; i < 25; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
}
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Bass2", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Bass2", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_solostring(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 2;
|
|
double end_w = 2;
|
|
double start_a = 0.2;
|
|
double end_a = 0.01;
|
|
|
|
double[] aa = new double[18];
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < aa.length; i++) {
|
|
a *= a_step;
|
|
aa[i] = a;
|
|
}
|
|
|
|
aa[0] *= 5;
|
|
aa[1] *= 5;
|
|
aa[2] *= 5;
|
|
aa[3] *= 4;
|
|
aa[4] *= 4;
|
|
aa[5] *= 3;
|
|
aa[6] *= 3;
|
|
aa[7] *= 2;
|
|
|
|
for (int i = 0; i < aa.length; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, a);
|
|
}
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Strings", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
region.putInteger(SF2Region.GENERATOR_FREQVIBLFO, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_VIBLFOTOPITCH, 15);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_orchhit(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 2;
|
|
double end_w = 80;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, a);
|
|
a *= a_step;
|
|
}
|
|
complexGaussianDist(data, base * 4, 300, 1);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Och Strings", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Och Strings", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 200);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 200);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_string2(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 2;
|
|
double end_w = 80;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, a);
|
|
a *= a_step;
|
|
}
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Strings", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_choir(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 25;
|
|
double start_w = 2;
|
|
double end_w = 80;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
double[] aa = new double[40];
|
|
for (int i = 0; i < aa.length; i++) {
|
|
a *= a_step;
|
|
aa[i] = a;
|
|
}
|
|
|
|
aa[5] *= 0.1;
|
|
aa[6] *= 0.01;
|
|
aa[7] *= 0.1;
|
|
aa[8] *= 0.1;
|
|
|
|
for (int i = 0; i < aa.length; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
}
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Strings", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_organ(SF2Soundbank sf2) {
|
|
Random random = new Random(102030201);
|
|
int x = 1;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
double start_w = 0.01;
|
|
double end_w = 0.01;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
|
|
for (int i = 0; i < 12; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w,
|
|
a * (0.5 + 3 * (random.nextDouble())));
|
|
a *= a_step;
|
|
}
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Organ", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_ch_organ(SF2Soundbank sf2) {
|
|
int x = 1;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
double start_w = 0.01;
|
|
double end_w = 0.01;
|
|
double start_a = 0.2;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 60.0);
|
|
|
|
double[] aa = new double[60];
|
|
for (int i = 0; i < aa.length; i++) {
|
|
a *= a_step;
|
|
aa[i] = a;
|
|
}
|
|
|
|
aa[0] *= 5;
|
|
aa[1] *= 2;
|
|
aa[2] = 0;
|
|
aa[4] = 0;
|
|
aa[5] = 0;
|
|
aa[7] *= 7;
|
|
aa[9] = 0;
|
|
aa[10] = 0;
|
|
aa[12] = 0;
|
|
aa[15] *= 7;
|
|
aa[18] = 0;
|
|
aa[20] = 0;
|
|
aa[24] = 0;
|
|
aa[27] *= 5;
|
|
aa[29] = 0;
|
|
aa[30] = 0;
|
|
aa[33] = 0;
|
|
aa[36] *= 4;
|
|
aa[37] = 0;
|
|
aa[39] = 0;
|
|
aa[42] = 0;
|
|
aa[43] = 0;
|
|
aa[47] = 0;
|
|
aa[50] *= 4;
|
|
aa[52] = 0;
|
|
aa[55] = 0;
|
|
aa[57] = 0;
|
|
|
|
|
|
aa[10] *= 0.1;
|
|
aa[11] *= 0.1;
|
|
aa[12] *= 0.1;
|
|
aa[13] *= 0.1;
|
|
|
|
aa[17] *= 0.1;
|
|
aa[18] *= 0.1;
|
|
aa[19] *= 0.1;
|
|
aa[20] *= 0.1;
|
|
|
|
for (int i = 0; i < 60; i++) {
|
|
double w = start_w + (end_w - start_w) * (i / 40.0);
|
|
complexGaussianDist(data, base * (i + 1), w, aa[i]);
|
|
a *= a_step;
|
|
}
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Organ", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_flute(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
complexGaussianDist(data, base * 1, 0.001, 0.5);
|
|
complexGaussianDist(data, base * 2, 0.001, 0.5);
|
|
complexGaussianDist(data, base * 3, 0.001, 0.5);
|
|
complexGaussianDist(data, base * 4, 0.01, 0.5);
|
|
|
|
complexGaussianDist(data, base * 4, 100, 120);
|
|
complexGaussianDist(data, base * 6, 100, 40);
|
|
complexGaussianDist(data, base * 8, 100, 80);
|
|
|
|
complexGaussianDist(data, base * 5, 0.001, 0.05);
|
|
complexGaussianDist(data, base * 6, 0.001, 0.06);
|
|
complexGaussianDist(data, base * 7, 0.001, 0.04);
|
|
complexGaussianDist(data, base * 8, 0.005, 0.06);
|
|
complexGaussianDist(data, base * 9, 0.005, 0.06);
|
|
complexGaussianDist(data, base * 10, 0.01, 0.1);
|
|
complexGaussianDist(data, base * 11, 0.08, 0.7);
|
|
complexGaussianDist(data, base * 12, 0.08, 0.6);
|
|
complexGaussianDist(data, base * 13, 0.08, 0.6);
|
|
complexGaussianDist(data, base * 14, 0.08, 0.6);
|
|
complexGaussianDist(data, base * 15, 0.08, 0.5);
|
|
complexGaussianDist(data, base * 16, 0.08, 0.5);
|
|
complexGaussianDist(data, base * 17, 0.08, 0.2);
|
|
|
|
|
|
complexGaussianDist(data, base * 1, 10, 8);
|
|
complexGaussianDist(data, base * 2, 10, 8);
|
|
complexGaussianDist(data, base * 3, 10, 8);
|
|
complexGaussianDist(data, base * 4, 10, 8);
|
|
complexGaussianDist(data, base * 5, 10, 8);
|
|
complexGaussianDist(data, base * 6, 20, 9);
|
|
complexGaussianDist(data, base * 7, 20, 9);
|
|
complexGaussianDist(data, base * 8, 20, 9);
|
|
complexGaussianDist(data, base * 9, 20, 8);
|
|
complexGaussianDist(data, base * 10, 30, 8);
|
|
complexGaussianDist(data, base * 11, 30, 9);
|
|
complexGaussianDist(data, base * 12, 30, 9);
|
|
complexGaussianDist(data, base * 13, 30, 8);
|
|
complexGaussianDist(data, base * 14, 30, 8);
|
|
complexGaussianDist(data, base * 15, 30, 7);
|
|
complexGaussianDist(data, base * 16, 30, 7);
|
|
complexGaussianDist(data, base * 17, 30, 6);
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Flute", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_horn(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
double start_a = 0.5;
|
|
double end_a = 0.00000000001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
if (i == 0)
|
|
complexGaussianDist(data, base * (i + 1), 0.1, a * 0.2);
|
|
else
|
|
complexGaussianDist(data, base * (i + 1), 0.1, a);
|
|
a *= a_step;
|
|
}
|
|
|
|
complexGaussianDist(data, base * 2, 100, 1);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Horn", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Horn", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -500);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_trumpet(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
double start_a = 0.5;
|
|
double end_a = 0.00001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);
|
|
double[] aa = new double[80];
|
|
for (int i = 0; i < 80; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 0.05;
|
|
aa[1] *= 0.2;
|
|
aa[2] *= 0.5;
|
|
aa[3] *= 0.85;
|
|
|
|
for (int i = 0; i < 80; i++) {
|
|
complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);
|
|
}
|
|
|
|
complexGaussianDist(data, base * 5, 300, 3);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Trumpet", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Trumpet", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -4000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, -2500);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_brass_section(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
double start_a = 0.5;
|
|
double end_a = 0.005;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 30.0);
|
|
double[] aa = new double[30];
|
|
for (int i = 0; i < 30; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 0.8;
|
|
aa[1] *= 0.9;
|
|
|
|
double w = 5;
|
|
for (int i = 0; i < 30; i++) {
|
|
complexGaussianDist(data, base * (i + 1), 0.1 * w, aa[i] * w);
|
|
w += 6; //*= w_step;
|
|
}
|
|
|
|
complexGaussianDist(data, base * 6, 300, 2);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Brass Section", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Brass Section", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -9200);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_trombone(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
double start_a = 0.5;
|
|
double end_a = 0.001;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 80.0);
|
|
double[] aa = new double[80];
|
|
for (int i = 0; i < 80; i++) {
|
|
aa[i] = a;
|
|
a *= a_step;
|
|
}
|
|
|
|
aa[0] *= 0.3;
|
|
aa[1] *= 0.7;
|
|
|
|
for (int i = 0; i < 80; i++) {
|
|
complexGaussianDist(data, base * (i + 1), 0.1, aa[i]);
|
|
}
|
|
|
|
complexGaussianDist(data, base * 6, 300, 2);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Trombone", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Trombone", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -2000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_sax(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
double start_a = 0.5;
|
|
double end_a = 0.01;
|
|
double a = start_a;
|
|
double a_step = Math.pow(end_a / start_a, 1.0 / 40.0);
|
|
for (int i = 0; i < 40; i++) {
|
|
if (i == 0 || i == 2)
|
|
complexGaussianDist(data, base * (i + 1), 0.1, a * 4);
|
|
else
|
|
complexGaussianDist(data, base * (i + 1), 0.1, a);
|
|
a *= a_step;
|
|
}
|
|
|
|
complexGaussianDist(data, base * 4, 200, 1);
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Sax", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Sax", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_oboe(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
complexGaussianDist(data, base * 5, 100, 80);
|
|
|
|
|
|
complexGaussianDist(data, base * 1, 0.01, 0.53);
|
|
complexGaussianDist(data, base * 2, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 3, 0.01, 0.48);
|
|
complexGaussianDist(data, base * 4, 0.01, 0.49);
|
|
complexGaussianDist(data, base * 5, 0.01, 5);
|
|
complexGaussianDist(data, base * 6, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 7, 0.01, 0.50);
|
|
complexGaussianDist(data, base * 8, 0.01, 0.59);
|
|
complexGaussianDist(data, base * 9, 0.01, 0.61);
|
|
complexGaussianDist(data, base * 10, 0.01, 0.52);
|
|
complexGaussianDist(data, base * 11, 0.01, 0.49);
|
|
complexGaussianDist(data, base * 12, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 13, 0.01, 0.48);
|
|
complexGaussianDist(data, base * 14, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 15, 0.01, 0.46);
|
|
complexGaussianDist(data, base * 16, 0.01, 0.35);
|
|
complexGaussianDist(data, base * 17, 0.01, 0.20);
|
|
complexGaussianDist(data, base * 18, 0.01, 0.10);
|
|
complexGaussianDist(data, base * 19, 0.01, 0.5);
|
|
complexGaussianDist(data, base * 20, 0.01, 0.1);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Oboe", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Oboe", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_bassoon(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
complexGaussianDist(data, base * 2, 100, 40);
|
|
complexGaussianDist(data, base * 4, 100, 20);
|
|
|
|
complexGaussianDist(data, base * 1, 0.01, 0.53);
|
|
complexGaussianDist(data, base * 2, 0.01, 5);
|
|
complexGaussianDist(data, base * 3, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 4, 0.01, 0.48);
|
|
complexGaussianDist(data, base * 5, 0.01, 1.49);
|
|
complexGaussianDist(data, base * 6, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 7, 0.01, 0.50);
|
|
complexGaussianDist(data, base * 8, 0.01, 0.59);
|
|
complexGaussianDist(data, base * 9, 0.01, 0.61);
|
|
complexGaussianDist(data, base * 10, 0.01, 0.52);
|
|
complexGaussianDist(data, base * 11, 0.01, 0.49);
|
|
complexGaussianDist(data, base * 12, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 13, 0.01, 0.48);
|
|
complexGaussianDist(data, base * 14, 0.01, 0.51);
|
|
complexGaussianDist(data, base * 15, 0.01, 0.46);
|
|
complexGaussianDist(data, base * 16, 0.01, 0.35);
|
|
complexGaussianDist(data, base * 17, 0.01, 0.20);
|
|
complexGaussianDist(data, base * 18, 0.01, 0.10);
|
|
complexGaussianDist(data, base * 19, 0.01, 0.5);
|
|
complexGaussianDist(data, base * 20, 0.01, 0.1);
|
|
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Flute", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_clarinet(SF2Soundbank sf2) {
|
|
int x = 8;
|
|
int fftsize = 4096 * x;
|
|
double[] data = new double[fftsize * 2];
|
|
double base = x * 15;
|
|
|
|
complexGaussianDist(data, base * 1, 0.001, 0.5);
|
|
complexGaussianDist(data, base * 2, 0.001, 0.02);
|
|
complexGaussianDist(data, base * 3, 0.001, 0.2);
|
|
complexGaussianDist(data, base * 4, 0.01, 0.1);
|
|
|
|
complexGaussianDist(data, base * 4, 100, 60);
|
|
complexGaussianDist(data, base * 6, 100, 20);
|
|
complexGaussianDist(data, base * 8, 100, 20);
|
|
|
|
complexGaussianDist(data, base * 5, 0.001, 0.1);
|
|
complexGaussianDist(data, base * 6, 0.001, 0.09);
|
|
complexGaussianDist(data, base * 7, 0.001, 0.02);
|
|
complexGaussianDist(data, base * 8, 0.005, 0.16);
|
|
complexGaussianDist(data, base * 9, 0.005, 0.96);
|
|
complexGaussianDist(data, base * 10, 0.01, 0.9);
|
|
complexGaussianDist(data, base * 11, 0.08, 1.2);
|
|
complexGaussianDist(data, base * 12, 0.08, 1.8);
|
|
complexGaussianDist(data, base * 13, 0.08, 1.6);
|
|
complexGaussianDist(data, base * 14, 0.08, 1.2);
|
|
complexGaussianDist(data, base * 15, 0.08, 0.9);
|
|
complexGaussianDist(data, base * 16, 0.08, 0.5);
|
|
complexGaussianDist(data, base * 17, 0.08, 0.2);
|
|
|
|
|
|
complexGaussianDist(data, base * 1, 10, 8);
|
|
complexGaussianDist(data, base * 2, 10, 8);
|
|
complexGaussianDist(data, base * 3, 10, 8);
|
|
complexGaussianDist(data, base * 4, 10, 8);
|
|
complexGaussianDist(data, base * 5, 10, 8);
|
|
complexGaussianDist(data, base * 6, 20, 9);
|
|
complexGaussianDist(data, base * 7, 20, 9);
|
|
complexGaussianDist(data, base * 8, 20, 9);
|
|
complexGaussianDist(data, base * 9, 20, 8);
|
|
complexGaussianDist(data, base * 10, 30, 8);
|
|
complexGaussianDist(data, base * 11, 30, 9);
|
|
complexGaussianDist(data, base * 12, 30, 9);
|
|
complexGaussianDist(data, base * 13, 30, 8);
|
|
complexGaussianDist(data, base * 14, 30, 8);
|
|
complexGaussianDist(data, base * 15, 30, 7);
|
|
complexGaussianDist(data, base * 16, 30, 7);
|
|
complexGaussianDist(data, base * 17, 30, 6);
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base);
|
|
SF2Layer layer = newLayer(sf2, "Clarinet", sample);
|
|
SF2Region region = layer.getRegions().get(0);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Layer new_timpani(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
double datah[];
|
|
|
|
// Make Bass Part
|
|
{
|
|
int fftlen = 4096 * 8;
|
|
double[] data = new double[2 * fftlen];
|
|
double base = 48;
|
|
complexGaussianDist(data, base * 2, 0.2, 1);
|
|
complexGaussianDist(data, base * 3, 0.2, 0.7);
|
|
complexGaussianDist(data, base * 5, 10, 1);
|
|
complexGaussianDist(data, base * 6, 9, 1);
|
|
complexGaussianDist(data, base * 8, 15, 1);
|
|
complexGaussianDist(data, base * 9, 18, 0.8);
|
|
complexGaussianDist(data, base * 11, 21, 0.5);
|
|
complexGaussianDist(data, base * 13, 28, 0.3);
|
|
complexGaussianDist(data, base * 14, 22, 0.1);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.5);
|
|
data = realPart(data);
|
|
|
|
double d_len = data.length;
|
|
for (int i = 0; i < data.length; i++) {
|
|
double g = (1.0 - (i / d_len));
|
|
data[i] *= g * g;
|
|
}
|
|
fadeUp(data, 40);
|
|
datab = data;
|
|
}
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2) {
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
}
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024 * 4; i < 2048 * 4; i++)
|
|
data[i] = 1.0 - (i - 4096) / 4096.0;
|
|
for (int i = 0; i < 300; i++) {
|
|
double g = (1.0 - (i / 300.0));
|
|
data[i] *= 1.0 + 20 * g * g;
|
|
}
|
|
for (int i = 0; i < 24; i++)
|
|
data[i] = 0;
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9998;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
for (int i = 0; i < datah.length; i++)
|
|
datab[i] += datah[i] * 0.02;
|
|
|
|
normalize(datab, 0.9);
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Timpani");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_melodic_toms(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
double datah[];
|
|
|
|
// Make Bass Part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
complexGaussianDist(data, 30, 0.5, 1);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.8);
|
|
data = realPart(data);
|
|
|
|
double d_len = data.length;
|
|
for (int i = 0; i < data.length; i++)
|
|
data[i] *= (1.0 - (i / d_len));
|
|
datab = data;
|
|
}
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024 * 4; i < 2048 * 4; i++)
|
|
data[i] = 1.0 - (i - 4096) / 4096.0;
|
|
for (int i = 0; i < 200; i++) {
|
|
double g = (1.0 - (i / 200.0));
|
|
data[i] *= 1.0 + 20 * g * g;
|
|
}
|
|
for (int i = 0; i < 30; i++)
|
|
data[i] = 0;
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9996;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
for (int i = 0; i < datah.length; i++)
|
|
datab[i] += datah[i] * 0.5;
|
|
for (int i = 0; i < 5; i++)
|
|
datab[i] *= i / 5.0;
|
|
|
|
normalize(datab, 0.99);
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Melodic Toms", datab);
|
|
sample.setOriginalPitch(63);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Melodic Toms");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) {
|
|
double datah[];
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5));
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 100; i++)
|
|
data[i] = 0;
|
|
|
|
for (int i = 0; i < 512 * 2; i++) {
|
|
double gain = (i / (512.0 * 2.0));
|
|
data[i] = 1 - gain;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal",
|
|
datah, 100, 20);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Reverse Cymbal");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200);
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_snare_drum(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
double datah[];
|
|
|
|
// Make Bass Part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
complexGaussianDist(data, 24, 0.5, 1);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.5);
|
|
data = realPart(data);
|
|
|
|
double d_len = data.length;
|
|
for (int i = 0; i < data.length; i++)
|
|
data[i] *= (1.0 - (i / d_len));
|
|
datab = data;
|
|
}
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024 * 4; i < 2048 * 4; i++)
|
|
data[i] = 1.0 - (i - 4096) / 4096.0;
|
|
for (int i = 0; i < 300; i++) {
|
|
double g = (1.0 - (i / 300.0));
|
|
data[i] *= 1.0 + 20 * g * g;
|
|
}
|
|
for (int i = 0; i < 24; i++)
|
|
data[i] = 0;
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9998;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
for (int i = 0; i < datah.length; i++)
|
|
datab[i] += datah[i];
|
|
for (int i = 0; i < 5; i++)
|
|
datab[i] *= i / 5.0;
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Snare Drum", datab);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Snare Drum");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_bass_drum(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
double datah[];
|
|
|
|
// Make Bass Part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
complexGaussianDist(data, 1.8 * 5 + 1, 2, 1);
|
|
complexGaussianDist(data, 1.8 * 9 + 1, 2, 1);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double d_len = data.length;
|
|
for (int i = 0; i < data.length; i++)
|
|
data[i] *= (1.0 - (i / d_len));
|
|
datab = data;
|
|
}
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024; i < 2048; i++)
|
|
data[i] = 1.0 - (i - 1024) / 1024.0;
|
|
for (int i = 0; i < 512; i++)
|
|
data[i] = 10 * i / 512.0;
|
|
for (int i = 0; i < 10; i++)
|
|
data[i] = 0;
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.999;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
for (int i = 0; i < datah.length; i++)
|
|
datab[i] += datah[i] * 0.5;
|
|
for (int i = 0; i < 5; i++)
|
|
datab[i] *= i / 5.0;
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Bass Drum", datab);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Bass Drum");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_tom(SF2Soundbank sf2) {
|
|
|
|
double datab[];
|
|
double datah[];
|
|
|
|
// Make Bass Part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
complexGaussianDist(data, 30, 0.5, 1);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.8);
|
|
data = realPart(data);
|
|
|
|
double d_len = data.length;
|
|
for (int i = 0; i < data.length; i++)
|
|
data[i] *= (1.0 - (i / d_len));
|
|
datab = data;
|
|
}
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024 * 4; i < 2048 * 4; i++)
|
|
data[i] = 1.0 - (i - 4096) / 4096.0;
|
|
for (int i = 0; i < 200; i++) {
|
|
double g = (1.0 - (i / 200.0));
|
|
data[i] *= 1.0 + 20 * g * g;
|
|
}
|
|
for (int i = 0; i < 30; i++)
|
|
data[i] = 0;
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9996;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
for (int i = 0; i < datah.length; i++)
|
|
datab[i] += datah[i] * 0.5;
|
|
for (int i = 0; i < 5; i++)
|
|
datab[i] *= i / 5.0;
|
|
|
|
normalize(datab, 0.99);
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Tom", datab);
|
|
sample.setOriginalPitch(50);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Tom");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
//region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_closed_hihat(SF2Soundbank sf2) {
|
|
double datah[];
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024 * 4; i < 2048 * 4; i++)
|
|
data[i] = 1.0 - (i - 4096) / 4096.0;
|
|
for (int i = 0; i < 2048; i++)
|
|
data[i] = 0.2 + 0.8 * (i / 2048.0);
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9996;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
for (int i = 0; i < 5; i++)
|
|
datah[i] *= i / 5.0;
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Closed Hi-Hat");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_open_hihat(SF2Soundbank sf2) {
|
|
double datah[];
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5));
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 200; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 2048 * 4; i++) {
|
|
double gain = (i / (2048.0 * 4.0));
|
|
data[i] = gain;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Open Hi-Hat");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) {
|
|
double datah[];
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5));
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 100; i++)
|
|
data[i] = 0;
|
|
for (int i = 0; i < 512 * 2; i++) {
|
|
double gain = (i / (512.0 * 2.0));
|
|
data[i] = gain;
|
|
}
|
|
datah = data;
|
|
}
|
|
|
|
SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Crash Cymbal");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800);
|
|
region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800);
|
|
region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
|
|
region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Layer new_side_stick(SF2Soundbank sf2) {
|
|
double datab[];
|
|
|
|
// Make treble part
|
|
{
|
|
int fftlen = 4096 * 4;
|
|
double[] data = new double[2 * fftlen];
|
|
Random random = new Random(3049912);
|
|
for (int i = 0; i < data.length; i += 2)
|
|
data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
|
|
fft(data);
|
|
// Remove all negative frequency
|
|
for (int i = fftlen / 2; i < data.length; i++)
|
|
data[i] = 0;
|
|
for (int i = 1024 * 4; i < 2048 * 4; i++)
|
|
data[i] = 1.0 - (i - 4096) / 4096.0;
|
|
for (int i = 0; i < 200; i++) {
|
|
double g = (1.0 - (i / 200.0));
|
|
data[i] *= 1.0 + 20 * g * g;
|
|
}
|
|
for (int i = 0; i < 30; i++)
|
|
data[i] = 0;
|
|
randomPhase(data, new Random(3049912));
|
|
ifft(data);
|
|
normalize(data, 0.9);
|
|
data = realPart(data);
|
|
double gain = 1.0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] *= gain;
|
|
gain *= 0.9996;
|
|
}
|
|
datab = data;
|
|
}
|
|
|
|
for (int i = 0; i < 10; i++)
|
|
datab[i] *= i / 10.0;
|
|
|
|
SF2Sample sample = newSimpleDrumSample(sf2, "Side Stick", datab);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName("Side Stick");
|
|
|
|
SF2GlobalRegion global = new SF2GlobalRegion();
|
|
layer.setGlobalZone(global);
|
|
sf2.addResource(layer);
|
|
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
|
|
region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
|
|
region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -50);
|
|
region.setSample(sample);
|
|
layer.getRegions().add(region);
|
|
|
|
return layer;
|
|
|
|
}
|
|
|
|
public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,
|
|
double[] data, double base) {
|
|
return newSimpleFFTSample(sf2, name, data, base, 10);
|
|
}
|
|
|
|
public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name,
|
|
double[] data, double base, int fadeuptime) {
|
|
|
|
int fftsize = data.length / 2;
|
|
AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
|
|
double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;
|
|
|
|
randomPhase(data);
|
|
ifft(data);
|
|
data = realPart(data);
|
|
normalize(data, 0.9);
|
|
float[] fdata = toFloat(data);
|
|
fdata = loopExtend(fdata, fdata.length + 512);
|
|
fadeUp(fdata, fadeuptime);
|
|
byte[] bdata = toBytes(fdata, format);
|
|
|
|
/*
|
|
* Create SoundFont2 sample.
|
|
*/
|
|
SF2Sample sample = new SF2Sample(sf2);
|
|
sample.setName(name);
|
|
sample.setData(bdata);
|
|
sample.setStartLoop(256);
|
|
sample.setEndLoop(fftsize + 256);
|
|
sample.setSampleRate((long) format.getSampleRate());
|
|
double orgnote = (69 + 12)
|
|
+ (12 * Math.log(basefreq / 440.0) / Math.log(2));
|
|
sample.setOriginalPitch((int) orgnote);
|
|
sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));
|
|
sf2.addResource(sample);
|
|
|
|
return sample;
|
|
}
|
|
|
|
public static SF2Sample newSimpleFFTSample_dist(SF2Soundbank sf2,
|
|
String name, double[] data, double base, double preamp) {
|
|
|
|
int fftsize = data.length / 2;
|
|
AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
|
|
double basefreq = (base / fftsize) * format.getSampleRate() * 0.5;
|
|
|
|
randomPhase(data);
|
|
ifft(data);
|
|
data = realPart(data);
|
|
|
|
for (int i = 0; i < data.length; i++) {
|
|
data[i] = (1 - Math.exp(-Math.abs(data[i] * preamp)))
|
|
* Math.signum(data[i]);
|
|
}
|
|
|
|
normalize(data, 0.9);
|
|
float[] fdata = toFloat(data);
|
|
fdata = loopExtend(fdata, fdata.length + 512);
|
|
fadeUp(fdata, 80);
|
|
byte[] bdata = toBytes(fdata, format);
|
|
|
|
/*
|
|
* Create SoundFont2 sample.
|
|
*/
|
|
SF2Sample sample = new SF2Sample(sf2);
|
|
sample.setName(name);
|
|
sample.setData(bdata);
|
|
sample.setStartLoop(256);
|
|
sample.setEndLoop(fftsize + 256);
|
|
sample.setSampleRate((long) format.getSampleRate());
|
|
double orgnote = (69 + 12)
|
|
+ (12 * Math.log(basefreq / 440.0) / Math.log(2));
|
|
sample.setOriginalPitch((int) orgnote);
|
|
sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0));
|
|
sf2.addResource(sample);
|
|
|
|
return sample;
|
|
}
|
|
|
|
public static SF2Sample newSimpleDrumSample(SF2Soundbank sf2, String name,
|
|
double[] data) {
|
|
|
|
int fftsize = data.length;
|
|
AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
|
|
|
|
byte[] bdata = toBytes(toFloat(realPart(data)), format);
|
|
|
|
/*
|
|
* Create SoundFont2 sample.
|
|
*/
|
|
SF2Sample sample = new SF2Sample(sf2);
|
|
sample.setName(name);
|
|
sample.setData(bdata);
|
|
sample.setStartLoop(256);
|
|
sample.setEndLoop(fftsize + 256);
|
|
sample.setSampleRate((long) format.getSampleRate());
|
|
sample.setOriginalPitch(60);
|
|
sf2.addResource(sample);
|
|
|
|
return sample;
|
|
}
|
|
|
|
public static SF2Layer newLayer(SF2Soundbank sf2, String name, SF2Sample sample) {
|
|
SF2LayerRegion region = new SF2LayerRegion();
|
|
region.setSample(sample);
|
|
|
|
SF2Layer layer = new SF2Layer(sf2);
|
|
layer.setName(name);
|
|
layer.getRegions().add(region);
|
|
sf2.addResource(layer);
|
|
|
|
return layer;
|
|
}
|
|
|
|
public static SF2Instrument newInstrument(SF2Soundbank sf2, String name,
|
|
Patch patch, SF2Layer... layers) {
|
|
|
|
/*
|
|
* Create SoundFont2 instrument.
|
|
*/
|
|
SF2Instrument ins = new SF2Instrument(sf2);
|
|
ins.setPatch(patch);
|
|
ins.setName(name);
|
|
sf2.addInstrument(ins);
|
|
|
|
/*
|
|
* Create region for instrument.
|
|
*/
|
|
for (int i = 0; i < layers.length; i++) {
|
|
SF2InstrumentRegion insregion = new SF2InstrumentRegion();
|
|
insregion.setLayer(layers[i]);
|
|
ins.getRegions().add(insregion);
|
|
}
|
|
|
|
return ins;
|
|
}
|
|
|
|
static public void ifft(double[] data) {
|
|
new FFT(data.length / 2, 1).transform(data);
|
|
}
|
|
|
|
static public void fft(double[] data) {
|
|
new FFT(data.length / 2, -1).transform(data);
|
|
}
|
|
|
|
public static void complexGaussianDist(double[] cdata, double m,
|
|
double s, double v) {
|
|
for (int x = 0; x < cdata.length / 4; x++) {
|
|
cdata[x * 2] += v * (1.0 / (s * Math.sqrt(2 * Math.PI))
|
|
* Math.exp((-1.0 / 2.0) * Math.pow((x - m) / s, 2.0)));
|
|
}
|
|
}
|
|
|
|
static public void randomPhase(double[] data) {
|
|
for (int i = 0; i < data.length; i += 2) {
|
|
double phase = Math.random() * 2 * Math.PI;
|
|
double d = data[i];
|
|
data[i] = Math.sin(phase) * d;
|
|
data[i + 1] = Math.cos(phase) * d;
|
|
}
|
|
}
|
|
|
|
static public void randomPhase(double[] data, Random random) {
|
|
for (int i = 0; i < data.length; i += 2) {
|
|
double phase = random.nextDouble() * 2 * Math.PI;
|
|
double d = data[i];
|
|
data[i] = Math.sin(phase) * d;
|
|
data[i + 1] = Math.cos(phase) * d;
|
|
}
|
|
}
|
|
|
|
static public void normalize(double[] data, double target) {
|
|
double maxvalue = 0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
if (data[i] > maxvalue)
|
|
maxvalue = data[i];
|
|
if (-data[i] > maxvalue)
|
|
maxvalue = -data[i];
|
|
}
|
|
if (maxvalue == 0)
|
|
return;
|
|
double gain = target / maxvalue;
|
|
for (int i = 0; i < data.length; i++)
|
|
data[i] *= gain;
|
|
}
|
|
|
|
static public void normalize(float[] data, double target) {
|
|
double maxvalue = 0.5;
|
|
for (int i = 0; i < data.length; i++) {
|
|
if (data[i * 2] > maxvalue)
|
|
maxvalue = data[i * 2];
|
|
if (-data[i * 2] > maxvalue)
|
|
maxvalue = -data[i * 2];
|
|
}
|
|
double gain = target / maxvalue;
|
|
for (int i = 0; i < data.length; i++)
|
|
data[i * 2] *= gain;
|
|
}
|
|
|
|
static public double[] realPart(double[] in) {
|
|
double[] out = new double[in.length / 2];
|
|
for (int i = 0; i < out.length; i++) {
|
|
out[i] = in[i * 2];
|
|
}
|
|
return out;
|
|
}
|
|
|
|
static public double[] imgPart(double[] in) {
|
|
double[] out = new double[in.length / 2];
|
|
for (int i = 0; i < out.length; i++) {
|
|
out[i] = in[i * 2];
|
|
}
|
|
return out;
|
|
}
|
|
|
|
static public float[] toFloat(double[] in) {
|
|
float[] out = new float[in.length];
|
|
for (int i = 0; i < out.length; i++) {
|
|
out[i] = (float) in[i];
|
|
}
|
|
return out;
|
|
}
|
|
|
|
static public byte[] toBytes(float[] in, AudioFormat format) {
|
|
byte[] out = new byte[in.length * format.getFrameSize()];
|
|
return AudioFloatConverter.getConverter(format).toByteArray(in, out);
|
|
}
|
|
|
|
static public void fadeUp(double[] data, int samples) {
|
|
double dsamples = samples;
|
|
for (int i = 0; i < samples; i++)
|
|
data[i] *= i / dsamples;
|
|
}
|
|
|
|
static public void fadeUp(float[] data, int samples) {
|
|
double dsamples = samples;
|
|
for (int i = 0; i < samples; i++)
|
|
data[i] *= i / dsamples;
|
|
}
|
|
|
|
static public double[] loopExtend(double[] data, int newsize) {
|
|
double[] outdata = new double[newsize];
|
|
int p_len = data.length;
|
|
int p_ps = 0;
|
|
for (int i = 0; i < outdata.length; i++) {
|
|
outdata[i] = data[p_ps];
|
|
p_ps++;
|
|
if (p_ps == p_len)
|
|
p_ps = 0;
|
|
}
|
|
return outdata;
|
|
}
|
|
|
|
static public float[] loopExtend(float[] data, int newsize) {
|
|
float[] outdata = new float[newsize];
|
|
int p_len = data.length;
|
|
int p_ps = 0;
|
|
for (int i = 0; i < outdata.length; i++) {
|
|
outdata[i] = data[p_ps];
|
|
p_ps++;
|
|
if (p_ps == p_len)
|
|
p_ps = 0;
|
|
}
|
|
return outdata;
|
|
}
|
|
}
|