2695 lines · 98.1 KB · Java
RawDownload
/* * Copyright (c) 2007, 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 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);

Lines 1–500 of 2695.