| /* |
| * 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; |
| } |
| } |