root/syre/trunk/main.c

Revision 573, 12.5 kB (checked in by conrad, 7 months ago)

fix compile errors (from GCC updates over past 10 years ;-)

Line 
1 /*#define _USE_SIGNAL*/
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <time.h>
6 #include <unistd.h>
7 #include <X11/Xlib.h>
8
9 #ifdef _USE_SIGNAL
10 #include <signal.h>
11 #include <sys/time.h>
12 #endif
13
14 #include "syre.h"
15
16 #define FPS 10
17 #define FRAMETIME 1000000/FPS
18
19 #define NUM_OVERTONES 16
20
21 Display *disp;
22 Window Root;
23 Window win;
24 Visual *vis;
25 int scr;
26 unsigned int depth;
27 GC fg,bg;
28 int blk,wht;
29 int width,height;
30
31 extern double note_rates[96];
32
33 extern int dev_dsp;
34 extern bit16 sinwave[1024];
35
36 bit16 playbuffer16[2*PLAYBACK_FREQ]; /* one second of sound... */
37 bit32 waveform[1024];
38
39 int sequence[16];
40
41 int playlength=2*PLAYBACK_FREQ; /* length of playbuffer */
42 int vol=48 /* 0-64 */, pan=16, lpan=16, rpan=16; /* 0-32 */
43 int attack=16, release=48; /* 0-64 , attack<=release */
44 int portamento=0; /* 0-64 */
45 int bpm4=142*4; /* 4 * beats per minute */
46 int seqi=0; /* sequence index */
47 int ci=0; /* chaos index :) */
48 int beat; /* number of sample values per beat */
49 int playing=0; /* boolean */
50 int last_space=0; /* boolean (for on/off toggle) */
51
52 typedef struct {
53    int si,r;
54    int vol;
55 } harmonic;
56
57 harmonic overtones[NUM_OVERTONES];
58
59 #ifdef _USE_SIGNAL
60 void handler_alarm(int sig)
61 {   
62    struct itimerval itv;
63 #else
64 void tick(void)
65 {
66 #endif
67    XEvent report;
68    Window proot, pchild;
69    int rootx, rooty, winx, winy;
70    unsigned int keys_buttons;
71    int dx, dy;
72    char keys[32];
73    unsigned int i, j, k;
74    int rate;
75    bit32 di[2];
76    bit32 d;
77    int wi;
78    int attack_sub, release_sub; /* subscripts (indices) of
79                                * attack end, release start
80                                */
81    int attack_delta, release_delta;
82    int envelope=0;
83    int port_sub, port_delta, port_val;
84    
85 #ifdef _USE_SIGNAL
86    signal(sig, handler_alarm);
87 #endif
88    
89    XQueryKeymap(disp, keys);
90
91 /*
92     for(i=0; i<32; i++) {
93        for(j=0; j<8; j++) {
94           if(keys[i]&(1<<j)) {
95              fprintf(stderr, "Key %d pressed [%d,%d]\n", i*8 + j, i, j);
96           }
97        }
98     }
99 */
100
101
102 #ifdef KEYNOTES
103    if(keys[3]&1) {
104       playing=1;
105       rate=123;
106    }
107    /* Y ==> 'A' */
108    else if(keys[3]&(1<<5)) {
109       playing=1;
110       rate=220;
111    }
112    
113    else {
114       playing=0;
115    }
116 #endif
117
118    /* Enter chaos */
119    if(keys[4]&(1<<4)) /* ENTER */{
120       chaos();
121 /*      chaos_harmonics();*/
122    }
123    if(keys[7]&(1<<6)) /* RIGHT SHIFT */{
124       chaos_harmonics();
125    }
126    if(keys[6]&(1<<2)) /* LEFT SHIFT */{
127       clear_harmonics();
128    }
129    
130    /* ON/OFF */
131    if(!last_space && (keys[8]&(1<<1))) {
132       playing=1-playing;
133       last_space=1;
134    }
135    else if(last_space && (!(keys[8]&(1<<1)))) {
136       last_space=0;
137    }
138    
139    
140    /* BPM */
141    if(keys[2]&(1<<4)) {
142       bpm4--; if(bpm4<120) bpm4=120;
143    }
144    else if(keys[2]&(1<<5)) {
145       bpm4++; if(bpm4>960) bpm4=960;
146    }
147    else if(keys[4]&(1<<2)) {
148       bpm4-=4; if(bpm4<120) bpm4=120;
149    }
150    else if(keys[4]&(1<<3)) {
151       bpm4+=4; if(bpm4>960) bpm4=960;
152    }
153    beat =60*PLAYBACK_FREQ/bpm4; /* samples per beat */
154
155    
156    /* VOL */
157    if(keys[12]&(1<<2)) /* UP ARROW */{
158       vol++; if(vol>64) vol=64;
159    }
160    else if(keys[13]&1) /* DOWN ARROW */{
161       vol--; if(vol<0) vol=0;
162    }
163
164    /* PAN */
165    if(keys[12]&(1<<4)) /* LEFT ARROW */{
166       pan--; if(pan<0) pan=0;
167       if(pan<=16) {
168          lpan=pan; rpan=16;
169       }
170       else {
171          lpan=16; rpan=31-pan;
172       }
173      
174    }
175    else if(keys[12]&(1<<6)) /* RIGHT ARROW */{
176       pan++; if(pan>31) pan=31;
177       if(pan<=16) {
178          lpan=pan; rpan=16;
179       }
180       else {
181          lpan=16; rpan=31-pan;
182       }
183    }
184
185    /* ENVELOPE */
186    if(keys[7]*(1<<4)) /* .> */{
187       attack--; if(attack<0) attack=0;
188    }
189    else if(keys[5]&(1<<6)) /* L */{
190       attack++; if(attack>63) attack=63;
191       if(attack>release) release=attack;
192    }
193    if(keys[7]*(1<<5)) /* / */{
194       release++; if(release>63) release=63;
195    }
196    else if(keys[5]&(1<<7)) /* ; */{
197       release--; if(release<0) release=0;
198       if(release<attack) attack=release;
199    }
200
201    /* PORTAMENTO */
202    if(keys[2]*(1<<3)) /* 0 */{
203       portamento++; if(portamento>63) portamento=63;
204    }
205    else if(keys[4]&(1<<1)) /* P */{
206       portamento--; if(portamento<0) portamento=0;
207    }
208    
209    /* harmonics */
210    if(keys[4]&(1<<6)) {
211       overtones[0].vol++; if(overtones[0].vol>32) overtones[0].vol=32;
212    }
213    else if(keys[6]&(1<<4)) {
214       overtones[0].vol--; if(overtones[0].vol<0) overtones[0].vol=0;
215    }
216    if(keys[4]&(1<<7)) {
217       overtones[1].vol++; if(overtones[1].vol>32) overtones[1].vol=32;
218    }
219    else if(keys[6]&(1<<5)) {
220       overtones[1].vol--; if(overtones[1].vol<0) overtones[1].vol=0;
221    }
222    if(keys[5]&(1)) {
223       overtones[2].vol++; if(overtones[2].vol>32) overtones[2].vol=32;
224    }
225    else if(keys[6]&(1<<6)) {
226       overtones[2].vol--; if(overtones[2].vol<0) overtones[2].vol=0;
227    }
228    if(keys[5]&(1<<1)) {
229       overtones[3].vol++; if(overtones[3].vol>32) overtones[3].vol=32;
230    }
231    else if(keys[6]&(1<<7)) {
232       overtones[3].vol--; if(overtones[3].vol<0) overtones[3].vol=0;
233    }
234    if(keys[5]&(1<<2)) {
235       overtones[4].vol++; if(overtones[4].vol>32) overtones[4].vol=32;
236    }
237    else if(keys[7]&(1)) {
238       overtones[4].vol--; if(overtones[4].vol<0) overtones[4].vol=0;
239    }
240    if(keys[5]&(1<<3)) {
241       overtones[5].vol++; if(overtones[5].vol>32) overtones[5].vol=32;
242    }
243    else if(keys[7]&(1<<1)) {
244       overtones[5].vol--; if(overtones[5].vol<0) overtones[5].vol=0;
245    }
246    if(keys[5]&(1<<4)) {
247       overtones[6].vol++; if(overtones[6].vol>32) overtones[6].vol=32;
248    }
249    else if(keys[7]&(1<<2)) {
250       overtones[6].vol--; if(overtones[6].vol<0) overtones[6].vol=0;
251    }
252    if(keys[5]&(1<<5)) {
253       overtones[7].vol++; if(overtones[7].vol>32) overtones[7].vol=32;
254    }
255    else if(keys[7]&(1<<3)) {
256       overtones[7].vol--; if(overtones[7].vol<0) overtones[7].vol=0;
257    }
258
259    if(keys[1]&(1<<2)) {
260       overtones[8].vol++; if(overtones[8].vol>32) overtones[8].vol=32;
261    }
262    else if(keys[3]&(1)) {
263       overtones[8].vol--; if(overtones[8].vol<0) overtones[8].vol=0;
264    }
265    if(keys[1]&(1<<3)) {
266       overtones[9].vol++; if(overtones[9].vol>32) overtones[9].vol=32;
267    }
268    else if(keys[3]&(1<<1)) {
269       overtones[9].vol--; if(overtones[9].vol<0) overtones[9].vol=0;
270    }
271    if(keys[1]&(1<<4)) {
272       overtones[10].vol++; if(overtones[10].vol>32) overtones[10].vol=32;
273    }
274    else if(keys[3]&(1<<2)) {
275       overtones[10].vol--; if(overtones[10].vol<0) overtones[10].vol=0;
276    }
277    if(keys[1]&(1<<5)) {
278       overtones[11].vol++; if(overtones[11].vol>32) overtones[11].vol=32;
279    }
280    else if(keys[3]&(1<<3)) {
281       overtones[11].vol--; if(overtones[11].vol<0) overtones[11].vol=0;
282    }
283    if(keys[1]&(1<<6)) {
284       overtones[12].vol++; if(overtones[12].vol>32) overtones[12].vol=32;
285    }
286    else if(keys[3]&(1<<4)) {
287       overtones[12].vol--; if(overtones[12].vol<0) overtones[12].vol=0;
288    }
289    if(keys[1]&(1<<3)) {
290       overtones[13].vol++; if(overtones[13].vol>32) overtones[13].vol=32;
291    }
292    else if(keys[3]&(1<<5)) {
293       overtones[13].vol--; if(overtones[13].vol<0) overtones[13].vol=0;
294    }
295    if(keys[2]&(1)) {
296       overtones[14].vol++; if(overtones[14].vol>32) overtones[14].vol=32;
297    }
298    else if(keys[3]&(1<<6)) {
299       overtones[14].vol--; if(overtones[14].vol<0) overtones[14].vol=0;
300    }
301    if(keys[2]&(1<<1)) {
302       overtones[15].vol++; if(overtones[15].vol>32) overtones[15].vol=32;
303    }
304    else if(keys[3]&(1<<7)) {
305       overtones[15].vol--; if(overtones[15].vol<0) overtones[15].vol=0;
306    }
307
308 /*   overtones[0].r= sequence[seqi]*1024/(2*PLAYBACK_FREQ);*/
309
310    /* ======> MOVE OUT OF LOOP!!!!!!! */
311    overtones[0].r= 123*1024/(2*PLAYBACK_FREQ);
312    for(i=1; i<16; i++) {
313       overtones[i].r = overtones[0].r * (i+1);
314    }
315
316    /* CALCULATE WAVEFORM */
317    for(i=0; i<1024; i++) {
318       d=0;
319       for(j=0; j<16; j++) {
320          d+= (sinwave[overtones[j].si] * overtones[j].vol)>>5;
321 /*       d+= overtones[j].vol;*/
322          overtones[j].si += overtones[j].r;
323          overtones[j].si &= 1023;
324       }
325       waveform[i]=d;
326    }
327    
328    /* CALCULATE ENVELOPE */
329    attack_sub = (beat*2*attack)>>6;
330    release_sub = (beat*2*release)>>6;
331    if(attack_sub) attack_delta = 32768/attack_sub;
332    if((beat<<1)-release_sub) release_delta = 32768/((beat<<1)-release_sub);
333
334    if(attack) envelope=0;
335    else envelope=32768;
336    
337    /* CALCULATE PORTAMENTO */
338    port_sub = ((beat)*2*portamento)>>6;
339    if(port_sub) port_delta = 32768/(port_sub);
340
341    if(portamento) port_val=0;
342    else port_val=32768;
343    
344    if(playing) {
345       wi=0;
346       /* ATTACK */
347 /*      for(i=0; i<attack_sub; i+=2) {*/
348       for(i=0; i<beat*2; i+=2) {
349          playbuffer16[i] = (bit16)((waveform[wi>>6]*lpan*vol)>>11);
350 /*       playbuffer16[i+1] = (bit16)((waveform[wi++]*rpan*vol)>>11);*/
351          playbuffer16[i+1] = (bit16)((waveform[wi>>6]*rpan*vol)>>11);
352 /*       wi += sequence[seqi];*/
353          if(i<port_sub) {
354             wi +=
355               (port_val*sequence[seqi] +
356                (32768-port_val)*sequence[(seqi+15)%16])>>15;
357             port_val += port_delta;
358          }
359          else
360            wi += sequence[seqi];
361          
362          wi &= (1<<16)-1;
363          
364 #ifdef RECALC_WAVE
365          if(!(wi%=1024)) {
366             d=0;
367             for(j=0; j<16; j++) {
368                d+= (sinwave[overtones[j].si] * overtones[j].vol)>>5;
369                if(i<port_sub) {
370                   overtones[j].si +=
371                     (port_val*overtones[j].r +
372                      (32768-port_val)*overtones[(j-1)%16].r)>>15;
373                   port_val += port_delta;
374                }
375 #ifdef INPORT
376                else if(i>(beat*2 - port_sub)) {
377                  overtones[j].si +=
378                  (port_val*overtones[j].r +
379                   (32768-port_val)*overtones[(j+1)%16].r)>>15;
380                   port_val -= port_delta;
381                }
382 #endif
383                else
384                  overtones[j].si += overtones[j].r;
385                
386                overtones[j].si &= 1023;
387             }
388             waveform[i]=d;
389          }
390 /*          playbuffer16[i] = (bit16)((d*lpan*vol)>>11);*/
391 /*          playbuffer16[i+1] = (bit16)((d*rpan*vol)>>11);*/
392 #ifdef RAD
393
394          wi %= 1024;
395 #endif
396 #endif /* RECALC_WAVE */         
397          playbuffer16[i] = (bit16)((playbuffer16[i]*envelope)>>15);
398          playbuffer16[i+1] = (bit16)((playbuffer16[i+1]*envelope)>>15);
399          if(i<attack_sub) envelope+=(attack_delta<<1);
400          else if(i>release_sub) envelope-=(release_delta<<1);
401       }
402 #ifdef CRAP
403       /* SUSTAIN */
404       for(; i<release_sub; i+=2) {
405          playbuffer16[i] = (bit16)((waveform[wi]*lpan*vol)>>11);
406          playbuffer16[i+1] = (bit16)((waveform[wi++]*rpan*vol)>>11);
407          if(!(wi%=1024)) {
408             d=0;
409             for(j=0; j<16; j++) {
410                d+= (sinwave[overtones[j].si] * overtones[j].vol)>>5;
411                overtones[j].si += overtones[j].r;
412                overtones[j].si &= 1023;
413             }
414             waveform[i] = d;
415          }
416 #ifdef RAD
417          wi %= 1024;
418 #endif
419       }
420       /* RELEASE */
421       for(; i<(beat*2); i+=2) {
422          playbuffer16[i] = (bit16)((waveform[wi]*lpan*vol)>>11);
423          playbuffer16[i+1] = (bit16)((waveform[wi++]*rpan*vol)>>11);
424          if(!(wi%=1024)) {
425             d=0;
426             for(j=0; j<16; j++) {
427                d+= (sinwave[overtones[j].si] * overtones[j].vol)>>5;
428                overtones[j].si += overtones[j].r;
429                overtones[j].si &= 1023;
430             }
431             waveform[i] = d;
432          }
433          
434 #ifdef RAD
435          wi %= 1024;
436 #endif
437          playbuffer16[i] = (bit16)((playbuffer16[i]*envelope)>>15);
438          playbuffer16[i+1] = (bit16)((playbuffer16[i+1]*envelope)>>15);
439          envelope-=(release_delta<<1);
440       }
441 #endif /* CRAP */
442    }
443    
444    else {
445       for(i=0; i<playlength; i+=2) {
446          playbuffer16[i]=0;
447          playbuffer16[i+1]=0;
448       }
449    }
450    
451    
452    write(dev_dsp, playbuffer16, (size_t)(beat<<2));
453      
454    seqi++;
455    seqi%=16;
456    
457 /*
458    XQueryPointer(disp, win, &proot, &pchild,
459                  &rootx, &rooty, &winx, &winy, &keys_buttons);
460    
461    dx= winx-lx; dy= winy-ly;
462      
463    lx=winx; ly=winy;
464 */   
465
466 }
467
468
469 main(int argc, char **argv)
470
471    int i;
472    Pixmap omap,freshmap;
473 #ifdef _USE_SIGNAL
474    struct itimerval itv;
475 #endif
476    
477    srandom(time(NULL));
478
479    SetupDisplay();   
480
481    open_dev_dsp();
482
483    generate_sinwave();
484
485    chaos_harmonics();
486    
487    chaos();
488    
489    width=640;
490    height=480;
491
492    OpenWindow();
493 /*   win=Root;*/
494    
495 /*   SetupColormap();*/
496    
497    freshmap=XCreatePixmap(disp, win, width, height, depth);
498
499    for(i=0; i<playlength; i++) {
500       playbuffer16[i++]=playbuffer16[i]=(short)0;
501    }
502    write(dev_dsp, playbuffer16, (size_t)(playlength<<1));
503    
504 #ifdef _USE_SIGNAL
505    fprintf(stderr, "Using signals for timing...\n");
506
507    signal(SIGALRM, handler_alarm);
508    
509    itv.it_interval.tv_usec = FRAMETIME/32;
510    itv.it_interval.tv_sec = 0;
511    itv.it_value.tv_usec = FRAMETIME/32;
512    itv.it_value.tv_sec = 0;
513    
514    setitimer(ITIMER_REAL, &itv, (struct itimerval *)0);   
515    
516    
517    for(;;);
518
519 #else
520 /*   fprintf(stderr, "Using loop for timing\n");*/
521    
522    for(;;) {
523       tick();
524 /*      usleep(1000);*/
525 /*      usleep(FRAMETIME);*/
526    }
527 #endif
528    
529 #ifdef CRAP
530      {
531       XNextEvent(disp, &report);
532      
533       switch(report.type) {
534        case ButtonPress:
535          break;
536        case MotionNotify:
537          break;
538        case ButtonRelease:
539 #ifdef PROF
540          exit(0);
541 #endif
542          break;
543        default:
544          break;
545       }
546      
547      
548 /*      XFlush(disp);*/
549      
550 /*      usleep(1000000/30);*/
551      }
552 #endif /* CRAP */
553    
554 }
Note: See TracBrowser for help on using the browser.