Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
824 lines (717 sloc) 38.5 KB
////////////////////
// DX7Clone
/*
class based on DX clone .scd by cannc !!
refactor by catfact(or)
-------------------------------------------------
-- instantiate one of these with a running Server
-------------------------------------------------
*/
DX7Clone {
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// -- STATIC DATA - created by `cannc` - < all hail
classvar coarseArrR = #[0.5,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],
coarseArrF = #[
1, 10, 100, 1000,
1, 10, 100, 1000,
1, 10, 100, 1000,
1, 10, 100, 1000,
1, 10, 100, 1000,
1, 10, 100, 1000,
1, 10, 100, 1000,
1, 10, 100, 1000],
fineArrR = #[
1.00,1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,
1.10,1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,
1.20,1.21,1.22,1.23,1.24,1.25,1.26,1.27,1.28,1.29,
1.30,1.31,1.32,1.33,1.34,1.35,1.36,1.37,1.38,1.39,
1.40,1.41,1.42,1.43,1.44,1.45,1.46,1.47,1.48,1.49,
1.50,1.51,1.52,1.53,1.54,1.55,1.56,1.57,1.58,1.59,
1.60,1.61,1.62,1.63,1.64,1.65,1.66,1.67,1.68,1.69,
1.70,1.71,1.72,1.73,1.74,1.75,1.76,1.77,1.78,1.79,
1.80,1.81,1.82,1.83,1.84,1.85,1.86,1.87,1.88,1.89,
1.90,1.91,1.92,1.93,1.94,1.95,1.96,1.97,1.98,1.99],
fineArrF = #[
1.000,1.023,1.047,1.072,1.096,1.122,1.148,1.175,1.202,1.230,
1.259,1.288,1.318,1.349,1.380,1.413,1.445,1.479,1.514,1.549,
1.585,1.622,1.660,1.698,1.738,1.778,1.820,1.862,1.905,1.950,
1.995,2.042,2.089,2.138,2.188,2.239,2.291,2.344,2.399,2.455,
2.512,2.570,2.630,2.692,2.716,2.818,2.884,2.951,3.020,3.090,
3.162,3.236,3.311,3.388,3.467,3.548,3.631,3.715,3.802,3.890,
3.981,4.074,4.169,4.266,4.365,4.467,4.571,4.677,4.786,4.898,
5.012,5.129,5.248,5.370,5.495,5.623,5.754,5.888,6.026,6.166,
6.310,6.457,6.607,6.761,6.918,7.079,7.244,7.413,7.586,7.762,
7.943,8.128,8.318,8.511,8.718,8.913,9.120,9.333,9.550,9.772],
voice_eg_rate_rise_duration = #[ 39.638000, 37.013000, 34.388000, 31.763000, 27.210500, 22.658000, 20.408000, 18.158000, 15.908000, 14.557000, 13.206000, 12.108333, 11.010667, 9.913000, 8.921000, 7.929000, 7.171333, 6.413667, 5.656000, 5.307000, 4.958000, 4.405667, 3.853333, 3.301000, 2.889000, 2.477000, 2.313000, 2.149000, 1.985000, 1.700500, 1.416000, 1.274333, 1.132667, 0.991000, 0.909000, 0.827000, 0.758000, 0.689000, 0.620000, 0.558000, 0.496000, 0.448667, 0.401333, 0.354000, 0.332000, 0.310000, 0.275667, 0.241333, 0.207000, 0.180950, 0.154900, 0.144567, 0.134233, 0.123900, 0.106200, 0.088500, 0.079667, 0.070833, 0.062000, 0.056800, 0.051600, 0.047300, 0.043000, 0.038700, 0.034800, 0.030900, 0.028000, 0.025100, 0.022200, 0.020815, 0.019430, 0.017237, 0.015043, 0.012850, 0.011230, 0.009610, 0.009077, 0.008543, 0.008010, 0.006960, 0.005910, 0.005357, 0.004803, 0.004250, 0.003960, 0.003670, 0.003310, 0.002950, 0.002590, 0.002420, 0.002250, 0.002000, 0.001749, 0.001499, 0.001443, 0.001387, 0.001242, 0.001096, 0.000951, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815, 0.000815],
dx7_voice_eg_rate_rise_percent = #[ 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.005007, 0.010005, 0.015003, 0.020000, 0.028000, 0.036000, 0.044000, 0.052000, 0.060000, 0.068000, 0.076000, 0.084000, 0.092000, 0.100000, 0.108000, 0.116000, 0.124000, 0.132000, 0.140000, 0.150000, 0.160000, 0.170000, 0.180000, 0.190000, 0.200000, 0.210000, 0.220000, 0.230000, 0.240000, 0.251000, 0.262000, 0.273000, 0.284000, 0.295000, 0.306000, 0.317000, 0.328000, 0.339000, 0.350000, 0.365000, 0.380000, 0.395000, 0.410000, 0.425000, 0.440000, 0.455000, 0.470000, 0.485000, 0.500000, 0.520000, 0.540000, 0.560000, 0.580000, 0.600000, 0.620000, 0.640000, 0.660000, 0.680000, 0.700000, 0.732000, 0.764000, 0.796000, 0.828000, 0.860000, 0.895000, 0.930000, 0.965000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000],
velTable = #[-99.0,-10.295511,-9.709229,-9.372207,-9.121093,-8.629703,-8.441805,-8.205647,-7.810857,-7.653259,-7.299901,-7.242308,-6.934396, 6.727051,-6.594723,-6.427755,-6.275133,-6.015212,-5.843023,-5.828787,-5.725659,-5.443202,-5.421110,-5.222133,-5.160615,-5.038265,-4.948225,-4.812105, -4.632120,-4.511531,-4.488645,-4.370043,-4.370610,-4.058591,-4.066902,-3.952988,-3.909686,-3.810096,-3.691883,-3.621306,-3.527286,-3.437519,-3.373512,-3.339195,-3.195983, -3.167622, -3.094788, -2.984045,-2.937463, -2.890713, -2.890660, -2.691874,-2.649229, -2.544696, -2.498147, -2.462573,-2.396637, -2.399795, -2.236338, -2.217625, -2.158336, -2.135569, -1.978521, -1.913965,-1.937082, -1.752275, -1.704013, -1.640514,-1.598791, -1.553859, -1.512187, -1.448088,-1.450443, -1.220567, -1.182340, -1.123139,-1.098469, -1.020642, -0.973039, -0.933279,-0.938035, -0.757380, -0.740860, -0.669721,-0.681526, -0.555390, -0.519321, -0.509318,-0.456936, -0.460622, -0.290578, -0.264393,-0.252716, -0.194141, -0.153566, -0.067842,-0.033402, -0.054947, 0.012860, 0.000000,-0.009715, 0.236054, 0.273956, 0.271968,0.330177, 0.345427, 0.352333, 0.433861,0.442952, 0.476411, 0.539632, 0.525355,0.526115, 0.707022, 0.701551, 0.734875,0.739149, 0.794320, 0.801578, 0.814225,0.818939, 0.897102, 0.895082, 0.927998,0.929797, 0.956112, 0.956789, 0.958121],
/* This table converts LFO speed to frequency in Hz. It is based on
* interpolation of Jamie Bullock's measurements. */
dx7_voice_lfo_frequency = #[
0.062506, 0.124815, 0.311474, 0.435381, 0.619784,
0.744396, 0.930495, 1.116390, 1.284220, 1.496880,
1.567830, 1.738994, 1.910158, 2.081322, 2.252486,
2.423650, 2.580668, 2.737686, 2.894704, 3.051722,
3.208740, 3.366820, 3.524900, 3.682980, 3.841060,
3.999140, 4.159420, 4.319700, 4.479980, 4.640260,
4.800540, 4.953584, 5.106628, 5.259672, 5.412716,
5.565760, 5.724918, 5.884076, 6.043234, 6.202392,
6.361550, 6.520044, 6.678538, 6.837032, 6.995526,
7.154020, 7.300500, 7.446980, 7.593460, 7.739940,
7.886420, 8.020588, 8.154756, 8.288924, 8.423092,
8.557260, 8.712624, 8.867988, 9.023352, 9.178716,
9.334080, 9.669644, 10.005208, 10.340772, 10.676336,
11.011900, 11.963680, 12.915460, 13.867240, 14.819020,
15.770800, 16.640240, 17.509680, 18.379120, 19.248560,
20.118000, 21.040700, 21.963400, 22.886100, 23.808800,
24.731500, 25.759740, 26.787980, 27.816220, 28.844460,
29.872700, 31.228200, 32.583700, 33.939200, 35.294700,
36.650200, 37.812480, 38.974760, 40.137040, 41.299320,
42.461600, 43.639800, 44.818000, 45.996200, 47.174400,
47.174400, 47.174400, 47.174400, 47.174400, 47.174400,
47.174400, 47.174400, 47.174400, 47.174400, 47.174400,
47.174400, 47.174400, 47.174400, 47.174400, 47.174400,
47.174400, 47.174400, 47.174400, 47.174400, 47.174400,
47.174400, 47.174400, 47.174400, 47.174400, 47.174400,
47.174400, 47.174400, 47.174400],
/* This table converts pitch modulation sensitivity to semitones at full
* modulation (assuming a perfectly linear pitch mod depth to pitch
* relationship). It is from a simple averaging of Jamie Bullock's
* TX-data-1/PMD and TX-data-2/ENV data, and ignores the apparent ~0.1
* semitone positive bias that Jamie observed. [-FIX- smbolton: my
* inclination would be to call this bias, if it's reproducible, a
* non-desirable 'bug', and _not_ implement it in hexter. And, at
* least for my own personal build, I'd change that PMS=7 value to a
* full octave, since that's one thing that's always bugged me about
* my TX7. Thoughts? ] */
dx7_voice_pms_to_semitones= #[ //8
0.0, 0.450584, 0.900392, 1.474744,
2.587385, 4.232292, 6.982097, /* 11.722111 */ 12.0],
/* This table converts amplitude modulation depth to output level
* reduction at full modulation with an amplitude modulation sensitivity
* of 3. It was constructed from regression of a very few data points,
* using this code:
* perl -e 'for ($i = 0; $i <= 99; $i++) { printf " %f,\n", exp($i * 0.0428993 - 0.285189); }' >x.c
* and is probably rather rough in its accuracy. -FIX- */
dx7_voice_amd_to_ol_adjustment = #[ //100
0.0, 0.784829, 0.819230, 0.855139, 0.892622, 0.931748,
0.972589, 1.015221, 1.059721, 1.106171, 1.154658, 1.205270,
1.258100, 1.313246, 1.370809, 1.430896, 1.493616, 1.559085,
1.627424, 1.698759, 1.773220, 1.850945, 1.932077, 2.016765,
2.105166, 2.197441, 2.293761, 2.394303, 2.499252, 2.608801,
2.723152, 2.842515, 2.967111, 3.097167, 3.232925, 3.374633,
3.522552, 3.676956, 3.838127, 4.006362, 4.181972, 4.365280,
4.556622, 4.756352, 4.964836, 5.182458, 5.409620, 5.646738,
5.894251, 6.152612, 6.422298, 6.703805, 6.997652, 7.304378,
7.624549, 7.958754, 8.307609, 8.671754, 9.051861, 9.448629,
9.862789, 10.295103, 10.746365, 11.217408, 11.709099,
12.222341, 12.758080, 13.317302, 13.901036, 14.510357,
15.146387, 15.810295, 16.503304, 17.226690, 17.981783,
18.769975, 19.592715, 20.451518, 21.347965, 22.283705,
23.260462, 24.280032, 25.344294, 26.455204, 27.614809,
28.825243, 30.088734, 31.407606, 32.784289, 34.221315,
35.721330, 37.287095, 38.921492, 40.627529, 42.408347,
44.267222, 46.207578, 48.232984, 50.347169, 52.75],
/* This table converts pitch envelope level parameters into the
* actual pitch shift in semitones. For levels [17,85], this is
* just ((level - 50) / 32 * 12), but at the outer edges the shift
* is exagerated to 0 = -48 and 99 => 47.624. This is based on
* measurements I took from my TX7. */
dx7_voice_pitch_level_to_shift = #[ //128
-48.000000, -43.497081, -38.995993, -35.626132, -31.873615,
-28.495880, -25.500672, -22.872620, -20.998167, -19.496961,
-18.373238, -17.251065, -16.122139, -15.375956, -14.624487,
-13.876516, -13.126351, -12.375000, -12.000000, -11.625000,
-11.250000, -10.875000, -10.500000, -10.125000, -9.750000,
-9.375000, -9.000000, -8.625000, -8.250000, -7.875000,
-7.500000, -7.125000, -6.750000, -6.375000, -6.000000,
-5.625000, -5.250000, -4.875000, -4.500000, -4.125000,
-3.750000, -3.375000, -3.000000, -2.625000, -2.250000,
-1.875000, -1.500000, -1.125000, -0.750000, -0.375000, 0.000000,
0.375000, 0.750000, 1.125000, 1.500000, 1.875000, 2.250000,
2.625000, 3.000000, 3.375000, 3.750000, 4.125000, 4.500000,
4.875000, 5.250000, 5.625000, 6.000000, 6.375000, 6.750000,
7.125000, 7.500000, 7.875000, 8.250000, 8.625000, 9.000000,
9.375000, 9.750000, 10.125000, 10.500000, 10.875000, 11.250000,
11.625000, 12.000000, 12.375000, 12.750000, 13.125000,
14.251187, 15.001922, 16.126327, 17.250917, 18.375718,
19.877643, 21.753528, 24.373913, 27.378021, 30.748956,
34.499234, 38.627888, 43.122335, 47.624065, 48.0, 48.0, 48.0,
48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0,
48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0, 48.0,
48.0, 48.0, 48.0, 48.0, 48.0],
/*
adepth = dx7_voice_amd_to_ol_adjustment[voice->lfo_amd];
%%%%%%%%%%%%%%%%%%%%%%%%
/* full-scale amp mod for adepth and edepth should be 52.75 and
* their sum _must_ be limited to less than 128, or bad things will happen! */
if (adepth > 127.5f) adepth = 127.5f;
if (adepth + mdepth > 127.5f)
mdepth = 127.5f - adepth;
if (adepth + mdepth + edepth > 127.5f)
edepth = 127.5f - (adepth + mdepth);
*/
feedbackSel = #[
35, 7, 35, 33, 35, 34, 35, 21,
7, 14, 35, 7, 35, 35, 7, 35,
7, 14, 35, 14, 14, 35, 35, 35,
35, 35, 14, 28, 35, 28, 35, 35
],
feedbackIndex = #[0, 0.0066, 0.0077, 0.011, 0.0153, 0.018, 0.0226, 0.063],
cirklonCCparse = # [
128, 129, 131, 133, 132, 138, 135, 136,
137, 134, 130, 139, 140, 141, 142, 143,
144, 145, 146, 176, 0, 114, 12, 72,
24, 30, 36, 42, 48, 54, 60, 66,
6, 90, 102, 84, 96, 78, 108, 18,
177, 1, 115, 13, 73, 25, 31, 37,
43, 49, 55, 61, 67, 7, 91, 103,
85, 97, 79, 109, 19, 178, 2, 116,
14, 74, 26, 32, 38, 44, 50, 56,
62, 68, 8, 92, 104, 86, 98, 80,
110, 20, 179, 3, 117, 15, 75, 27,
33, 39, 45, 51, 57, 63, 69, 9,
93, 105, 87, 99, 81, 111, 21, 180,
4, 118, 16, 76, 28, 34, 40, 46,
52, 58, 64, 70, 10, 94, 106, 88,
100, 82, 112, 22, 181, 5, 119, 17,
77, 29, 35, 41, 47, 53, 59, 65,
71, 11, 95, 107, 89, 101, 83, 113,
23
],
outOscVol = #[2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 3, 4, 4, 4, 5, 5, 3, 3, 3, 4, 4, 5, 6],
phase_selector = #[0.5pi , 0.98pi , 0.98 , 0.98pi, 0 , 0 ],
pitchTameConst = #[0,1,1,0,0,0],
pitchTameMult = #[1,0,0,1,1,1],
selector = #[66, 48, 54, 60, 66],
/// YE WAVE_FORMES
wf
;
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// --- member variables
var vr;
var noteArrayDX7 ;
var betass = 0, headno;
var lfoSqr;
var lfoSawDown;
var lfoSawUp;
var lfoSin;
var lfoSin;
var lfoTri;
var pitchTameConst;
var pitchTameMult;
var busMeAmp;
var busMePitch;
var waveform_selector, phase_selector;
var pitchTameConst, pitchTameMult;
var dumm, selector = #[66, 48, 54, 60, 66];
var novaDX7;
var s;
/// FIXME (emb) i dunno about files in classes and pathes and &C
var p, r;
var g, k;
var filedump, numPresets;
var noteOnBusy, maxReleaseLength;
*new { arg server;
^super.new.init(server);
}
init { arg server;
maxReleaseLength = 10;
noteOnBusy = false;
numPresets = 16383;
filedump = Array.new(numPresets);
p = Platform.userAppSupportDir ++ "/DX7.afx";
r = File(p, "r");
// r = File("/home/rick/git_checkouts/DX7-Supercollider/DX7.afx","r");
numPresets.do({arg preIdx;
// var g;
// var nextPreset;
g = r.getLine;
145.do({arg item;
filedump = filedump.add( (g.at((item*2)) ++ g.at((item*2) + 1)).asInt);
});
});
r.close;
s = server;
novaDX7 = ParGroup.new(s);
lfoSqr = Buffer.alloc(s, 512, 1);
lfoSawDown = Buffer.alloc(s, 512, 1);
lfoSawUp = Buffer.alloc(s, 512, 1);
lfoSin = Buffer.alloc(s, 512, 1);
lfoTri = Buffer.alloc(s, 512, 1);
busMeAmp = Bus.audio(s, 1);
busMePitch = Bus.audio(s, 1);
lfoSqr.sine3(Array.series(50, 1, 2), 1/Array.series(50, 1, 2)); //square waveform
lfoTri.sine3(Array.series(50, 1, 2), ((1/(Array.series(50, 1, 2).squared)) * [1,-1])); //triangle waveform
lfoSawDown.sine3(Array.series(100, 1, 1), (1/(Array.series(100, 1, 1)) * [-1,1]),4pi); //sawtooth waveform down
lfoSawUp.sine3(Array.series(100, 1, 1), (1/(Array.series(100, 1, 1)) * [-1,1]),3pi); //sawtooth waveform rising
lfoSin.sine3([1],[1]); // sine waveform
waveform_selector = [lfoTri, lfoSawDown, lfoSawUp, lfoSqr, lfoSin, lfoSin];
vr = Array.fill(256, 63);
noteArrayDX7 = Array.newClear(256);
noteArrayDX7.size.do( {arg n;
noteArrayDX7[n] = Array.newClear(128);
});
// FIXME (emb): waste of memory to make YE_WAVE_FORMES a member var
wf = Array2D.fromArray(32, 42, [
//algorithm matrix
/*Alg #1*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,1,0,0,0,
/*Alg #2*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,(pi * 4),0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,0,/*V*/1,0,1,0,0,0,
/*Alg #3*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,0,1,0,0,
/*Alg #4*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,(pi * 4),0,0,/*V*/1,0,0,1,0,0,
/*Alg #5*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,1,0,1,0,
/*Alg #6*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,(pi * 4),0,/*V*/1,0,1,0,1,0,
/*Alg #7*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),(pi * 4),0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,1,0,0,0,
/*Alg #8*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),(pi * 4),0,/*4*/0,0,0,(pi * 4),0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,0,/*V*/1,0,1,0,0,0,
/*Alg #9*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,(pi * 4),0,0,0,0,/*3*/0,0,0,(pi * 4),(pi * 4),0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,0,/*V*/1,0,1,0,0,0,
/*Alg #10*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,(pi * 4),0,0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,0,/*V*/1,0,0,1,0,0,
/*Alg #11*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,0,1,0,0,
/*Alg #12*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,(pi * 4),0,0,0,0,/*3*/0,0,0,(pi * 4),(pi * 4),(pi * 4),/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,0,/*V*/1,0,1,0,0,0,
/*Alg #13*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),(pi * 4),(pi * 4),/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,1,0,0,0,
/*Alg #14*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,1,0,0,0,
/*Alg #15*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,(pi * 4),0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,0,/*V*/1,0,1,0,0,0,
/*Alg #16*/ /*1*/0,(pi * 4),(pi * 4),0,(pi * 4),0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,0,0,0,0,
/*Alg #17*/ /*1*/0,(pi * 4),(pi * 4),0,(pi * 4),0,/*2*/0,(pi * 4),0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,0,/*V*/1,0,0,0,0,0,
/*Alg #18*/ /*1*/0,(pi * 4),(pi * 4),(pi * 4),0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,(pi * 4),0,0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,0,/*V*/1,0,0,0,0,0,
/*Alg #19*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,0,(pi * 4),/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,0,1,1,0,
/*Alg #20*/ /*1*/0,0,(pi * 4),0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,(pi * 4),0,0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,0,/*V*/1,1,0,1,0,0,
/*Alg #21*/ /*1*/0,0,(pi * 4),0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,(pi * 4),0,0,0,/*4*/0,0,0,0,0,(pi * 4),/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,0,/*V*/1,1,0,1,1,0,
/*Alg #22*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,0,0,(pi * 4),/*4*/0,0,0,0,0,(pi * 4),/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,0,1,1,1,0,
/*Alg #23*/ /*1*/0,0,0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,0,(pi * 4),/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,0,1,1,0,
/*Alg #24*/ /*1*/0,0,0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,0,0,(pi * 4),/*4*/0,0,0,0,0,(pi * 4),/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,1,1,1,0,
/*Alg #25*/ /*1*/0,0,0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,0,(pi * 4),/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,1,1,1,0,
/*Alg #26*/ /*1*/0,0,0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,0,1,0,0,
/*Alg #27*/ /*1*/0,0,0,0,0,0,/*2*/0,0,(pi * 4),0,0,0,/*3*/0,0,(pi * 4),0,0,0,/*4*/0,0,0,0,(pi * 4),(pi * 4),/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,0,/*V*/1,1,0,1,0,0,
/*Alg #28*/ /*1*/0,(pi * 4),0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,(pi * 4),0,/*6*/0,0,0,0,0,0,/*V*/1,0,1,0,0,1,
/*Alg #29*/ /*1*/0,0,0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,1,0,1,0,
/*Alg #30*/ /*1*/0,0,0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,(pi * 4),0,0,/*4*/0,0,0,0,(pi * 4),0,/*5*/0,0,0,0,(pi * 4),0,/*6*/0,0,0,0,0,0,/*V*/1,1,1,0,0,1,
/*Alg #31*/ /*1*/0,0,0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,(pi * 4),/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,1,1,1,0,
/*Alg #32*/ /*1*/0,0,0,0,0,0,/*2*/0,0,0,0,0,0,/*3*/0,0,0,0,0,0,/*4*/0,0,0,0,0,0,/*5*/0,0,0,0,0,0,/*6*/0,0,0,0,0,(pi * 4),/*V*/1,1,1,1,1,1
]);
/////////////////////////////////////////////////////////?
/////////////////////////////////////////////////////////?
/////////////////////////////////////////////////////////?
// --- buffers and busses
lfoSqr = Buffer.alloc(s, 512, 1);
lfoSawDown = Buffer.alloc(s, 512, 1);
lfoSawUp = Buffer.alloc(s, 512, 1);
lfoSin = Buffer.alloc(s, 512, 1);
lfoTri = Buffer.alloc(s, 512, 1);
pitchTameConst;
pitchTameMult;
busMeAmp = Bus.audio(s, 1);
busMePitch = Bus.audio(s, 1);
lfoSqr.sine3(Array.series(50, 1, 2), 1/Array.series(50, 1, 2)); //square waveform
lfoTri.sine3(Array.series(50, 1, 2), ((1/(Array.series(50, 1, 2).squared)) * [1,-1])); //triangle waveform
lfoSawDown.sine3(Array.series(100, 1, 1), (1/(Array.series(100, 1, 1)) * [-1,1]),4pi); //sawtooth waveform down
lfoSawUp.sine3(Array.series(100, 1, 1), (1/(Array.series(100, 1, 1)) * [-1,1]),3pi); //sawtooth waveform rising
lfoSin.sine3([1],[1]); // sine waveform
waveform_selector = [lfoTri, lfoSawDown, lfoSawUp, lfoSqr, lfoSin, lfoSin];
phase_selector = [0.5pi , 0.98pi , 0.98 , 0.98pi, 0 , 0 ];
pitchTameConst = [0,1,1,0,0,0];
pitchTameMult = [1,0,0,1,1,1];
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
// ---- SynthDefs
SynthDef(\InfEfx, {
arg outBus=0, pitch, gate,
lfoGet1 = 0, lfoGet2=1,
lfo_speed, lfo_wave, lfo_phase,
lfo_delay, lfo_pmd, lfo_amd, lfo_sync, lfo_pms, pitchCons,envTrig, tameC, tameM,
eg_r1, eg_r2, eg_r3, eg_r4, eg_L1, eg_L2, eg_L3, eg_L4;
//
var lfo, pitchenv, output, randomlfo, multiPitch, lfoAmp;
//
FreeSelf.kr(gate);
lfo = Osc.ar(lfo_wave,lfo_speed, lfo_phase, 0.5 * lfoGet2, 0.5 * lfoGet2) + LFNoise0.ar(lfo_speed, 0.5 * lfoGet1, 0.5 * lfoGet1);
lfo = lfo * EnvGen.ar(Env.asr(lfo_delay,releaseTime:0.01, curve: -5), envTrig);
multiPitch = LinLin.ar(lfo, 0, 1, (pitchCons.neg.midiratio * tameM) + tameC, pitchCons.midiratio);
lfoAmp = LinLin.ar(lfo, 0, 1, lfo_amd * (-3/4), 0);
//Poll.ar(Impulse.ar(10), lfoAmp);
//PHASE PART++
//tri en tepeden basliyor
//sawdown en asagidan baslio
//pms 4, pmd 40, +-1 semitone yapiyor
//sawup en yukardan
//square en asaidan
//sine sifirdan baslio
Out.ar(busMePitch, multiPitch);
Out.ar(busMeAmp, lfoAmp)
}).send(s);
SynthDef(\DX7, {
arg outBus=0, pitch, gate = 1,
envPL0, envPL1, envPL2, envPL3, envPL4, envPR0, envPR1, envPR2, envPR3,
coars1, fine_1, coars2, fine_2, coars3, fine_3, coars4, fine_4, coars5, fine_5, coars6, fine_6,
env1L0, env1L1, env1L2, env1L3, env1L4, env1R0, env1R1, env1R2, env1R3, env1C0, env1C1, env1C2, env1C3,
env2L0, env2L1, env2L2, env2L3, env2L4, env2R0, env2R1, env2R2, env2R3, env2C0, env2C1, env2C2, env2C3,
env3L0, env3L1, env3L2, env3L3, env3L4, env3R0, env3R1, env3R2, env3R3, env3C0, env3C1, env3C2, env3C3,
env4L0, env4L1, env4L2, env4L3, env4L4, env4R0, env4R1, env4R2, env4R3, env4C0, env4C1, env4C2, env4C3,
env5L0, env5L1, env5L2, env5L3, env5L4, env5R0, env5R1, env5R2, env5R3, env5C0, env5C1, env5C2, env5C3,
env6L0, env6L1, env6L2, env6L3, env6L4, env6R0, env6R1, env6R2, env6R3, env6C0, env6C1, env6C2, env6C3,
noteBlok1, noteBlok2, noteBlok3, noteBlok4, noteBlok5, noteBlok6,
dn0, dn1, dn2, dn3, dn4, dn5,
dn6, dn7, dn8, dn9, dn10, dn11,
dn12, dn13, dn14, dn15, dn16, dn17,
dn18, dn19, dn20, dn21, dn22, dn23,
dn24, dn25, dn26, dn27, dn28, dn29,
dn30, dn31, dn32, dn33, dn34, dn35,
dn36, dn37, dn38, dn39, dn40, dn41,
detun1, detun2, detun3, detun4, detun5, detun6,
modSens1, modSens2, modSens3, modSens4, modSens5, modSens6, outMult,
//below is the general,
osc_sync, transpose,
gate1=1, gate1Rel = 1, amp=0.1, totVol;
var ctls, mods, chans, out,
envAmp1, envEnv1, envAmp2, envEnv2, envAmp3, envEnv3 ,envAmp4, envEnv4, envAmp5, envEnv5, envAmp6, envEnv6, dca, envAmpP, envEnvP;
//
envEnvP = Env.new([ envPL0, envPL1, envPL2, envPL3, envPL4], [envPR0,envPR1,envPR2,envPR3], 0, 3);
envAmpP = EnvGen.kr(envEnvP, gate, doneAction:0);
envEnv1 = Env.new([(-1 * env1L0).dbamp ,(-1 * env1L1).dbamp, (-1 * env1L2).dbamp, (-1 * env1L3).dbamp, (-1 * env1L4).dbamp], [env1R0,env1R1,env1R2,env1R3], [env1C0,env1C1,env1C2,env1C3], 3);
envAmp1 = EnvGen.kr(envEnv1, gate, doneAction:0 );
envEnv2 = Env.new([(-1 * env2L0).dbamp ,(-1 * env2L1).dbamp, (-1 * env2L2).dbamp, (-1 * env2L3).dbamp, (-1 * env2L4).dbamp], [env2R0,env2R1,env2R2,env2R3], [env2C0,env2C1,env2C2,env2C3], 3);
envAmp2 = EnvGen.kr(envEnv2, gate, doneAction:0 );
envEnv3 = Env.new([(-1 * env3L0).dbamp ,(-1 * env3L1).dbamp, (-1 * env3L2).dbamp, (-1 * env3L3).dbamp, (-1 * env3L4).dbamp], [env3R0,env3R1,env3R2,env3R3], [env3C0,env3C1,env3C2,env3C3], 3);
envAmp3 = EnvGen.kr(envEnv3, gate, doneAction:0 );
envEnv4 = Env.new([(-1 * env4L0).dbamp ,(-1 * env4L1).dbamp, (-1 * env4L2).dbamp, (-1 * env4L3).dbamp, (-1 * env4L4).dbamp], [env4R0,env4R1,env4R2,env4R3], [env4C0,env4C1,env4C2,env4C3], 3);
envAmp4 = EnvGen.kr(envEnv4, gate, doneAction:0 );
envEnv5 = Env.new([(-1 * env5L0).dbamp ,(-1 * env5L1).dbamp, (-1 * env5L2).dbamp, (-1 * env5L3).dbamp, (-1 * env5L4).dbamp], [env5R0,env5R1,env5R2,env5R3], [env5C0,env5C1,env5C2,env5C3], 3);
envAmp5 = EnvGen.kr(envEnv5, gate, doneAction:0 );
envEnv6 = Env.new([(-1 * env6L0).dbamp ,(-1 * env6L1).dbamp, (-1 * env6L2).dbamp, (-1 * env6L3).dbamp, (-1 * env6L4).dbamp], [env6R0,env6R1,env6R2,env6R3], [env6C0,env6C1,env6C2,env6C3], 3);
envAmp6 = EnvGen.kr(envEnv6, gate, doneAction:0 );
// envEnv1.test.plot;
ctls = [
[coars1 * fine_1 * ((pitch * noteBlok1) + ((detun1-7)/32)) * (envAmpP.midiratio) * Lag2.ar(In.ar(busMePitch),0.01), Rand(0,2pi) * osc_sync, envAmp1 * (Lag2.ar(In.ar(busMeAmp),0.01) * (modSens1/3)).dbamp],
[coars2 * fine_2 * ((pitch * noteBlok2) + ((detun2-7)/32)) * (envAmpP.midiratio) * Lag2.ar(In.ar(busMePitch),0.01), Rand(0,2pi) * osc_sync, envAmp2 * (Lag2.ar(In.ar(busMeAmp),0.01) * (modSens2/3)).dbamp],
[coars3 * fine_3 * ((pitch * noteBlok3) + ((detun3-7)/32)) * (envAmpP.midiratio) * Lag2.ar(In.ar(busMePitch),0.01), Rand(0,2pi) * osc_sync, envAmp3 * (Lag2.ar(In.ar(busMeAmp),0.01) * (modSens3/3)).dbamp],
[coars4 * fine_4 * ((pitch * noteBlok4) + ((detun4-7)/32)) * (envAmpP.midiratio) * Lag2.ar(In.ar(busMePitch),0.01), Rand(0,2pi) * osc_sync, envAmp4 * (Lag2.ar(In.ar(busMeAmp),0.01) * (modSens4/3)).dbamp],
[coars5 * fine_5 * ((pitch * noteBlok5) + ((detun5-7)/32)) * (envAmpP.midiratio) * Lag2.ar(In.ar(busMePitch),0.01), Rand(0,2pi) * osc_sync, envAmp5 * (Lag2.ar(In.ar(busMeAmp),0.01) * (modSens5/3)).dbamp],
[coars6 * fine_6 * ((pitch * noteBlok6) + ((detun6-7)/32)) * (envAmpP.midiratio) * Lag2.ar(In.ar(busMePitch),0.01), Rand(0,2pi) * osc_sync, envAmp6 * (Lag2.ar(In.ar(busMeAmp),0.01) * (modSens6/3)).dbamp]
];
mods = [
[dn0, dn1, dn2, dn3, dn4, dn5],
[dn6, dn7, dn8, dn9, dn10, dn11],
[dn12, dn13, dn14, dn15, dn16, dn17],
[dn18, dn19, dn20, dn21, dn22, dn23],
[dn24, dn25, dn26, dn27, dn28, dn29],
[dn30, dn31, dn32, dn33, dn34, dn35]
];
chans = [0, 1, 2, 3, 4, 5];
out = FM7.ar(ctls, mods).slice(chans) * -12.dbamp;
out = Mix.new([
(out[0] * 1 * dn36),
(out[1] * 1 * dn37),
(out[2] * 1 * dn38),
(out[3] * 1 * dn39),
(out[4] * 1 * dn40),
(out[5] * 1 * dn41),
]);
out = HPF.ar(out, 5);
if (maxReleaseLength > 0,
{FreeSelfWhenDone.kr(Line.kr(0, 1, maxReleaseLength));
});
DetectSilence.ar(out, 0.01, 0.2, doneAction:2);
//out = out * Lag2.ar(In.ar(busMe),0.01);
//Out.ar([0,1], 0.5 * In.ar(busMe)); //deneme
out = out / outMult;
//DetectSilence.ar(out, 0.01, 0.2,doneAction:2);
//out = out * ((totVol -15).dbamp);
Out.ar(outBus, out.dup); //orj
}).send(s);
} // /init
noteFreeTimeout {arg timeout;
maxReleaseLength = timeout;
}
envCal { arg // Area of hardcore envelope calculation function.
vr1, //Level Current
vr2, //Level Next
vrx, //Speed
vrv, //Volume
velo,//Velocity
velSens,
level_scaling_bkpoint,
level_scaling_l_depth,
level_scaling_r_depth,
level_scaling_l_curve,
level_scaling_r_curve,
transposed_note,
rate_scaling,
amp_mod_sens;//not sure if i put this globa
var dummy, velFin, env_L0, env_L1, env_R0, vrvDec, endR0, dbStr, dbEnd;
if (((transposed_note < (level_scaling_bkpoint + 21)) && (level_scaling_l_depth > 0)), {
dummy = (level_scaling_bkpoint - (((transposed_note + 2) / 3).asInt * 3) + 21);
case
{ level_scaling_l_curve == 0 } // -lin
{vrv = (vrv - ((dummy / 45) * level_scaling_l_depth).asInt)}
{ level_scaling_l_curve == 1 } // -exp
{vrv = (vrv - (((dummy - 72) / 13.5).exp * level_scaling_l_depth).asInt)}
{ level_scaling_l_curve == 2 } // +exp
{vrv = (vrv + (((dummy - 72) / 13.5).exp * level_scaling_l_depth).asInt)}
{ level_scaling_l_curve == 3 } // +lin
{vrv = (vrv + ((dummy / 45) * level_scaling_l_depth).asInt)};
});
if (((transposed_note > (level_scaling_bkpoint + 21)) && (level_scaling_r_depth > 0)), {
dummy = (((transposed_note + 2) / 3).asInt * 3) - level_scaling_bkpoint - 21;
case
{ level_scaling_r_curve == 0 } // -lin
{vrv = (vrv - ((dummy / 45) * level_scaling_r_depth).asInt)}
{ level_scaling_r_curve == 1 } // -exp
{vrv = (vrv - (((dummy - 72) / 13.5).exp * level_scaling_r_depth).asInt)}
{ level_scaling_r_curve == 2 } // +exp
{vrv = (vrv + (((dummy - 72) / 13.5).exp * level_scaling_r_depth).asInt)}
{ level_scaling_r_curve == 3 } // +lin
{vrv = (vrv + ((dummy / 45) * level_scaling_r_depth).asInt)};
});
rate_scaling = ((rate_scaling * (transposed_note - 21) / (126.0 - 21.0) * 127.0 / 128.0 * 6.5 )- 0.5).asInt;
vrx = (rate_scaling + vrx).clip(0,99);
vrv = vrv.clip(0,99);
velFin = (velTable[velo] * velSens);
//~vrv = ((~vrv+(~velTable[~velo] * ~velSens)).clip(0,127));//old version
env_L0 = case
{(100 > vr1) && (vr1 > 20)} { (64 * (14 + ((vr1) >> 1)))}
{(21 > vr1) && (vr1 > 16)} { (64 * (4 + vr1))}
{(17 > vr1) && (vr1 > 5)} { (64 * (5 + vr1))}
{(6 > vr1) && (vr1 > (-1))} { (64 * (2 * vr1))}
{99 < vr1} { (64 * (14 + (99 >> 1)))};
env_L1 = case
{(100 > vr2) && (vr2 > 20)} { (64 * (14 + ((vr2) >> 1)))}
{(21 > vr2) && (vr2 > 16)} { (64 * (4 + vr2))}
{(17 > vr2) && (vr2 > 5)} { (64 * (5 + vr2))}
{(6 > vr2) && (vr2 > (-1))} { (64 * (2 * vr2 + 5))}
{99 < vr2} { (64 * (14 + (99 >> 1)))};
vrvDec = ((vrv+ velFin).clip(0,127));//is this correct, limit 99?
env_R0 = (0.2819*(2.pow((vrx)*0.16))); // attack ise -1? decay ise + 0.5?
vrvDec = case
{(128 > vrvDec) && (vrvDec > 20)} {(32 * (vrvDec + 28))}
{(21 > vrvDec) && (vrvDec > 16)} {(32 * (vrvDec + 17))}
{(17 > vrvDec) && (vrvDec > 5)} {(32 * (vrvDec + 11))}
{(6 > vrvDec) && (vrvDec > (-1))} {(32 * (vrvDec))};
dbStr = ((99 - (vr1 + vrv - 99 + velFin)) / 1.33333333);
dbEnd = ((99 - (vr2 + vrv - 99 + velFin)) / 1.333333);
endR0 = if( (env_L0 > env_L1),
{
((((env_L0 + vrvDec - 4064).clip(1,9000) - (env_L1 + vrvDec - 4064).clip(1,9000))* 0.0235) / env_R0)
},
{
(voice_eg_rate_rise_duration[vrx] * (dx7_voice_eg_rate_rise_percent[((((vr2 * vrv) / 99) + velFin).clip(0,99)).asInt] - dx7_voice_eg_rate_rise_percent[((((vr1 * vrv) / 99) + velFin).clip(0,99)).asInt]))
}
);
//[dbStr, dbEnd, endR0].postln;
^[dbStr, dbEnd, endR0]
}
defjamHead { arg a1;
var abc = [], cba = [], algo, fdbIndNo = Array.fill(42, 1), lfoDepth, lfoGet1, lfoGet2;
var retval;
retval = if((a1 == 1),
{
algo = (vr[128]).clip(0,31);
abc = [\outMult, outOscVol[vr[128]]];
//abc.postln;
fdbIndNo[feedbackSel[algo]] = feedbackIndex[(vr[129])] * (vr[129]);
42.do(
{
arg x;
abc = abc ++ [\dn ++ x, (wf[algo,x] * fdbIndNo[x])];
});
abc
},
{
if(vr[133] == 5, {lfoGet1=1; lfoGet2 =0}, {lfoGet1 = 0; lfoGet2 =1 });
lfoDepth = (dx7_voice_pms_to_semitones[vr[138]]) * (vr[135] / 99);
//lfoDepth.postln;
cba = [
\lfo_speed, dx7_voice_lfo_frequency[vr[132]],
\lfo_wave, (waveform_selector[vr[133]]).bufnum, //random signal icinde yap,
\lfo_phase, phase_selector[vr[133]],
\envTrig, 0,
\envTrig, 1,
\pitchCons, lfoDepth,
/* sifirdan baslasin because we need to reset the LFO phase */
\lfoGet1, lfoGet1,
\lfoGet2, lfoGet2,
\tameM, pitchTameMult[vr[133]],
\tameC, pitchTameConst[vr[133]],
\lfo_delay, ((vr[134]).clip(0,99)).linlin(0,99,0.01,3.4),//lineer ramp ile carp
\lfo_amd, dx7_voice_amd_to_ol_adjustment[vr[136]]
];
//cba.postln;
cba
//a y.removeAt(1); ['a', 'b', 'c'].do({ arg item, i; [i, item].postln; });
}
);
// postln(retval);
^retval;
}
defPitchEnv { arg rate_1, rate_2, rate_3, rate_4, level_1, level_2, level_3, level_4;
var endy,
envPL0, envPL1, envPL2, envPL3, envPL4, envPR0, envPR1, envPR2,envPR3;
//functions start here
envPL0 = dx7_voice_pitch_level_to_shift[level_4];
envPL1 = dx7_voice_pitch_level_to_shift[level_1];
envPL2 = dx7_voice_pitch_level_to_shift[level_2];
envPL3 = dx7_voice_pitch_level_to_shift[level_3];
envPL4 = dx7_voice_pitch_level_to_shift[level_4];
envPR0 = exp((rate_1 - 70.337897) / -25.580953) * abs((envPL1 - envPL0) / 96.0) * 2.45;
envPR1 = exp((rate_2 - 70.337897) / -25.580953) * abs((envPL2 - envPL1) / 96.0) * 2.45;
envPR2 = exp((rate_3 - 70.337897) / -25.580953) * abs((envPL3 - envPL2) / 96.0) * 2.45;
envPR3 = exp((rate_4 - 70.337897) / -25.580953) * abs((envPL4 - envPL3) / 96.0) * 2.45;
endy = [
\envPL0, envPL0,
\envPL1, envPL1,
\envPL2, envPL2,
\envPL3, envPL3,
\envPL4, envPL4,
\envPR0, envPR0,
\envPR1, envPR1,
\envPR2, envPR2,
\envPR3, envPR3
];
//endy.postln;
^endy
}
defme { arg a1,b1;
var a , bil, ptchEnv,
envL = Array2D.new(6,5),
envR = Array2D.new(6,4),
//selector = [66, 48, 54, 60, 66],
envC = Array2D.new(6,4);
6.do { arg y;
4.do(
{
arg x;//selector = [66, 48, 54, 60, 66],
dumm = this.envCal(
vr[selector[x] + y],//vr1, //Level Current
vr[selector[x + 1] + y],//vr2, //Level Next
(99-vr[(24 + (x * 6)) + y]),//vrx, //Speed
vr[6 + y],//vrv, //Volume
b1,//velo,//Velocity
vr[108 + y],//velSens,
vr[78 + y],//level_scaling_bkpoint,
vr[90 + y],//level_scaling_l_depth,
vr[102 + y],//level_scaling_r_depth,
vr[84 + y],//level_scaling_l_curve,
vr[96 + y],//level_scaling_r_curve,
(a1 + 3 + vr[131] - 24),//transposed_note,
vr[72 + y],//rate_scaling,//not implemented yer
vr[18 + y]//amp_mod_sens;//no
);
envL[y,x] = dumm[0];
envR[y,x] = dumm[2];
if(dumm[0] > dumm[1], { envC[y,x] = 3} ,{envC[y,x] = -3});
});
envL[y,4] = envL[y,0];
};
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bil = this.defjamHead(1);
a =[
\pitch, (a1 + vr[131] - 24 ).midicps,
\amp, b1.linlin(0,127,-18,18)];
6.do { arg c;
var trCoarse, trFine, trDetune, bloke;//176
if(vr[176 + c] == 0, //midi CC 128 + 48 fixed frequency
{
trCoarse = coarseArrR[vr[0 + c]];
trFine = fineArrR[vr[114 + c]];
trDetune = vr[12 + c];
bloke = 1;
},
{
trCoarse = coarseArrF[vr[0 + c]];
trFine = fineArrF[vr[114 + c]];
trDetune = 39;
bloke = 0;
});
a = a ++ [
\coars ++ (c + 1), trCoarse,
\fine_ ++ (c + 1), trFine,
\detun ++ (c + 1), trDetune,
\noteBlok ++ (c + 1), bloke,
];
};
6.do { arg k;
a = a ++ [
\coars ++ (k + 1), coarseArrR[vr[0 + k]],
\fine_ ++ (k + 1), fineArrR[vr[114 + k]],
\env ++ (k + 1) ++ "L0", envL[k,0],
\env ++ (k + 1) ++ "L1", envL[k,1],
\env ++ (k + 1) ++ "L2", envL[k,2],
\env ++ (k + 1) ++ "L3", envL[k,3],
\env ++ (k + 1) ++ "L4", envL[k,4],
\env ++ (k + 1) ++ "R0", envR[k,0],
\env ++ (k + 1) ++ "R1", envR[k,1],
\env ++ (k + 1) ++ "R2", envR[k,2],
\env ++ (k + 1) ++ "R3", envR[k,3],
\env ++ (k + 1) ++ "C0", envC[k,0],
\env ++ (k + 1) ++ "C1", envC[k,1],
\env ++ (k + 1) ++ "C2", envC[k,2],
\env ++ (k + 1) ++ "C3", envC[k,3],
\modSens ++ (k + 1), vr[18 + k],
];
};
ptchEnv = this.defPitchEnv((99-vr[139]),(99-vr[140]),(99-vr[141]),(99-vr[142]),vr[143],vr[144],vr[145],vr[146]);
a = bil ++ a ++ ptchEnv;
a = a ++ [\osc_sync, ((vr[130] * (-1)) + 1)];
//a.postln;
^a
}
noteParser { arg chan, vel, note;
if(vel > 0,
{
//150.do({ arg c; ("cc#" ++ c.asString ++ " = " ++ vr[c]).postln}); //general cc printer, rates are not inverted.
if(noteArrayDX7[chan][note] !== nil, { noteArrayDX7[chan][note].free });
// postln("done free check");
// postln(vr);
// postln(vr[137]);
if(vr[137] == 1, { //lfo sync controller
if(betass == 1, {
// postln("betass == 1");
headno.free;
betass = 1;
headno = Synth.before(novaDX7,\InfEfx, this.defjamHead(0));
},
{
// postln("betass != 1");
betass = 1;
headno = Synth.before(novaDX7, \InfEfx, this.defjamHead(0));
}
)},
{
// postln("not lfo");
if(betass == 0, {
betass = 1;
headno = Synth.before(novaDX7, \InfEfx, this.defjamHead(0)).onFree{
// postln(["freeing", headno]);
};
// postln(headno);
}, {
headno.set(this.defjamHead(0))
});
});
noteArrayDX7[chan][note] = Synth(\DX7, this.defme(note, vel),novaDX7);
//noteArrayDX7[note] = Synth(\DX7 ,defme.value(note, vel), novaDX7); //orjburayi addtotail diye degistirdin
},
{
noteArrayDX7[chan][note].set(\gate,0);
noteArrayDX7[chan][note] = nil;
});
}
note {
arg chan, x, y, z;
if((y > 0) && ( y < numPresets),{
145.do({arg item;
vr[cirklonCCparse[item]] = filedump[(z*145)+item];
});
});
if(noteOnBusy == false, {
noteOnBusy = true;
this.noteParser(chan, y, x);
noteOnBusy = false;
}, {
"bpppppffffff!!!! simultaneous note bug!!!".postln;
});
}
//// thus endes dx7 by cannc <-- all hail
} // THEE ENDE