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

Diff of /src/main.c

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

revision 24 by ben, Sat Aug 18 07:43:54 2012 UTC revision 25 by ben, Sat Aug 18 08:47:41 2012 UTC
# Line 53  struct voice { Line 53  struct voice {
53    
54  struct instrument {  struct instrument {
55          struct voice voices[MAX_VOICE];          struct voice voices[MAX_VOICE];
56            int count;
57            int end;
58    
59          jack_port_t *out;          jack_port_t *out;
60          void* out_buf;          void* out_buf;
61          int count;  
62          struct graph *graph;          struct graph *graph;
63  };  };
64    
65  struct app {  struct app {
66          struct instrument* instruments;          struct instrument* instruments;
67          int count;          int count;
68            int end;
69    
70          struct jack *jack;          struct jack *jack;
71  };  };
72    
# Line 69  static int jack_process_callback(jack_nf Line 74  static int jack_process_callback(jack_nf
74  {  {
75          struct app *app;          struct app *app;
76          jack_transport_state_t state;          jack_transport_state_t state;
         jack_nframes_t last_frame_time;  
77          int i, voice, inst;          int i, voice, inst;
78    
79          app = ctx;          app = ctx;
80    
81          if (nframes <= 0)          if (nframes <= 0) {
82                    error("called process w/o frames");
83                  return 0;                  return 0;
84            }
85    
86          /* prepare all out buffers before writing into them */          /* prepare all out buffers before writing into them */
87          for (i = 0; i < app->count; i++) {          for (i = 0; i < app->count; i++) {
# Line 87  static int jack_process_callback(jack_nf Line 93  static int jack_process_callback(jack_nf
93          /* get transport state, act in consequence */          /* get transport state, act in consequence */
94    
95          /* check end of all voices of all instruments */          /* check end of all voices of all instruments */
96            if (app->end >= app->count)
97                    return 0;
98    
99          /* go browse all voice states and send events */          /* go browse all voice states and send events */
100          for (i = 0; i < nframes; i++)          for (i = 0; i < nframes; i++) {
101                  for (inst = 0; inst < app->count; inst++)                  if (app->end >= app->count) {
102                            fprintf(stderr, "tune ended (%d instruments)\n", app->end);
103                            return 0;
104                    }
105                    for (inst = 0; inst < app->count; inst++) {
106                            if (app->instruments[inst].end >= app->instruments[inst].count) {
107                                    app->end++;
108                                    fprintf(stderr, "instrument %d ended (%d voices)\n", inst, app->instruments[inst].end);
109                                    continue;
110                            }
111                          for (voice = 0; voice < app->instruments[inst].count; voice++) {                          for (voice = 0; voice < app->instruments[inst].count; voice++) {
112                                  int *press = &app->instruments[inst].voices[voice].press;                                  jack_time_t *press = &app->instruments[inst].voices[voice].press;
113                                  int *cur = &app->instruments[inst].voices[voice].cur;                                  int *cur = &app->instruments[inst].voices[voice].cur;
114                                  if (*cur >= app->instruments[inst].voices[voice].count)                                  if (*cur >= app->instruments[inst].voices[voice].count) {
115                                            app->instruments[inst].end++;
116                                            fprintf(stderr, "voice %d ended (%d notes)\n", voice, *cur);
117                                          continue;                                          continue;
118                                    }
119                                  struct event *ev = &app->instruments[inst].voices[voice].route[*cur];                                  struct event *ev = &app->instruments[inst].voices[voice].route[*cur];
120                                  unsigned char *buf = jack_midi_event_reserve(app->instruments[inst].out_buf, i, 3);                                  unsigned char *buf = jack_midi_event_reserve(app->instruments[inst].out_buf, i, 3);
121                                  jack_time_t now = jack_get_time();                                  if (!buf) {
122                                  if (!buf)                                          error("no memory, note lost");
123                                          return 0;                                          return 0;
124                                    }
125    
126                                  if (*press) { /* note must be released before passing to next event */                                  jack_time_t now = jack_get_time();
127    
128                                    if (*press) { /* note must be released before passing to next note */
129                                          if (*press + ev->duration < now) {                                          if (*press + ev->duration < now) {
130                                                  buf[2] = ev->velocity;                                                  buf[2] = ev->velocity;
131                                                  buf[1] = ev->pitch;                                                  buf[1] = ev->pitch;
# Line 111  static int jack_process_callback(jack_nf Line 134  static int jack_process_callback(jack_nf
134                                                  (*cur)++;       /* go to next node */                                                  (*cur)++;       /* go to next node */
135                                                  fprintf(stderr, "off %d (%p)\n", ev->pitch, ev);                                                  fprintf(stderr, "off %d (%p)\n", ev->pitch, ev);
136                                          }                                          }
137                                  } else { /* this is a new node */                                  } else { /* this is a new note */
138                                          buf[2] = ev->velocity;                                          buf[2] = ev->velocity;
139                                          buf[1] = ev->pitch;                                          buf[1] = ev->pitch;
140                                          buf[0] = 0x90;  /* note on */                                          buf[0] = 0x90;  /* note on */
# Line 119  static int jack_process_callback(jack_nf Line 142  static int jack_process_callback(jack_nf
142                                          fprintf(stderr, "on %d (%p)\n", ev->pitch, ev);                                          fprintf(stderr, "on %d (%p)\n", ev->pitch, ev);
143                                  }                                  }
144                          }                          }
145                    }
146            }
147    
148          return 0;          return 0;
149  }  }
# Line 145  void jack_shutdown(void* ctx) Line 170  void jack_shutdown(void* ctx)
170    
171  int main (int argc, char *argv[])  int main (int argc, char *argv[])
172  {  {
         struct app app;  
         struct jack jack;  
         struct instrument instrument;  
173          struct graph *graph;          struct graph *graph;
174            struct instrument instrument;
175          struct voice voice;          struct voice voice;
176            struct jack jack;
177            struct app app;
178    
179          int i, err;          int i, err;
180    
# Line 157  int main (int argc, char *argv[]) Line 182  int main (int argc, char *argv[])
182          graph = graph_new(100);          graph = graph_new(100);
183          graph_randomize2(graph, 3);          graph_randomize2(graph, 3);
184    
185          /* initialize solo instrument */          /* initialize a solo instrument */
186          memset(&instrument, 0, sizeof(instrument));          memset(&instrument, 0, sizeof(instrument));
187          instrument.graph = graph;          instrument.graph = graph;
188    
189            /* initialize application context */
190            memset(&app, 0, sizeof(app));
191          app.jack = &jack;          app.jack = &jack;
192          app.instruments = &instrument;          app.instruments = &instrument;
193          app.count = 1;          app.count = 1;
194    
195          /* create a random route (lol) */          /* create a random route (lol) */
196            memset(&voice, 0, sizeof(voice));
197          voice.route = &graph->nodes[0].event;          voice.route = &graph->nodes[0].event;
198          voice.count = 1;          voice.count = 1;
199          instrument.voices[0] = voice;          instrument.voices[0] = voice;

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

  ViewVC Help
Powered by ViewVC 1.1.26