/[paths]/src/main.c
ViewVC logotype

Diff of /src/main.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 23 by ben, Sat Aug 18 05:56:46 2012 UTC revision 24 by ben, Sat Aug 18 07:43:54 2012 UTC
# Line 40  Line 40 
40  #define error(str) fprintf(stderr, "[error]\t%s\n", str)  #define error(str) fprintf(stderr, "[error]\t%s\n", str)
41    
42  struct jack {  struct jack {
         jack_port_t *output[MAX_INST];  
43          jack_client_t *client;          jack_client_t *client;
44          jack_transport_state_t state;          jack_transport_state_t state;
45  };  };
# Line 49  struct voice { Line 48  struct voice {
48          struct event* route;          struct event* route;
49          int count;          int count;
50          int cur;          int cur;
51          int press;          jack_time_t press;
52  };  };
53    
54  struct instrument {  struct instrument {
55          struct voice voices[MAX_VOICE];          struct voice voices[MAX_VOICE];
56            jack_port_t *out;
57            void* out_buf;
58          int count;          int count;
59          struct graph *graph;          struct graph *graph;
60  };  };
# Line 69  static int jack_process_callback(jack_nf Line 70  static int jack_process_callback(jack_nf
70          struct app *app;          struct app *app;
71          jack_transport_state_t state;          jack_transport_state_t state;
72          jack_nframes_t last_frame_time;          jack_nframes_t last_frame_time;
73          int i, voice;          int i, voice, inst;
74    
75          app = ctx;          app = ctx;
76    
77          if (nframes <= 0)          if (nframes <= 0)
78                  return 0;                  return 0;
79    
80          /* clean all out buffers before writing into them */          /* prepare all out buffers before writing into them */
81            for (i = 0; i < app->count; i++) {
82                    void *port_buf = jack_port_get_buffer(app->instruments[i].out, nframes);
83                    jack_midi_clear_buffer(port_buf);
84                    app->instruments[i].out_buf = port_buf;
85            }
86    
87          /* get transport state, act in consequence */          /* get transport state, act in consequence */
88    
89          /* check end of all voices of all instruments */          /* check end of all voices of all instruments */
90    
91          /* go browse all voice states and send events */          /* go browse all voice states and send events */
92            for (i = 0; i < nframes; i++)
93                    for (inst = 0; inst < app->count; inst++)
94                            for (voice = 0; voice < app->instruments[inst].count; voice++) {
95                                    int *press = &app->instruments[inst].voices[voice].press;
96                                    int *cur = &app->instruments[inst].voices[voice].cur;
97                                    if (*cur >= app->instruments[inst].voices[voice].count)
98                                            continue;
99                                    struct event *ev = &app->instruments[inst].voices[voice].route[*cur];
100                                    unsigned char *buf = jack_midi_event_reserve(app->instruments[inst].out_buf, i, 3);
101                                    jack_time_t now = jack_get_time();
102                                    if (!buf)
103                                            return 0;
104    
105                                    if (*press) { /* note must be released before passing to next event */
106                                            if (*press + ev->duration < now) {
107                                                    buf[2] = ev->velocity;
108                                                    buf[1] = ev->pitch;
109                                                    buf[0] = 0x80;  /* note off */
110                                                    press = 0;      /* release */
111                                                    (*cur)++;       /* go to next node */
112                                                    fprintf(stderr, "off %d (%p)\n", ev->pitch, ev);
113                                            }
114                                    } else { /* this is a new node */
115                                            buf[2] = ev->velocity;
116                                            buf[1] = ev->pitch;
117                                            buf[0] = 0x90;  /* note on */
118                                            *press = now;
119                                            fprintf(stderr, "on %d (%p)\n", ev->pitch, ev);
120                                    }
121                            }
122    
         fprintf(stdout, "%d\n", app->instruments[0].voices[0].route[0].pitch);  
123          return 0;          return 0;
124  }  }
125    
# Line 113  int main (int argc, char *argv[]) Line 151  int main (int argc, char *argv[])
151          struct graph *graph;          struct graph *graph;
152          struct voice voice;          struct voice voice;
153    
154          int err;          int i, err;
155    
156          /* create random graph */          /* create random graph */
157          graph = graph_new(100);          graph = graph_new(100);
# Line 134  int main (int argc, char *argv[]) Line 172  int main (int argc, char *argv[])
172    
173          /* mark it (...) */          /* mark it (...) */
174          app.instruments[0].voices[0].route[0].pitch = 42;          app.instruments[0].voices[0].route[0].pitch = 42;
175            app.instruments[0].voices[0].route[0].duration = 42;
176    
177          /* init jack */          /* init jack */
178          jack.client = jack_client_open(PACKAGE_NAME, JackNullOption, NULL);          jack.client = jack_client_open(PACKAGE_NAME, JackNullOption, NULL);
# Line 158  int main (int argc, char *argv[]) Line 197  int main (int argc, char *argv[])
197    
198          jack_on_shutdown(jack.client, jack_shutdown, &app);          jack_on_shutdown(jack.client, jack_shutdown, &app);
199    
200          /* allocate one jack port (midi out) */          /* allocate one jack port per instrument (midi outs) */
201          jack.output[0] = jack_port_register(jack.client, "out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);          for (i = 0; i < app.count; i++) {
202                    char name[32];
203          if (jack.output[0] == NULL) {                  snprintf(name, 32, "out %d", i);
204                  error("could not register jack midi out port");                  app.instruments[i].out = jack_port_register(jack.client, name, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
205                  exit(EXIT_FAILURE);                  if (app.instruments[i].out == NULL) {
206                            error("could not register a jack midi out port");
207                            exit(EXIT_FAILURE);
208                    }
209          }          }
210    
211          /* activate jack */          /* activate jack */
# Line 173  int main (int argc, char *argv[]) Line 215  int main (int argc, char *argv[])
215          }          }
216    
217          /* start playing (event loop) */          /* start playing (event loop) */
218          sleep(10);          sleep(1);
219                    
220          /* close jack */          /* close jack */
221          jack_client_close (jack.client);          jack_client_close (jack.client);

Legend:
Removed from v.23  
changed lines
  Added in v.24

  ViewVC Help
Powered by ViewVC 1.1.26