|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
package com.sun.media.sound; |
|
|
|
import java.util.Random; |
|
|
|
import javax.sound.midi.Patch; |
|
import javax.sound.sampled.AudioFormat; |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
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; |
|
|
|
|
|
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_INITIALFILTERFC, 8000); |
|
|
|
return layer; |
|
} |
|
|
|
public static SF2Layer new_guitar_pick(SF2Soundbank sf2) { |
|
|
|
double datab[]; |
|
|
|
|
|
{ |
|
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); |
|
|
|
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) { |
|
|
|
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[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 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) { |
|
|
|
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[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 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[]; |
|
|
|
|
|
{ |
|
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); |
|
|
|
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) { |
|
|
|
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 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; |
|
} |
|
|
|
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[]; |
|
|
|
|
|
{ |
|
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; |
|
} |
|
|
|
|
|
{ |
|
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); |
|
|
|
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[]; |
|
|
|
|
|
{ |
|
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; |
|
} |
|
|
|
|
|
{ |
|
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); |
|
|
|
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_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[]; |
|
|
|
|
|
{ |
|
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; |
|
} |
|
|
|
|
|
{ |
|
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); |
|
|
|
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[]; |
|
|
|
|
|
{ |
|
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; |
|
} |
|
|
|
|
|
{ |
|
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); |
|
|
|
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[]; |
|
|
|
|
|
{ |
|
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; |
|
} |
|
|
|
|
|
{ |
|
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); |
|
|
|
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_INITIALATTENUATION, -100); |
|
region.setSample(sample); |
|
layer.getRegions().add(region); |
|
|
|
return layer; |
|
} |
|
|
|
public static SF2Layer new_closed_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)) * 0.1; |
|
fft(data); |
|
|
|
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[]; |
|
|
|
|
|
{ |
|
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); |
|
|
|
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); |
|
|
|
|
|
|
|
*/ |
|
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); |
|
|
|
|
|
|
|
*/ |
|
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); |
|
|
|
|
|
|
|
*/ |
|
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) { |
|
|
|
|
|
|
|
*/ |
|
SF2Instrument ins = new SF2Instrument(sf2); |
|
ins.setPatch(patch); |
|
ins.setName(name); |
|
sf2.addInstrument(ins); |
|
|
|
|
|
|
|
*/ |
|
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; |
|
} |
|
} |