-
Notifications
You must be signed in to change notification settings - Fork 0
/
DSP_filter.rtf
106 lines (105 loc) · 3.86 KB
/
DSP_filter.rtf
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
{\fonttbl\f0\fnil\fcharset0 Monaco;}
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red0\green0\blue191;\red191\green0\blue0;
\red96\green96\blue96;}
\deftab560
\pard\pardeftab560\ql\qnatural
\f0\fs42 \cf2 (\
\cf3 var\cf2 file,data; \
\cf3 var\cf2 freq= 441; \cf4 //this task is easier if freq is 441 \cf2 \
\cf3 var\cf2 sr=44100; \cf4 //sample rate\cf2 \
\cf3 var\cf2 period = sr/freq; \cf4 //period in samples \cf2 \
\cf3 var\cf2 halfperiod= period*0.5; \
\cf3 var\cf2 numvoices = 10; \cf4 //number of wavetables\cf2 \
\cf3 var\cf2 phase= 0.0!numvoices; \cf4 //the phase\cf2 \
\cf3 var\cf2 phaseincrement= \{1.0/period\}!numvoices; \cf4 //period in samples,changes freq \cf2 \
\cf3 var\cf2 wavetable = \cf3 nil\cf2 .dup(numvoices); \cf4 //array of wavetables \cf2 \
\cf3 var\cf2 tune = \cf3 nil\cf2 .dup(numvoices); \cf4 //array to hold musical generative compositional parameters \cf2 \
\cf3 var\cf2 xv = 0.0!7; \cf4 //set to 0, 7 values, array for filter to use\cf2 \
\cf3 var\cf2 yv = 0.0!7; \cf4 //set to 0, 7 values, array for filter to use\cf2 \
\
\cf4 //array of wavetables containing 256 samples containing white noise \cf2 \
wavetable = \cf3 Array\cf2 .fill(numvoices,\{ \cf3 Array\cf2 .fill(256,\{ rrand(-1.0,1.0)\}); \}); \
\
\cf4 //putting musical elements inside the wave tables, randomly selects number of notes, time in which notes change and randomly selects midi notes between C2 and C6.\cf2 \
tune = \cf3 Array\cf2 .fill(numvoices,\{ \
\
\cf3 Array\cf2 .fill(rrand(10,20),\{[rrand(0.0,20.0),rrand(36,84)]\});\
\
\}); \
\
\
\cf4 //coverts to sample rate\cf2 \
tune = tune.collect\{\cf3 |val|\cf2 val.collect\{\cf3 |note|\cf2 [(note[0]*sr).asInteger,note[1]] \}; \}; \
\
\cf4 //makes a 16bit mono wav file\cf2 \
file = \cf3 SoundFile\cf2 .new.headerFormat_(\cf5 "WAV"\cf2 ).sampleFormat_(\cf5 "int16"\cf2 ).numChannels_(1).sampleRate_(sr);\
\
\cf4 //change the file path here\cf2 \
file.openWrite(\cf5 "/Users/fox/Desktop/writetestg.wav"\cf2 );\
\
\cf4 //Incrementing through the array. prevpos=current position, prevpos=floor(lowest possible value), next pos tells it to add 1 to the sample and wraps around using the modulo. \cf2 \
data = \cf3 Signal\cf2 .fill(sr*20, \{\cf3 |i|\cf2 \
\cf3 var\cf2 output = 0.0; \
\cf3 var\cf2 posnow, prevpos, nextpos, t; \
\
\
numvoices.do \{\cf3 |j|\cf2 \
\pard\pardeftab720\ql\qnatural
\cf2 \
\pard\pardeftab560\ql\qnatural
\cf2 posnow= phase[j]*256; \
prevpos= posnow.floor; \
nextpos= (prevpos+1)%256;\
\
\cf4 //index the tune array and apply to correct line, making sure it matches up to wavetable position\cf2 \
tune[j].do\{\cf3 |note|\cf2 if(note[0]==i,\{ phaseincrement[j] = note[1]/sr; \}); \}; \
\
t= posnow-prevpos; \cf4 //interpolation position \cf2 \
\
\
\
\cf4 //Interpolation equation\cf2 \
output= output + (((1-t)*wavetable[j][prevpos]) + (t*wavetable[j][nextpos])); \
\
phase[j] = phase[j] + phaseincrement[j]; \
\
if(phase[j]>=1.0) \{\
\
phase[j] = phase[j]%1.0;\
\
\};\
\
\};\
\
\
\pard\pardeftab720\ql\qnatural
\cf2 \
\pard\pardeftab560\ql\qnatural
\cf2 output = output/numvoices;\
\pard\pardeftab720\ql\qnatural
\cf2 \
\
\pard\pardeftab560\ql\qnatural
\cf4 //Butterworth(flat freq response) low pass filter,corners set to 400,1000, number of poles=5\cf2 \
\pard\pardeftab720\ql\qnatural
\cf2 xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4]; xv[4] = xv[5]; \
xv[5] = output/8.025238577e+06; \cf4 //gain\cf2 \
yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4]; yv[4] = yv[5]; \
yv[5] = (xv[0] + xv[5]) + (5 * (xv[1] + xv[4])) + (10 * (xv[2] + xv[3])) + (0.7582507704 * yv[0]) + (-4.0009954267 * yv[1])+ (8.4507749887 * yv[2]) + (-8.9314219076 * yv[3]) + (4.7233875877 * yv[4]);\
output = yv[5];\
\
\
\pard\pardeftab720\ql\qnatural
\cf4 //filtered output \cf2 \
output\
\pard\pardeftab560\ql\qnatural
\cf2 \});\
\
file.writeData(data);\
file.close;\
)\
\
\
\
}