1 /*
2 * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
618
619
620 SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample);
621 SF2Region region = layer.getRegions().get(0);
622 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
623 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
624 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
625 //region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);
626 //region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200);
627
628 //region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);
629 //region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
630 //region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000);
631 region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);
632 //region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);
633 return layer;
634 }
635
636 public static SF2Layer new_guitar_pick(SF2Soundbank sf2) {
637
638 double datab[];
639
640 // Make treble part
641 {
642 int m = 2;
643 int fftlen = 4096 * m;
644 double[] data = new double[2 * fftlen];
645 Random random = new Random(3049912);
646 for (int i = 0; i < data.length; i += 2)
647 data[i] = (2.0 * (random.nextDouble() - 0.5));
648 fft(data);
649 // Remove all negative frequency
650 for (int i = fftlen / 2; i < data.length; i++)
651 data[i] = 0;
652 for (int i = 0; i < 2048 * m; i++) {
653 data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2)
654 + Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9);
655 }
656 randomPhase(data, new Random(3049912));
657 ifft(data);
658 normalize(data, 0.8);
797 complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
798 }
799
800 SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);
801 SF2Layer layer = newLayer(sf2, "Grand Piano", sample);
802 SF2Region region = layer.getRegions().get(0);
803 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
804 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);
805 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
806 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
807 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
808 region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
809 region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
810 region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
811 region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);
812 return layer;
813 }
814
815 public static SF2Layer new_piano_hammer(SF2Soundbank sf2) {
816
817 double datab[];
818
819 // Make treble part
820 {
821 int m = 2;
822 int fftlen = 4096 * m;
823 double[] data = new double[2 * fftlen];
824 Random random = new Random(3049912);
825 for (int i = 0; i < data.length; i += 2)
826 data[i] = (2.0 * (random.nextDouble() - 0.5));
827 fft(data);
828 // Remove all negative frequency
829 for (int i = fftlen / 2; i < data.length; i++)
830 data[i] = 0;
831 for (int i = 0; i < 2048 * m; i++)
832 data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05);
833 randomPhase(data, new Random(3049912));
834 ifft(data);
835 normalize(data, 0.6);
836 data = realPart(data);
837 double gain = 1.0;
1786 complexGaussianDist(data, base * 14, 30, 8);
1787 complexGaussianDist(data, base * 15, 30, 7);
1788 complexGaussianDist(data, base * 16, 30, 7);
1789 complexGaussianDist(data, base * 17, 30, 6);
1790
1791 SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base);
1792 SF2Layer layer = newLayer(sf2, "Clarinet", sample);
1793 SF2Region region = layer.getRegions().get(0);
1794 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1795 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1796 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1797 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1798 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1799 region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1800 return layer;
1801
1802 }
1803
1804 public static SF2Layer new_timpani(SF2Soundbank sf2) {
1805
1806 double datab[];
1807 double datah[];
1808
1809 // Make Bass Part
1810 {
1811 int fftlen = 4096 * 8;
1812 double[] data = new double[2 * fftlen];
1813 double base = 48;
1814 complexGaussianDist(data, base * 2, 0.2, 1);
1815 complexGaussianDist(data, base * 3, 0.2, 0.7);
1816 complexGaussianDist(data, base * 5, 10, 1);
1817 complexGaussianDist(data, base * 6, 9, 1);
1818 complexGaussianDist(data, base * 8, 15, 1);
1819 complexGaussianDist(data, base * 9, 18, 0.8);
1820 complexGaussianDist(data, base * 11, 21, 0.5);
1821 complexGaussianDist(data, base * 13, 28, 0.3);
1822 complexGaussianDist(data, base * 14, 22, 0.1);
1823 randomPhase(data, new Random(3049912));
1824 ifft(data);
1825 normalize(data, 0.5);
1826 data = realPart(data);
1827
1874 SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab);
1875
1876 SF2Layer layer = new SF2Layer(sf2);
1877 layer.setName("Timpani");
1878
1879 SF2GlobalRegion global = new SF2GlobalRegion();
1880 layer.setGlobalZone(global);
1881 sf2.addResource(layer);
1882
1883 SF2LayerRegion region = new SF2LayerRegion();
1884 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
1885 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1886 region.setSample(sample);
1887 layer.getRegions().add(region);
1888
1889 return layer;
1890 }
1891
1892 public static SF2Layer new_melodic_toms(SF2Soundbank sf2) {
1893
1894 double datab[];
1895 double datah[];
1896
1897 // Make Bass Part
1898 {
1899 int fftlen = 4096 * 4;
1900 double[] data = new double[2 * fftlen];
1901 complexGaussianDist(data, 30, 0.5, 1);
1902 randomPhase(data, new Random(3049912));
1903 ifft(data);
1904 normalize(data, 0.8);
1905 data = realPart(data);
1906
1907 double d_len = data.length;
1908 for (int i = 0; i < data.length; i++)
1909 data[i] *= (1.0 - (i / d_len));
1910 datab = data;
1911 }
1912
1913 // Make treble part
1914 {
1915 int fftlen = 4096 * 4;
1952 sample.setOriginalPitch(63);
1953
1954 SF2Layer layer = new SF2Layer(sf2);
1955 layer.setName("Melodic Toms");
1956
1957 SF2GlobalRegion global = new SF2GlobalRegion();
1958 layer.setGlobalZone(global);
1959 sf2.addResource(layer);
1960
1961 SF2LayerRegion region = new SF2LayerRegion();
1962 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
1963 //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
1964 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1965 region.setSample(sample);
1966 layer.getRegions().add(region);
1967
1968 return layer;
1969 }
1970
1971 public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) {
1972 double datah[];
1973 {
1974 int fftlen = 4096 * 4;
1975 double[] data = new double[2 * fftlen];
1976 Random random = new Random(3049912);
1977 for (int i = 0; i < data.length; i += 2)
1978 data[i] = (2.0 * (random.nextDouble() - 0.5));
1979 for (int i = fftlen / 2; i < data.length; i++)
1980 data[i] = 0;
1981 for (int i = 0; i < 100; i++)
1982 data[i] = 0;
1983
1984 for (int i = 0; i < 512 * 2; i++) {
1985 double gain = (i / (512.0 * 2.0));
1986 data[i] = 1 - gain;
1987 }
1988 datah = data;
1989 }
1990
1991 SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal",
1992 datah, 100, 20);
1995 layer.setName("Reverse Cymbal");
1996
1997 SF2GlobalRegion global = new SF2GlobalRegion();
1998 layer.setGlobalZone(global);
1999 sf2.addResource(layer);
2000
2001 SF2LayerRegion region = new SF2LayerRegion();
2002 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200);
2003 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000);
2004 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2005 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
2006 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2007 region.setSample(sample);
2008 layer.getRegions().add(region);
2009
2010 return layer;
2011 }
2012
2013 public static SF2Layer new_snare_drum(SF2Soundbank sf2) {
2014
2015 double datab[];
2016 double datah[];
2017
2018 // Make Bass Part
2019 {
2020 int fftlen = 4096 * 4;
2021 double[] data = new double[2 * fftlen];
2022 complexGaussianDist(data, 24, 0.5, 1);
2023 randomPhase(data, new Random(3049912));
2024 ifft(data);
2025 normalize(data, 0.5);
2026 data = realPart(data);
2027
2028 double d_len = data.length;
2029 for (int i = 0; i < data.length; i++)
2030 data[i] *= (1.0 - (i / d_len));
2031 datab = data;
2032 }
2033
2034 // Make treble part
2035 {
2036 int fftlen = 4096 * 4;
2071
2072 SF2Layer layer = new SF2Layer(sf2);
2073 layer.setName("Snare Drum");
2074
2075 SF2GlobalRegion global = new SF2GlobalRegion();
2076 layer.setGlobalZone(global);
2077 sf2.addResource(layer);
2078
2079 SF2LayerRegion region = new SF2LayerRegion();
2080 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2081 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2082 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2083 region.setSample(sample);
2084 layer.getRegions().add(region);
2085
2086 return layer;
2087 }
2088
2089 public static SF2Layer new_bass_drum(SF2Soundbank sf2) {
2090
2091 double datab[];
2092 double datah[];
2093
2094 // Make Bass Part
2095 {
2096 int fftlen = 4096 * 4;
2097 double[] data = new double[2 * fftlen];
2098 complexGaussianDist(data, 1.8 * 5 + 1, 2, 1);
2099 complexGaussianDist(data, 1.8 * 9 + 1, 2, 1);
2100 randomPhase(data, new Random(3049912));
2101 ifft(data);
2102 normalize(data, 0.9);
2103 data = realPart(data);
2104 double d_len = data.length;
2105 for (int i = 0; i < data.length; i++)
2106 data[i] *= (1.0 - (i / d_len));
2107 datab = data;
2108 }
2109
2110 // Make treble part
2111 {
2112 int fftlen = 4096;
2145
2146 SF2Layer layer = new SF2Layer(sf2);
2147 layer.setName("Bass Drum");
2148
2149 SF2GlobalRegion global = new SF2GlobalRegion();
2150 layer.setGlobalZone(global);
2151 sf2.addResource(layer);
2152
2153 SF2LayerRegion region = new SF2LayerRegion();
2154 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2155 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2156 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2157 region.setSample(sample);
2158 layer.getRegions().add(region);
2159
2160 return layer;
2161 }
2162
2163 public static SF2Layer new_tom(SF2Soundbank sf2) {
2164
2165 double datab[];
2166 double datah[];
2167
2168 // Make Bass Part
2169 {
2170 int fftlen = 4096 * 4;
2171 double[] data = new double[2 * fftlen];
2172 complexGaussianDist(data, 30, 0.5, 1);
2173 randomPhase(data, new Random(3049912));
2174 ifft(data);
2175 normalize(data, 0.8);
2176 data = realPart(data);
2177
2178 double d_len = data.length;
2179 for (int i = 0; i < data.length; i++)
2180 data[i] *= (1.0 - (i / d_len));
2181 datab = data;
2182 }
2183
2184 // Make treble part
2185 {
2186 int fftlen = 4096 * 4;
2223 sample.setOriginalPitch(50);
2224
2225 SF2Layer layer = new SF2Layer(sf2);
2226 layer.setName("Tom");
2227
2228 SF2GlobalRegion global = new SF2GlobalRegion();
2229 layer.setGlobalZone(global);
2230 sf2.addResource(layer);
2231
2232 SF2LayerRegion region = new SF2LayerRegion();
2233 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2234 //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2235 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2236 region.setSample(sample);
2237 layer.getRegions().add(region);
2238
2239 return layer;
2240 }
2241
2242 public static SF2Layer new_closed_hihat(SF2Soundbank sf2) {
2243 double datah[];
2244
2245 // Make treble part
2246 {
2247 int fftlen = 4096 * 4;
2248 double[] data = new double[2 * fftlen];
2249 Random random = new Random(3049912);
2250 for (int i = 0; i < data.length; i += 2)
2251 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2252 fft(data);
2253 // Remove all negative frequency
2254 for (int i = fftlen / 2; i < data.length; i++)
2255 data[i] = 0;
2256 for (int i = 1024 * 4; i < 2048 * 4; i++)
2257 data[i] = 1.0 - (i - 4096) / 4096.0;
2258 for (int i = 0; i < 2048; i++)
2259 data[i] = 0.2 + 0.8 * (i / 2048.0);
2260 randomPhase(data, new Random(3049912));
2261 ifft(data);
2262 normalize(data, 0.9);
2263 data = realPart(data);
2274 SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah);
2275
2276 SF2Layer layer = new SF2Layer(sf2);
2277 layer.setName("Closed Hi-Hat");
2278
2279 SF2GlobalRegion global = new SF2GlobalRegion();
2280 layer.setGlobalZone(global);
2281 sf2.addResource(layer);
2282
2283 SF2LayerRegion region = new SF2LayerRegion();
2284 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2285 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2286 region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
2287 region.setSample(sample);
2288 layer.getRegions().add(region);
2289
2290 return layer;
2291 }
2292
2293 public static SF2Layer new_open_hihat(SF2Soundbank sf2) {
2294 double datah[];
2295 {
2296 int fftlen = 4096 * 4;
2297 double[] data = new double[2 * fftlen];
2298 Random random = new Random(3049912);
2299 for (int i = 0; i < data.length; i += 2)
2300 data[i] = (2.0 * (random.nextDouble() - 0.5));
2301 for (int i = fftlen / 2; i < data.length; i++)
2302 data[i] = 0;
2303 for (int i = 0; i < 200; i++)
2304 data[i] = 0;
2305 for (int i = 0; i < 2048 * 4; i++) {
2306 double gain = (i / (2048.0 * 4.0));
2307 data[i] = gain;
2308 }
2309 datah = data;
2310 }
2311
2312 SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5);
2313
2314 SF2Layer layer = new SF2Layer(sf2);
2315 layer.setName("Open Hi-Hat");
2316
2317 SF2GlobalRegion global = new SF2GlobalRegion();
2318 layer.setGlobalZone(global);
2319 sf2.addResource(layer);
2320
2321 SF2LayerRegion region = new SF2LayerRegion();
2322 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500);
2323 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2324 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500);
2325 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2326 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2327 region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
2328 region.setSample(sample);
2329 layer.getRegions().add(region);
2330
2331 return layer;
2332 }
2333
2334 public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) {
2335 double datah[];
2336 {
2337 int fftlen = 4096 * 4;
2338 double[] data = new double[2 * fftlen];
2339 Random random = new Random(3049912);
2340 for (int i = 0; i < data.length; i += 2)
2341 data[i] = (2.0 * (random.nextDouble() - 0.5));
2342 for (int i = fftlen / 2; i < data.length; i++)
2343 data[i] = 0;
2344 for (int i = 0; i < 100; i++)
2345 data[i] = 0;
2346 for (int i = 0; i < 512 * 2; i++) {
2347 double gain = (i / (512.0 * 2.0));
2348 data[i] = gain;
2349 }
2350 datah = data;
2351 }
2352
2353 SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5);
2354
2355 SF2Layer layer = new SF2Layer(sf2);
2356 layer.setName("Crash Cymbal");
2357
2358 SF2GlobalRegion global = new SF2GlobalRegion();
2359 layer.setGlobalZone(global);
2360 sf2.addResource(layer);
2361
2362 SF2LayerRegion region = new SF2LayerRegion();
2363 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800);
2364 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2365 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800);
2366 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2367 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2368 region.setSample(sample);
2369 layer.getRegions().add(region);
2370
2371 return layer;
2372 }
2373
2374 public static SF2Layer new_side_stick(SF2Soundbank sf2) {
2375 double datab[];
2376
2377 // Make treble part
2378 {
2379 int fftlen = 4096 * 4;
2380 double[] data = new double[2 * fftlen];
2381 Random random = new Random(3049912);
2382 for (int i = 0; i < data.length; i += 2)
2383 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2384 fft(data);
2385 // Remove all negative frequency
2386 for (int i = fftlen / 2; i < data.length; i++)
2387 data[i] = 0;
2388 for (int i = 1024 * 4; i < 2048 * 4; i++)
2389 data[i] = 1.0 - (i - 4096) / 4096.0;
2390 for (int i = 0; i < 200; i++) {
2391 double g = (1.0 - (i / 200.0));
2392 data[i] *= 1.0 + 20 * g * g;
2393 }
2394 for (int i = 0; i < 30; i++)
2395 data[i] = 0;
|
1 /*
2 * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
618
619
620 SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample);
621 SF2Region region = layer.getRegions().get(0);
622 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
623 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000);
624 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
625 //region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400);
626 //region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200);
627
628 //region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100);
629 //region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
630 //region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000);
631 region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000);
632 //region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20);
633 return layer;
634 }
635
636 public static SF2Layer new_guitar_pick(SF2Soundbank sf2) {
637
638 double[] datab;
639
640 // Make treble part
641 {
642 int m = 2;
643 int fftlen = 4096 * m;
644 double[] data = new double[2 * fftlen];
645 Random random = new Random(3049912);
646 for (int i = 0; i < data.length; i += 2)
647 data[i] = (2.0 * (random.nextDouble() - 0.5));
648 fft(data);
649 // Remove all negative frequency
650 for (int i = fftlen / 2; i < data.length; i++)
651 data[i] = 0;
652 for (int i = 0; i < 2048 * m; i++) {
653 data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2)
654 + Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9);
655 }
656 randomPhase(data, new Random(3049912));
657 ifft(data);
658 normalize(data, 0.8);
797 complexGaussianDist(data, base * (i + 1) + adjust, w, ai);
798 }
799
800 SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200);
801 SF2Layer layer = newLayer(sf2, "Grand Piano", sample);
802 SF2Region region = layer.getRegions().get(0);
803 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
804 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000);
805 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0);
806 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
807 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
808 region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000);
809 region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000);
810 region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500);
811 region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000);
812 return layer;
813 }
814
815 public static SF2Layer new_piano_hammer(SF2Soundbank sf2) {
816
817 double[] datab;
818
819 // Make treble part
820 {
821 int m = 2;
822 int fftlen = 4096 * m;
823 double[] data = new double[2 * fftlen];
824 Random random = new Random(3049912);
825 for (int i = 0; i < data.length; i += 2)
826 data[i] = (2.0 * (random.nextDouble() - 0.5));
827 fft(data);
828 // Remove all negative frequency
829 for (int i = fftlen / 2; i < data.length; i++)
830 data[i] = 0;
831 for (int i = 0; i < 2048 * m; i++)
832 data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05);
833 randomPhase(data, new Random(3049912));
834 ifft(data);
835 normalize(data, 0.6);
836 data = realPart(data);
837 double gain = 1.0;
1786 complexGaussianDist(data, base * 14, 30, 8);
1787 complexGaussianDist(data, base * 15, 30, 7);
1788 complexGaussianDist(data, base * 16, 30, 7);
1789 complexGaussianDist(data, base * 17, 30, 6);
1790
1791 SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base);
1792 SF2Layer layer = newLayer(sf2, "Clarinet", sample);
1793 SF2Region region = layer.getRegions().get(0);
1794 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
1795 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000);
1796 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
1797 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000);
1798 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100);
1799 region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500);
1800 return layer;
1801
1802 }
1803
1804 public static SF2Layer new_timpani(SF2Soundbank sf2) {
1805
1806 double[] datab;
1807 double[] datah;
1808
1809 // Make Bass Part
1810 {
1811 int fftlen = 4096 * 8;
1812 double[] data = new double[2 * fftlen];
1813 double base = 48;
1814 complexGaussianDist(data, base * 2, 0.2, 1);
1815 complexGaussianDist(data, base * 3, 0.2, 0.7);
1816 complexGaussianDist(data, base * 5, 10, 1);
1817 complexGaussianDist(data, base * 6, 9, 1);
1818 complexGaussianDist(data, base * 8, 15, 1);
1819 complexGaussianDist(data, base * 9, 18, 0.8);
1820 complexGaussianDist(data, base * 11, 21, 0.5);
1821 complexGaussianDist(data, base * 13, 28, 0.3);
1822 complexGaussianDist(data, base * 14, 22, 0.1);
1823 randomPhase(data, new Random(3049912));
1824 ifft(data);
1825 normalize(data, 0.5);
1826 data = realPart(data);
1827
1874 SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab);
1875
1876 SF2Layer layer = new SF2Layer(sf2);
1877 layer.setName("Timpani");
1878
1879 SF2GlobalRegion global = new SF2GlobalRegion();
1880 layer.setGlobalZone(global);
1881 sf2.addResource(layer);
1882
1883 SF2LayerRegion region = new SF2LayerRegion();
1884 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
1885 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1886 region.setSample(sample);
1887 layer.getRegions().add(region);
1888
1889 return layer;
1890 }
1891
1892 public static SF2Layer new_melodic_toms(SF2Soundbank sf2) {
1893
1894 double[] datab;
1895 double[] datah;
1896
1897 // Make Bass Part
1898 {
1899 int fftlen = 4096 * 4;
1900 double[] data = new double[2 * fftlen];
1901 complexGaussianDist(data, 30, 0.5, 1);
1902 randomPhase(data, new Random(3049912));
1903 ifft(data);
1904 normalize(data, 0.8);
1905 data = realPart(data);
1906
1907 double d_len = data.length;
1908 for (int i = 0; i < data.length; i++)
1909 data[i] *= (1.0 - (i / d_len));
1910 datab = data;
1911 }
1912
1913 // Make treble part
1914 {
1915 int fftlen = 4096 * 4;
1952 sample.setOriginalPitch(63);
1953
1954 SF2Layer layer = new SF2Layer(sf2);
1955 layer.setName("Melodic Toms");
1956
1957 SF2GlobalRegion global = new SF2GlobalRegion();
1958 layer.setGlobalZone(global);
1959 sf2.addResource(layer);
1960
1961 SF2LayerRegion region = new SF2LayerRegion();
1962 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
1963 //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
1964 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
1965 region.setSample(sample);
1966 layer.getRegions().add(region);
1967
1968 return layer;
1969 }
1970
1971 public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) {
1972 double[] datah;
1973 {
1974 int fftlen = 4096 * 4;
1975 double[] data = new double[2 * fftlen];
1976 Random random = new Random(3049912);
1977 for (int i = 0; i < data.length; i += 2)
1978 data[i] = (2.0 * (random.nextDouble() - 0.5));
1979 for (int i = fftlen / 2; i < data.length; i++)
1980 data[i] = 0;
1981 for (int i = 0; i < 100; i++)
1982 data[i] = 0;
1983
1984 for (int i = 0; i < 512 * 2; i++) {
1985 double gain = (i / (512.0 * 2.0));
1986 data[i] = 1 - gain;
1987 }
1988 datah = data;
1989 }
1990
1991 SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal",
1992 datah, 100, 20);
1995 layer.setName("Reverse Cymbal");
1996
1997 SF2GlobalRegion global = new SF2GlobalRegion();
1998 layer.setGlobalZone(global);
1999 sf2.addResource(layer);
2000
2001 SF2LayerRegion region = new SF2LayerRegion();
2002 region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200);
2003 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000);
2004 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2005 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000);
2006 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2007 region.setSample(sample);
2008 layer.getRegions().add(region);
2009
2010 return layer;
2011 }
2012
2013 public static SF2Layer new_snare_drum(SF2Soundbank sf2) {
2014
2015 double[] datab;
2016 double[] datah;
2017
2018 // Make Bass Part
2019 {
2020 int fftlen = 4096 * 4;
2021 double[] data = new double[2 * fftlen];
2022 complexGaussianDist(data, 24, 0.5, 1);
2023 randomPhase(data, new Random(3049912));
2024 ifft(data);
2025 normalize(data, 0.5);
2026 data = realPart(data);
2027
2028 double d_len = data.length;
2029 for (int i = 0; i < data.length; i++)
2030 data[i] *= (1.0 - (i / d_len));
2031 datab = data;
2032 }
2033
2034 // Make treble part
2035 {
2036 int fftlen = 4096 * 4;
2071
2072 SF2Layer layer = new SF2Layer(sf2);
2073 layer.setName("Snare Drum");
2074
2075 SF2GlobalRegion global = new SF2GlobalRegion();
2076 layer.setGlobalZone(global);
2077 sf2.addResource(layer);
2078
2079 SF2LayerRegion region = new SF2LayerRegion();
2080 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2081 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2082 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2083 region.setSample(sample);
2084 layer.getRegions().add(region);
2085
2086 return layer;
2087 }
2088
2089 public static SF2Layer new_bass_drum(SF2Soundbank sf2) {
2090
2091 double[] datab;
2092 double[] datah;
2093
2094 // Make Bass Part
2095 {
2096 int fftlen = 4096 * 4;
2097 double[] data = new double[2 * fftlen];
2098 complexGaussianDist(data, 1.8 * 5 + 1, 2, 1);
2099 complexGaussianDist(data, 1.8 * 9 + 1, 2, 1);
2100 randomPhase(data, new Random(3049912));
2101 ifft(data);
2102 normalize(data, 0.9);
2103 data = realPart(data);
2104 double d_len = data.length;
2105 for (int i = 0; i < data.length; i++)
2106 data[i] *= (1.0 - (i / d_len));
2107 datab = data;
2108 }
2109
2110 // Make treble part
2111 {
2112 int fftlen = 4096;
2145
2146 SF2Layer layer = new SF2Layer(sf2);
2147 layer.setName("Bass Drum");
2148
2149 SF2GlobalRegion global = new SF2GlobalRegion();
2150 layer.setGlobalZone(global);
2151 sf2.addResource(layer);
2152
2153 SF2LayerRegion region = new SF2LayerRegion();
2154 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2155 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2156 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2157 region.setSample(sample);
2158 layer.getRegions().add(region);
2159
2160 return layer;
2161 }
2162
2163 public static SF2Layer new_tom(SF2Soundbank sf2) {
2164
2165 double[] datab;
2166 double[] datah;
2167
2168 // Make Bass Part
2169 {
2170 int fftlen = 4096 * 4;
2171 double[] data = new double[2 * fftlen];
2172 complexGaussianDist(data, 30, 0.5, 1);
2173 randomPhase(data, new Random(3049912));
2174 ifft(data);
2175 normalize(data, 0.8);
2176 data = realPart(data);
2177
2178 double d_len = data.length;
2179 for (int i = 0; i < data.length; i++)
2180 data[i] *= (1.0 - (i / d_len));
2181 datab = data;
2182 }
2183
2184 // Make treble part
2185 {
2186 int fftlen = 4096 * 4;
2223 sample.setOriginalPitch(50);
2224
2225 SF2Layer layer = new SF2Layer(sf2);
2226 layer.setName("Tom");
2227
2228 SF2GlobalRegion global = new SF2GlobalRegion();
2229 layer.setGlobalZone(global);
2230 sf2.addResource(layer);
2231
2232 SF2LayerRegion region = new SF2LayerRegion();
2233 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2234 //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2235 region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100);
2236 region.setSample(sample);
2237 layer.getRegions().add(region);
2238
2239 return layer;
2240 }
2241
2242 public static SF2Layer new_closed_hihat(SF2Soundbank sf2) {
2243 double[] datah;
2244
2245 // Make treble part
2246 {
2247 int fftlen = 4096 * 4;
2248 double[] data = new double[2 * fftlen];
2249 Random random = new Random(3049912);
2250 for (int i = 0; i < data.length; i += 2)
2251 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2252 fft(data);
2253 // Remove all negative frequency
2254 for (int i = fftlen / 2; i < data.length; i++)
2255 data[i] = 0;
2256 for (int i = 1024 * 4; i < 2048 * 4; i++)
2257 data[i] = 1.0 - (i - 4096) / 4096.0;
2258 for (int i = 0; i < 2048; i++)
2259 data[i] = 0.2 + 0.8 * (i / 2048.0);
2260 randomPhase(data, new Random(3049912));
2261 ifft(data);
2262 normalize(data, 0.9);
2263 data = realPart(data);
2274 SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah);
2275
2276 SF2Layer layer = new SF2Layer(sf2);
2277 layer.setName("Closed Hi-Hat");
2278
2279 SF2GlobalRegion global = new SF2GlobalRegion();
2280 layer.setGlobalZone(global);
2281 sf2.addResource(layer);
2282
2283 SF2LayerRegion region = new SF2LayerRegion();
2284 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000);
2285 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2286 region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
2287 region.setSample(sample);
2288 layer.getRegions().add(region);
2289
2290 return layer;
2291 }
2292
2293 public static SF2Layer new_open_hihat(SF2Soundbank sf2) {
2294 double[] datah;
2295 {
2296 int fftlen = 4096 * 4;
2297 double[] data = new double[2 * fftlen];
2298 Random random = new Random(3049912);
2299 for (int i = 0; i < data.length; i += 2)
2300 data[i] = (2.0 * (random.nextDouble() - 0.5));
2301 for (int i = fftlen / 2; i < data.length; i++)
2302 data[i] = 0;
2303 for (int i = 0; i < 200; i++)
2304 data[i] = 0;
2305 for (int i = 0; i < 2048 * 4; i++) {
2306 double gain = (i / (2048.0 * 4.0));
2307 data[i] = gain;
2308 }
2309 datah = data;
2310 }
2311
2312 SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5);
2313
2314 SF2Layer layer = new SF2Layer(sf2);
2315 layer.setName("Open Hi-Hat");
2316
2317 SF2GlobalRegion global = new SF2GlobalRegion();
2318 layer.setGlobalZone(global);
2319 sf2.addResource(layer);
2320
2321 SF2LayerRegion region = new SF2LayerRegion();
2322 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500);
2323 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2324 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500);
2325 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2326 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2327 region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1);
2328 region.setSample(sample);
2329 layer.getRegions().add(region);
2330
2331 return layer;
2332 }
2333
2334 public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) {
2335 double[] datah;
2336 {
2337 int fftlen = 4096 * 4;
2338 double[] data = new double[2 * fftlen];
2339 Random random = new Random(3049912);
2340 for (int i = 0; i < data.length; i += 2)
2341 data[i] = (2.0 * (random.nextDouble() - 0.5));
2342 for (int i = fftlen / 2; i < data.length; i++)
2343 data[i] = 0;
2344 for (int i = 0; i < 100; i++)
2345 data[i] = 0;
2346 for (int i = 0; i < 512 * 2; i++) {
2347 double gain = (i / (512.0 * 2.0));
2348 data[i] = gain;
2349 }
2350 datah = data;
2351 }
2352
2353 SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5);
2354
2355 SF2Layer layer = new SF2Layer(sf2);
2356 layer.setName("Crash Cymbal");
2357
2358 SF2GlobalRegion global = new SF2GlobalRegion();
2359 layer.setGlobalZone(global);
2360 sf2.addResource(layer);
2361
2362 SF2LayerRegion region = new SF2LayerRegion();
2363 region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800);
2364 region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
2365 region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800);
2366 region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000);
2367 region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0);
2368 region.setSample(sample);
2369 layer.getRegions().add(region);
2370
2371 return layer;
2372 }
2373
2374 public static SF2Layer new_side_stick(SF2Soundbank sf2) {
2375 double[] datab;
2376
2377 // Make treble part
2378 {
2379 int fftlen = 4096 * 4;
2380 double[] data = new double[2 * fftlen];
2381 Random random = new Random(3049912);
2382 for (int i = 0; i < data.length; i += 2)
2383 data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1;
2384 fft(data);
2385 // Remove all negative frequency
2386 for (int i = fftlen / 2; i < data.length; i++)
2387 data[i] = 0;
2388 for (int i = 1024 * 4; i < 2048 * 4; i++)
2389 data[i] = 1.0 - (i - 4096) / 4096.0;
2390 for (int i = 0; i < 200; i++) {
2391 double g = (1.0 - (i / 200.0));
2392 data[i] *= 1.0 + 20 * g * g;
2393 }
2394 for (int i = 0; i < 30; i++)
2395 data[i] = 0;
|