#{
# COMMA = TAB
matrix_a = [row-element , row-element , row-element]
# ==> 1 row, 3 columns
# SEMICOLON = RETURN (=CR&LF)
matrix_b = [column-element ; column-element ; column-element]
# ==> 3 rows, 1 column
#---------------------------------------------------------------
a = [1;1;1]
b = [2;2;2]
a = horzcat(a,b) #<<< append matrix 'b' to matrix 'a' horizontally
a = [1,2;1,2;1,2]
#}
pkg load signal;
#octave-multipliers
o2 = 2;
o3 = 4;
o4 = 8;
o5 = 16;
o6 = 32;
o7 = 64;
o8 = 128;
o9 = 256;
#base-frequencies // AKA piano roll
c1 = 32.7032; #first octave
cis1 = des1 = 34.6478; ###
d1 = 36.7081;
dis1 = es1 = 38.8909; ###
e1 = fes1 = 41.2034;
f1 = eis1 = 43.6535;
fis1 = ges1 = 46.2493; ###
g1 = 48.9994;
gis1 = as1 = 51.9131; ###
a1 = 55.0;
b1 = ais1 = 58.2705; ###
h1 = 61.7354;
c2 = o2 * c1 ; #second octave
cis2 = des2 = o2 * cis1 ; ###
d2 = o2 * d1 ;
dis2 = es2 = o2 * dis1 ; ###
e2 = fes2 = o2 * e1 ;
f2 = eis2 = o2 * f1 ;
fis2 = ges2 = o2 * fis1 ; ###
g2 = o2 * g1 ;
gis2 = as2 = o2 * gis1 ; ###
a2 = o2 * a1 ;
b2 = ais2 = o2 * b1 ; ###
h2 = o2 * h1 ;
c3 = o3 * c1 ; #third octave
cis3 = des3 = o3 * cis1 ; ###
d3 = o3 * d1 ;
dis3 = es3 = o3 * dis1 ; ###
e3 = fes3 = o3 * e1 ;
f3 = eis3 = o3 * f1 ;
fis3 = ges3 = o3 * fis1 ; ###
g3 = o3 * g1 ;
gis3 = as3 = o3 * gis1 ; ###
a3 = o3 * a1 ;
b3 = ais3 = o3 * b1 ; ###
h3 = o3 * h1 ; #fourth octave
c4 = o4 * c1 ;
cis4 = des4 = o4 * cis1 ; ###
d4 = o4 * d1 ;
dis4 = es4 = o4 * dis1 ; ###
e4 = fes4 = o4 * e1 ;
f4 = eis4 = o4 * f1 ;
fis4 = ges4 = o4 * fis1 ; ###
g4 = o4 * g1 ;
gis4 = as4 = o4 * gis1 ; ###
a4 = o4 * a1 ;
b4 = ais4 = o4 * b1 ; ###
h4 = o4 * h1 ; #fifth octave
c5 = o5 * c1 ;
cis5 = des5 = o5 * cis1 ; ###
d5 = o5 * d1 ;
dis5 = es5 = o5 * dis1 ; ###
e5 = fes5 = o5 * e1 ;
f5 = eis5 = o5 * f1 ;
fis5 = ges5 = o5 * fis1 ; ###
g5 = o5 * g1 ;
gis5 = as5 = o5 * gis1 ; ###
a5 = o5 * a1 ;
b5 = ais5 = o5 * b1 ; ###
h5 = o5 * h1 ;
c6 = o6 * c1 ; #sixth octave
cis6 = des6 = o6 * cis1 ; ###
d6 = o6 * d1 ;
dis6 = es6 = o6 * dis1 ; ###
e6 = fes6 = o6 * e1 ;
f6 = eis6 = o6 * f1 ;
fis6 = ges6 = o6 * fis1 ; ###
g6 = o6 * g1 ;
gis6 = as6 = o6 * gis1 ; ###
a6 = o6 * a1 ;
b6 = ais6 = o6 * b1 ; ###
h6 = o6 * h1 ;
c7 = o7 * c1 ; #seventh octave
cis7 = des7 = o7 * cis1 ; ###
d7 = o7 * d1 ;
dis7 = es7 = o7 * dis1 ; ###
e7 = fes7 = o7 * e1 ;
f7 = eis7 = o7 * f1 ;
fis7 = ges7 = o7 * fis1 ; ###
g7 = o7 * g1 ;
gis7 = as7 = o7 * gis1 ; ###
a7 = o7 * a1 ;
b7 = ais7 = o7 * b1 ; ###
h7 = o7 * h1 ;
c8 = o8 * c1 ; #eighth octave
cis8 = des8 = o8 * cis1 ; ###
d8 = o8 * d1 ;
dis8 = es8 = o8 * dis1 ; ###
e8 = fes8 = o8 * e1 ;
f8 = eis8 = o8 * f1 ;
fis8 = ges8 = o8 * fis1 ; ###
g8 = o8 * g1 ;
gis8 = as8 = o8 * gis1 ; ###
a8 = o8 * a1 ;
b8 = ais8 = o8 * b1 ; ###
h8 = o8 * h1 ;
c9 = o9 * c1 ; #ninth octave
cis9 = des9 = o9 * cis1 ; ###
d9 = o9 * d1 ;
dis9 = es9 = o9 * dis1 ; ###
e9 = fes9 = o9 * e1 ;
f9 = eis9 = o9 * f1 ;
fis9 = ges9 = o9 * fis1 ; ###
g9 = o9 * g1 ;
gis9 = as9 = o9 * gis1 ; ###
a9 = o9 * a1 ;
b9 = ais9 = o9 * b1 ; ###
h9 = o9 * h1 ;
# ------------------
bps = 16; % bits per sample
sps = 44100; % sample rate [samples/s]
#freq = 1; % frequency of the tone [Hz]
nsecs = 240; % number of seconds of the audio file
nsamples = sps*nsecs;
# linspace(lower limit, upper limit, number of steps between limits);
# hier konkret:
# linspace(0, 240, 240*44100);
time = linspace(0, nsecs, nsamples);
#{
working function-generators:
chirp (t) #<--- WEIRD!
sawtooth(t)
square(t)
sin(t)
#}
#12 OSC - Madness - try 240 seconds!
#{}
thenote = a1;
wave = sawtooth(time * 2 * pi * thenote * 1.0000 )';
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0106 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0059 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0027 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0102 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0045 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0013 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0110 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * thenote * 1.0063 )');
wave = horzcat(wave, sin(time * 2 * pi * thenote * 1.0163 )');
wave = horzcat(wave, sin(time * 2 * pi * thenote * 1.0073 )');
wave = horzcat(wave, sin(time * 2 * pi * thenote * 1.003 )');
#}
#SQUARE
#{
wave = square(time * 2 * pi * h3 )';
wave = horzcat(wave, square(time * 2 * pi * d4 )');
wave = horzcat(wave, square(time * 2 * pi * fis4 )');
wave = horzcat(wave, square(time * 2 * pi * h4 )');
#}
#SAWTOOTH
#{
wave = sawtooth(time * 2 * pi * h3 )';
wave = horzcat(wave, sawtooth(time * 2 * pi * d4 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * fis4 )');
wave = horzcat(wave, sawtooth(time * 2 * pi * h4 )');
#}
#SINE
#{
wave = sin(time * 2 * pi * h3 )';
wave = horzcat(wave, sin(time * 2 * pi * d4 )');
wave = horzcat(wave, sin(time * 2 * pi * fis4 )');
wave = horzcat(wave, sin(time * 2 * pi * h4 )');
wave = horzcat(wave, sin(time * 2 * pi * h4 )');
wave = horzcat(wave, sin(time * 2 * pi * b3 )');
wave = horzcat(wave, sin(time * 2 * pi * cis3 )');
#}
#create complex waveform: add all columns horizontally into a sum-matrixsum (= (wave, 2) )
#volume compensation: divide by count of OSCs (= columns(wave) )
wave_sum = sum(wave, 2)/columns(wave);
% create the amplitude window (creates the fade in and fade out when multiplied with the sine wave)
# a = b = floor(.3*nsamples);
# window = [linspace(0,1,a), ones(1,nsamples-a-b), linspace(1,0,b)]';
#use a window-function from the signal pkg instead!
window = blackmanharris(rows(wave_sum));
#{
sound(dot(wave_sum, window, 2),sps,bps);
/|\
|
EQUIVALENT!
|
\|/
sound(wave_sum .* window,sps,bps);
#}
#AUDIO FILE SAVE!
#audiowrite('.\supersaw.wav', wave_sum .* window, sps);
#AUDIO OUTPUTS!
sound(dot(wave_sum, window, 2),sps,bps);
#sound(wave_sum .* window,sps,bps);
#sound(wave_sum,sps,bps);