11
11
#include "jackmidi.h"
12
12
#include "pitchentry.h"
14
#include "device_manager.h"
15
#include "moveviewport.h"
14
16
#define NOTE_OFF 0x80
15
17
#define NOTE_ON 0x90
16
18
#define SYS_EXCLUSIVE_MESSAGE1 0xF0
17
19
#define MIDI_CONTROLLER 0xB0
18
20
#define MIDI_ALL_SOUND_OFF 0x78
19
21
#define MIDI_ALL_NOTE_OFF 0x7b
20
#define MAX_NUMBER_OF_TRACKS 128
21
#define BUFFER_MAX_INDEX 100
23
#define DENEMO_MAX_PORTS (128)
25
#define MAX_NUMBER_OF_TRACKS DENEMO_MAX_PORTS
27
// #define BUFFER_MAX_INDEX 100 rename DENEMO_BUFFER_MAX_INDEX
22
28
#define INPUT_PORT_NAME "midi_in"
23
#define PROGRAM_NAME "denemo"
24
jack_client_t *jack_client = NULL;
29
#define OUTPUT_PORT_NAME "midi_out"
30
#define CLIENT_NAME "denemo"
31
#define MD Denemo.prefs.midi_device
25
33
jack_port_t *input_port;
26
jack_port_t *output_ports[MAX_NUMBER_OF_TRACKS];
28
static volatile gint BufferIndex;
29
static gint BufferFillIndex;
30
static volatile gboolean BufferEmpty = TRUE;
31
static volatile gboolean IMMEDIATE = TRUE;
35
unsigned char buffer[3];
40
struct midi_buffer global_midi_buffer[BUFFER_MAX_INDEX];
35
//maybe use this instead of looking through ports
36
//static gint jack_client_index = 0;
38
//struct midi_output_device
40
// jack_client_t *jack_client;
41
// jack_port_t *output_ports[MAX_NUMBER_OF_TRACKS];
42
// void *port_buffers[MAX_NUMBER_OF_TRACKS];//this is not needed, the value stored in it is looked up always
45
//struct midi_output_device midi_device[DENEMO_MAX_DEVICES];
47
static double start_player = 0.0;
48
//static volatile gint BufferIndex;
49
//static gint BufferFillIndex;
50
//static volatile gboolean BufferEmpty = TRUE;
51
static gboolean playing_piece = FALSE;
54
// unsigned char buffer[3];
60
//struct midi_buffer global_midi_buffer[BUFFER_MAX_INDEX];
42
62
static gint timeout_id = 0, kill_id=0;
43
63
static gdouble playback_duration = 0.0;
45
static smf_t *smf = NULL;
46
65
static double rate_limit = 0;
47
static gboolean just_one_output = FALSE;
48
66
static gboolean start_stopped = FALSE;
49
67
static gboolean use_transport = FALSE;
51
static int playback_started = -1, song_position = 0;
52
static gboolean stop_midi_output = FALSE;
68
static gboolean jack_server_running = TRUE;
53
69
static double start_time = 0.0;//time in seconds to start at (from start of the smf)
54
70
static double end_time = 0.0;//time in seconds to end at (from start of the smf)
63
ret = gettimeofday(&tv, NULL);
66
perror("gettimeofday");
69
seconds = tv.tv_sec + tv.tv_usec / 1000000.0;
77
static double previously = -1.0;
83
if (previously == -1.0) {
89
delta = now - previously;
73
maxnumber_of_clients(){
74
return DENEMO_MAX_DEVICES;
79
return MAX_NUMBER_OF_TRACKS;
83
jackmidi_default_client_name(){
88
jackmidi_default_port_name(){
89
return OUTPUT_PORT_NAME;
93
jackmidi_server_running(){
94
return jack_server_running;
98
99
warning_async(gpointer s)
100
gchar *str = (gchar *)s;
102
g_warning("%s", str);
101
gchar *str = (gchar *)s;
102
g_warning("%s", str);
108
107
warn_from_jack_thread_context(const char *str)
111
g_idle_add(warning_async, (gpointer)str);
116
nframes_to_ms(jack_nframes_t nframes)
120
sr = jack_get_sample_rate(jack_client);
124
return (nframes * 1000.0) / (double)sr;
128
nframes_to_seconds(jack_nframes_t nframes)
130
return nframes_to_ms(nframes) / 1000.0;
133
static jack_nframes_t
134
ms_to_nframes(double ms)
138
sr = jack_get_sample_rate(jack_client);
142
return ((double)sr * ms) / 1000.0;
145
static jack_nframes_t
146
seconds_to_nframes(double seconds)
148
return ms_to_nframes(seconds * 1000.0);
152
send_all_sound_off(void *port_buffers[MAX_NUMBER_OF_TRACKS], jack_nframes_t nframes)
155
unsigned char *buffer;
156
warn_from_jack_thread_context("\nSending all sound off!!!\n");
157
for (i = 0; i < smf->number_of_tracks; i++) {
158
for (channel = 0; channel < 16; channel++) {
159
#ifdef JACK_MIDI_NEEDS_NFRAMES
160
buffer = jack_midi_event_reserve(port_buffers[i], 0, 3, nframes);
162
buffer = jack_midi_event_reserve(port_buffers[i], 0, 3);
164
if (buffer == NULL) {
165
warn_from_jack_thread_context("jack_midi_event_reserve failed, cannot send All Sound Off.");
169
buffer[0] = MIDI_CONTROLLER | channel;
170
buffer[1] = MIDI_ALL_SOUND_OFF;
179
static gint move_on(DenemoGUI *gui){
182
set_currentmeasurenum (gui, gui->si->currentmeasurenum+1);
186
gint jack_kill_timer(void){
110
g_idle_add(warning_async, (gpointer)str);
116
jack_kill_timer(void){
187
117
g_debug("Jack kill timer %d\n", timeout_id);
189
119
g_source_remove(timeout_id);
198
128
timer_callback(gpointer bufferindex){
199
gint index = (gint) bufferindex;
200
global_midi_buffer[BufferFillIndex].buffer[0] = NOTE_OFF | global_midi_buffer[index].channel;
201
global_midi_buffer[BufferFillIndex].buffer[1] = global_midi_buffer[index].buffer[1];
202
global_midi_buffer[BufferFillIndex].buffer[2] = global_midi_buffer[index].buffer[2];
203
global_midi_buffer[BufferFillIndex].jack_port = global_midi_buffer[index].jack_port;
204
BufferFillIndex = BufferFillIndex+1 > BUFFER_MAX_INDEX ? 0 : BufferFillIndex+1;
130
gint index = (gint) bufferindex;
131
global_midi_buffer[BufferFillIndex].buffer[0] = NOTE_OFF | global_midi_buffer[index].channel;
132
global_midi_buffer[BufferFillIndex].buffer[1] = global_midi_buffer[index].buffer[1];
133
global_midi_buffer[BufferFillIndex].buffer[2] = global_midi_buffer[index].buffer[2];
134
global_midi_buffer[BufferFillIndex].device_number = global_midi_buffer[index].device_number;
135
global_midi_buffer[BufferFillIndex].port_number = global_midi_buffer[index].port_number;
136
BufferFillIndex = BufferFillIndex+1 > DENEMO_BUFFER_MAX_INDEX ? 0 : BufferFillIndex+1;
210
143
jack_playpitch(gint key, gint duration){
211
if (BufferEmpty==TRUE){
145
if (!jack_server_running)
147
if (BufferEmpty==TRUE){
212
148
DenemoStaff *curstaffstruct = (DenemoStaff *) Denemo.gui->si->currentstaff->data;
213
global_midi_buffer[BufferFillIndex].buffer[0] = NOTE_ON | curstaffstruct->midi_channel;
149
global_midi_buffer[BufferFillIndex].buffer[0] = NOTE_ON | get_midi_channel();
214
150
global_midi_buffer[BufferFillIndex].buffer[1] = key;
215
151
global_midi_buffer[BufferFillIndex].buffer[2] = curstaffstruct->volume;
216
global_midi_buffer[BufferFillIndex].channel = curstaffstruct->midi_channel;
217
global_midi_buffer[BufferFillIndex].jack_port = curstaffstruct->jack_midi_out_port;
152
global_midi_buffer[BufferFillIndex].channel = get_midi_channel();
153
//global_midi_buffer[BufferFillIndex].device_number = //TODO
154
global_midi_buffer[BufferFillIndex].port_number = get_midi_port();
218
155
g_timeout_add(duration, timer_callback, (gpointer) BufferFillIndex);
219
BufferFillIndex = BufferFillIndex+1 > BUFFER_MAX_INDEX ? 0 : BufferFillIndex+1;
156
BufferFillIndex = BufferFillIndex+1 > DENEMO_BUFFER_MAX_INDEX ? 0 : BufferFillIndex+1;
220
157
BufferEmpty=FALSE;
224
void jack_output_midi_event(unsigned char *buffer){
225
if (BufferEmpty==TRUE){
226
global_midi_buffer[BufferFillIndex].buffer[0] = buffer[0];
227
global_midi_buffer[BufferFillIndex].buffer[1] = buffer[1];
228
global_midi_buffer[BufferFillIndex].buffer[2] = buffer[2];
229
BufferFillIndex = BufferFillIndex+1 > BUFFER_MAX_INDEX ? 0 : BufferFillIndex+1;
230
if (BufferFillIndex == BufferIndex)
231
g_debug("\nBuffer Overrun\n");
235
global_midi_buffer[BufferFillIndex].buffer[0] = buffer[0];
236
global_midi_buffer[BufferFillIndex].buffer[1] = buffer[1];
237
global_midi_buffer[BufferFillIndex].buffer[2] = buffer[2];
238
BufferFillIndex = BufferFillIndex+1 > BUFFER_MAX_INDEX ? 0 : BufferFillIndex+1;
162
#define MDC MD[client_number].ports[port_number]
164
jack_output_midi_event(unsigned char *buffer, gint client_number, gint port_number){
165
DenemoScore *si = Denemo.gui->si;
167
if (!jack_server_running)
169
gint velocity = ((gint)(si->master_volume * buffer[2]));
170
if(velocity>0x7F) velocity = 0x7F;
171
MDC.midi_buffer[ MDC.FillIndex].buffer[0] = buffer[0];
172
MDC.midi_buffer[ MDC.FillIndex].buffer[1] = buffer[1];
173
MDC.midi_buffer[ MDC.FillIndex].buffer[2] = velocity;
175
if(MDC.FillIndex > DENEMO_BUFFER_MAX_INDEX)
177
if ( MDC.FillIndex == MDC.Index)
178
g_debug("\nBuffer Overrun\n");
179
MDC.BufferEmpty=FALSE;
180
g_debug("output to client %d port %d\n", client_number, port_number);
243
send_midi_event(jack_nframes_t nframes){
184
send_midi_event(jack_nframes_t nframes, gint client_number){
244
185
unsigned char *buffer;
245
gint i=global_midi_buffer[BufferIndex].jack_port;
246
void *port_buffers[MAX_NUMBER_OF_TRACKS];
248
if (output_ports[i]){
249
port_buffers[i] = jack_port_get_buffer(output_ports[i], nframes);
250
jack_midi_clear_buffer(port_buffers[i]);
251
if (BufferEmpty==FALSE)
252
while (BufferIndex != BufferFillIndex){
253
buffer = jack_midi_event_reserve(port_buffers[i], 0, 3);
255
warn_from_jack_thread_context("jack_midi_event_reserve_failed, NOTE_LOST.");
258
buffer[0] = global_midi_buffer[BufferIndex].buffer[0];
259
buffer[1] = global_midi_buffer[BufferIndex].buffer[1];
260
buffer[2] = global_midi_buffer[BufferIndex].buffer[2];
261
BufferIndex = BufferIndex+1 > BUFFER_MAX_INDEX ? 0 : BufferIndex+1;
187
if(MD[client_number].jack_client==NULL)
189
if(MD[client_number].ports==NULL)
191
for(port_number = 0;MDC.output_port;port_number++) {
192
gchar *outbuffer = jack_port_get_buffer(MDC.output_port, nframes);
193
jack_midi_clear_buffer(outbuffer);
194
if (MDC.BufferEmpty==FALSE)
195
while (MDC.Index != MDC.FillIndex){
196
buffer = jack_midi_event_reserve(outbuffer, 0, 3);
198
warn_from_jack_thread_context("jack_midi_event_reserve_failed, NOTE_LOST.");
201
buffer[0] = MDC.midi_buffer[MDC.Index].buffer[0];
202
buffer[1] = MDC.midi_buffer[MDC.Index].buffer[1];
203
buffer[2] = MDC.midi_buffer[MDC.Index].buffer[2];
205
if(MDC.Index > DENEMO_BUFFER_MAX_INDEX)
208
MDC.BufferEmpty=TRUE;
213
static gboolean finish_play(gchar *callback) {
214
if(callback && *callback)
215
call_out_to_guile (callback);
219
static gdouble last_draw_time;
220
static gdouble pause_time = -1.0;
221
static gboolean jackmidi_play_smf_event(gchar *callback)
224
DenemoScore *si = Denemo.gui->si;
225
smf_event_t *event = si->smf?smf_peek_next_event(si->smf):NULL;
227
if (!jack_server_running)
229
if (!MD[0].jack_client)
232
return finish_play(callback);
234
if (event == NULL || (event->time_seconds > si->end_time)){
235
si->playingnow = NULL;
236
playing_piece = FALSE;
239
return finish_play(callback);
242
playing_piece = TRUE;
244
/* Skip over metadata events. */
245
if (smf_event_is_metadata(event)) {
246
event = smf_get_next_event(si->smf);
249
// g_print("rightmost %f event %f\n", si->rightmost_time, event->time_seconds);
250
if(si->rightmost_time>0.0 && event->time_seconds>si->rightmost_time)
252
gdouble thetime = get_time() - si->start_player;
253
pause_time = thetime;
254
//g_print("thetime %f\n", thetime);
255
thetime -= si->tempo_change_time - si->start_player;
256
thetime *= si->master_tempo;
257
thetime += si->tempo_change_time - si->start_player;
258
//g_print("transformed to %f\n", thetime);
259
if (thetime > event->time_seconds){
260
event = smf_get_next_event(si->smf);
261
si->playingnow = event->user_pointer;
262
si->playhead = event->time_seconds;//the time of the playhead used in draw.c
263
DP = event->track->user_pointer;
266
//g_print("current object %p %x\n", event->user_pointer,((event->midi_buffer[0] & SYS_EXCLUSIVE_MESSAGE1)) );
267
if(((event->midi_buffer[0] & SYS_EXCLUSIVE_MESSAGE1)==NOTE_ON) &&
268
event->time_seconds - last_draw_time>Denemo.prefs.display_refresh) {
269
// g_print("drawing because %f %f\n", event->time_seconds, last_draw_time);
270
last_draw_time = event->time_seconds;
272
gtk_widget_queue_draw (Denemo.gui->scorearea);
274
gint chan = (event->midi_buffer[0] & 0x0f);
275
//g_print("message %x %x\n", event->midi_buffer[0] & SYS_EXCLUSIVE_MESSAGE1, PROGRAM_CHANGE);
277
switch((event->midi_buffer[0] & SYS_EXCLUSIVE_MESSAGE1))
280
if (si->end_time - event->time_seconds > 0.01) //Do not turn notes on too close to the end
281
jack_output_midi_event(event->midi_buffer, DP->device_number, DP->port_number);
283
si->playhead += 0.001;//Make sure playhead is inside duration of note
286
jack_output_midi_event(event->midi_buffer, DP->device_number, DP->port_number);
287
si->playhead -= 0.001;//Make sure playhead is inside duration of note
290
jack_output_midi_event(event->midi_buffer, DP->device_number, DP->port_number);
269
process_midi_output(jack_nframes_t nframes)
271
int i, t, bytes_remaining, track_number;
272
unsigned char *buffer, tmp_status;
273
void *port_buffers[MAX_NUMBER_OF_TRACKS];
274
jack_nframes_t last_frame_time;
276
for (i = 0; i < smf->number_of_tracks; i++) {
278
port_buffers[i] = jack_port_get_buffer(output_ports[i], nframes);
280
if (port_buffers[i] == NULL) {
281
warn_from_jack_thread_context("jack_port_get_buffer failed, cannot send anything.");
285
#ifdef JACK_MIDI_NEEDS_NFRAMES
286
jack_midi_clear_buffer(port_buffers[i], nframes);
288
jack_midi_clear_buffer(port_buffers[i]);
296
if (JackTransportStopped == jack_transport_query(jack_client, NULL))
299
last_frame_time = jack_last_frame_time(jack_client);
300
/* End of song already? */
301
if (playback_started < 0){
302
warn_from_jack_thread_context/*g_debug*/("playback_started < 0");
305
/* We may push at most one byte per 0.32ms to stay below 31.25 Kbaud limit. */
306
bytes_remaining = nframes_to_ms(nframes) * rate_limit;
309
smf_event_t *event = smf_peek_next_event(smf);
311
if (event == NULL || (event->time_seconds>end_time)) {
312
warn_from_jack_thread_context/*g_debug*/("End of song.");
313
jack_midi_playback_stop();
314
send_all_sound_off(port_buffers, nframes);
318
/* Skip over metadata events. */
319
if (smf_event_is_metadata(event)) {
320
n = smf_get_next_event(smf);
324
bytes_remaining -= event->midi_buffer_length;
325
if (rate_limit > 0.0 && bytes_remaining <= 0) {
326
warn_from_jack_thread_context("Rate limiting in effect.");
330
t = seconds_to_nframes(event->time_seconds - start_time) + playback_started - song_position + nframes - last_frame_time;
331
/* If computed time is too much into the future, we'll need
333
if (t >= (int)nframes)
336
/* If computed time is < 0, we missed a cycle because of xrun. */
340
/* We will send this event; remove it from the queue. */
341
n = smf_get_next_event(smf);
343
/* Send it via proper output port. */
344
track_number = event->track->track_number -1;
346
#ifdef JACK_MIDI_NEEDS_NFRAMES
347
buffer = jack_midi_event_reserve(port_buffers[track_number], t, event->midi_buffer_length, nframes);
349
buffer = jack_midi_event_reserve(port_buffers[track_number], t, event->midi_buffer_length);
352
if (buffer == NULL) {
353
warn_from_jack_thread_context("jack_midi_event_reserve failed, NOTE LOST.");
356
memcpy(buffer, event->midi_buffer, event->midi_buffer_length);
361
static process_midi_input(jack_nframes_t nframes)
299
process_midi_input(jack_nframes_t nframes)
363
301
int read, events, i, channel;
364
302
void *port_buffer;
365
303
jack_midi_event_t event;
366
304
int last_frame_time;
367
305
static int time_of_first_event = -1;
369
last_frame_time = jack_last_frame_time(jack_client);
307
//last_frame_time = jack_last_frame_time(midi_device[0].jack_client);
370
308
port_buffer = jack_port_get_buffer(input_port, nframes);
371
309
events = jack_midi_get_event_count(port_buffer);
372
310
for (i = 0; i < events; i++) {
385
323
if(Denemo.gui->input_source==INPUTMIDI && input_port)
386
324
process_midi_input(nframes);
387
if (IMMEDIATE && Denemo.gui->si && output_ports)
388
send_midi_event(nframes);
389
if (!IMMEDIATE && Denemo.gui->si && smf && output_ports)
390
process_midi_output(nframes);
326
send_midi_event(nframes, client_number);
331
register_jack_midi_port(gint client_number, gint port_number, gchar *port_name){
333
if (!midi_device[client_number].jack_client)
335
if (!jack_server_running)
338
midi_device[client_number].output_ports[port_number] = jack_port_register(midi_device[client_number].jack_client,
339
port_name, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
340
jack_nframes_t nframes = jack_get_buffer_size(midi_device[client_number].jack_client);
341
jack_midi_clear_buffer(jack_port_get_buffer(midi_device[client_number].output_ports[port_number], nframes));
394
344
/* returns the jack midi port number that
395
345
* has been assigned
398
create_jack_midi_port(char* port_name){
399
if (jack_client != NULL){
401
jack_nframes_t nframes = jack_get_buffer_size(jack_client);
402
/* only assign it if the port has not been assigned already */
403
for (i=0;i <= MAX_NUMBER_OF_TRACKS;i++){
405
if (output_ports[i] == NULL){
406
output_ports[i] = jack_port_register(jack_client,
407
port_name, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
409
if (output_ports[i] == NULL) {
410
g_critical("Could not register JACKMIDI output_port[%d] '%s'.",i, port_name);
414
if (output_ports[i]){
415
jack_midi_clear_buffer(jack_port_get_buffer(output_ports[i], nframes));
418
if (output_ports[i] != NULL)
419
g_debug("\nassigning jackmidi port output_port[%d]\n", i);
430
create_jack_midi_ports_from_score(){
432
DenemoStaff *curstaffstruct;
433
curstaff = Denemo.gui->si->thescore;
437
curstaffstruct = (DenemoStaff *) curstaff->data;
438
g_debug("\nStaff name = %s\n", curstaffstruct->denemo_name->str);
439
/* Create port and assign jack port number */
440
curstaffstruct->jack_midi_out_port = create_jack_midi_port(curstaffstruct->denemo_name->str);
441
curstaff = curstaff->next;
446
remove_jack_midi_port(int port_number){
449
if (output_ports[port_number] != NULL){
450
err = jack_port_unregister(jack_client, output_ports[port_number]);
451
output_ports[port_number] = NULL;
453
g_debug("\nremove jackmidi port number = %d\n", port_number);
460
remove_all_jack_midi_ports(){
465
for (i=0;i < MAX_NUMBER_OF_TRACKS;i++){
467
if (output_ports[i] != NULL){
469
err = jack_port_unregister(jack_client, output_ports[i]);
470
output_ports[i] = NULL;
472
g_debug("\nremoving jackmidi port number = %d\n", i);
480
rename_jack_midi_port(int port_number, char *port_name){
482
if (output_ports[port_number] != NULL)
483
err = jack_port_set_name (output_ports[port_number], port_name);
485
g_debug("Trying to rename JACK port output_ports[%d] to %s\n",port_number, port_name);
488
g_critical("Could not rename JACK port output_ports[%d] to %s",port_number, port_name);
348
create_jack_midi_port(gint client_number){
350
if (!midi_device[client_number].jack_client)
353
if (!jack_server_running)
359
/* only assign it if the port has not been assigned already */
360
for (i=0;i <= MAX_NUMBER_OF_TRACKS;i++)
361
if (!midi_device[client_number].output_ports[i]){
362
sprintf(port_name, "%s:%d",OUTPUT_PORT_NAME, i);
363
register_jack_midi_port(client_number,i, port_name);
364
if (midi_device[client_number].output_ports[i]){
366
g_debug("\nassigning jackmidi port output_port[%d]\n", i);
367
MD[client_number].port_names = g_list_append(MD[client_number].port_names, g_string_new(port_name));
370
g_critical("Could not register JACKMIDI %s:[%d]",OUTPUT_PORT_NAME,i);
380
create_jack_midi_client(){
384
char client_name[12];
386
if (!jack_server_running)
389
for (i=0;i <= DENEMO_MAX_DEVICES;i++)
390
if (!midi_device[i].jack_client){
391
sprintf(client_name, "%s:%d",CLIENT_NAME, i);
392
midi_device[i].jack_client = jack_client_open(client_name, JackNoStartServer, NULL);
394
if (!midi_device[i].jack_client){
395
jack_server_running = FALSE;
400
if (jack_set_process_callback(midi_device[i].jack_client, process_callback, i)){
401
jack_server_running = FALSE;
402
g_critical("Could not register JACK process callback.");
406
/* activate client */
407
if (midi_device[i].jack_client){
408
jack_activate(midi_device[i].jack_client);
409
g_debug("\nassigning jackmidi client %s\n", client_name);
410
MD[i].client_name = g_string_new(client_name);
411
MD[i].port_names = NULL;
415
jack_server_running = FALSE;
416
g_critical("Could not connect to the JACK server; run jackd first?");
426
remove_jack_midi_port(int client_number, int port_number){
431
if (midi_device[client_number].output_ports[port_number]){
432
err = jack_port_unregister(midi_device[client_number].jack_client, midi_device[client_number].output_ports[port_number]);
433
midi_device[client_number].output_ports[port_number] = NULL;
434
GList *n = g_list_nth(MD[client_number].port_names, port_number);
435
MD[client_number].port_names = g_list_remove(MD[client_number].port_names,
437
g_debug("\nremove jackmidi device number %d, port number = %d\n", client_number, port_number);
446
remove_last_jack_midi_port(int client_number){
451
for (i=MAX_NUMBER_OF_TRACKS;i>=0;i--)
452
if (midi_device[client_number].output_ports[i]){
453
err = jack_port_unregister(midi_device[client_number].jack_client, midi_device[client_number].output_ports[i]);
454
midi_device[client_number].output_ports[i] = NULL;
455
GList *n = g_list_nth(MD[client_number].port_names, (int) i);
456
MD[client_number].port_names = g_list_remove(MD[client_number].port_names,
458
g_debug("\nremove jackmidi port number = %d\n", i);
467
remove_all_jack_midi_ports(int client_number){
472
for (i=MAX_NUMBER_OF_TRACKS;i>=0;i--)
473
if (midi_device[client_number].output_ports[i]){
474
jack_port_unregister(midi_device[client_number].jack_client, midi_device[client_number].output_ports[i]);
475
midi_device[client_number].output_ports[i] = NULL;
476
g_debug("\nremoving jackmidi port number = %d\n", i);
482
remove_jack_midi_client(gint i){
484
remove_all_jack_midi_ports(i);
485
jack_deactivate(midi_device[i].jack_client);
486
jack_client_close(midi_device[i].jack_client);
487
midi_device[i].jack_client = NULL;
488
g_string_free(MD[i].client_name, TRUE);
489
MD[i].client_name = NULL;
496
remove_all_jack_midi_clients(){
498
while (jack_client_index)
499
remove_jack_midi_client(jack_client_index-1);
503
#define MDC MD[client_number].ports[port_number]
505
rename_jack_midi_port(int client_number, int port_number, char *port_name){
508
if (MD[client_number].ports[port_number].port_name)
509
err = jack_port_set_name (MDC.output_port, port_name);
511
MD[client_number].ports[port_number].port_name = g_string_new(port_name);
513
g_critical("Could not rename JACK device %d output_ports[%d] to %s",client_number, port_number, port_name);
497
remove_all_jack_midi_ports();
498
int err = jack_port_unregister(jack_client, input_port);
499
jack_deactivate(jack_client);
500
jack_client_close(jack_client);
522
if (midi_device[0].jack_client)
523
jack_port_unregister(midi_device[0].jack_client, input_port);
524
remove_all_jack_midi_clients();
508
jack_client = jack_client_open(PROGRAM_NAME, JackNullOption, NULL);
510
if (jack_client == NULL) {
511
g_critical("Could not connect to the JACK server; run jackd first?");
513
err = jack_set_process_callback(jack_client, process_callback, 0);
515
g_critical("Could not register JACK process callback.");
518
input_port = jack_port_register(jack_client, INPUT_PORT_NAME, JACK_DEFAULT_MIDI_TYPE,
521
if (input_port == NULL) {
522
g_critical("Could not register JACK input port.");
525
if (jack_activate(jack_client)) {
526
g_critical("Cannot activate JACK client.");
530
int i, err, port_number;
531
i = err = port_number = 0;
534
jack_server_running = FALSE;
535
if(Denemo.prefs.midi_audio_output==Jack)
536
g_warning("No devices in preferences, edit->preferences->MIDI add devices and re-start");
539
for (i=0;MD[i].client_name;i++){
540
g_debug("\njack init *** client name == %s \n",MD[i].client_name->str);
541
//create_jack_midi_client_from_load(MD[i].client_name->str);
542
MD[i].jack_client = (gpointer)jack_client_open(MD[i].client_name->str, JackNoStartServer, NULL);
543
if(MD[i].jack_client == NULL) {
544
if(Denemo.prefs.midi_audio_output==Jack)
545
g_warning("Could not open JACK client %s, no jack server running?", MD[i].client_name->str );
548
if (jack_set_process_callback(MD[i].jack_client, (JackProcessCallback)process_callback, (void *)i)){
549
jack_server_running = FALSE;
550
g_warning("Could not register JACK process callback.");
554
if(MD[i].jack_client) {
556
for(j=0; MD[i].ports && j<DENEMO_MAX_PORTS && MD[i].ports[j].port_name; j++) {
557
MD[i].ports[j].output_port =
558
(gpointer) jack_port_register(MD[i].jack_client,
559
MD[i].ports[j].port_name->str, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
560
MD[i].ports[j].Index = MD[i].ports[j].FillIndex = 0;
561
MD[i].ports[j].BufferEmpty = TRUE;
563
if (i==0 && MD[0].jack_client && input_port==NULL)
564
input_port = jack_port_register(MD[0].jack_client, INPUT_PORT_NAME, JACK_DEFAULT_MIDI_TYPE,
567
/* activate client */
568
jack_activate(MD[i].jack_client);
532
jack_start_restart (void){
533
g_debug("\nJack Start/Restart button pressed\n");
534
if (jack_client == NULL){
535
g_debug("\nStarting Jack\n");
537
create_jack_midi_ports_from_score();
539
if (jack_client != NULL){
540
g_debug("\nRestarting Jack\n");
543
create_jack_midi_ports_from_score();
548
jack_midi_player (void) {
550
if (smf->number_of_tracks > MAX_NUMBER_OF_TRACKS) {
551
g_warning("Number of tracks (%d) exceeds maximum for per-track output; implying '-s' option.", smf->number_of_tracks);
552
just_one_output = TRUE;
554
g_debug("\nNumber of tracks = %d\n", smf->number_of_tracks);
556
if (use_transport && !start_stopped) {
557
jack_transport_locate(jack_client, 0);
558
jack_transport_start(jack_client);
561
playback_started = jack_frame_time(jack_client);
566
jack_midi_playback_start()
576
void jack_midi_play(gchar *callback)
568
578
DenemoGUI *gui = Denemo.gui;
569
playback_started = -1, song_position = 0, stop_midi_output = FALSE;
571
/* set tranport on/off */
572
use_transport = (gboolean)Denemo.prefs.jacktransport;
573
/* set transport start_stopped */
574
start_stopped = (gboolean) Denemo.prefs.jacktransport_start_stopped;
575
if (jack_client != NULL){
576
if((gui->si->smf==NULL) || (gui->si->smfsync!=gui->si->changecount))
577
exportmidi (NULL, gui->si, 1, 0/* means to end */);
582
smf = Denemo.gui->si->smf;
584
g_critical("Loading SMF failed.");
588
playback_duration = smf_get_length_seconds(smf);
589
g_debug("%s.\n", smf_decode(smf));
593
DenemoObject *curobj;
595
curobj = get_mark_object();
596
if(curobj==NULL && gui->si->currentobject)
597
curobj = gui->si->currentobject->data;
598
if(curobj && curobj->midi_events) {
599
smf_event_t *event = curobj->midi_events->data;
600
start_time = event->time_seconds;
601
g_debug("\nsetting start %f\n", start_time);
603
end_time = playback_duration;
605
curobj = get_point_object();
606
if(curobj && curobj->midi_events)/*is this ever true?*/ {
607
smf_event_t *event = g_list_last(curobj->midi_events)->data;
608
end_time = event->time_seconds;
609
g_debug("\nsetting end %f\n", end_time);
610
//could investigate to see if event is NoteOn and g_warning("Setting stop time to a NoteOn event!");
614
if(start_time>end_time) {
615
gdouble temp = start_time;
616
start_time = end_time;
619
playback_duration = end_time - start_time;
620
g_debug("\nstart %f for %f seconds\n",start_time, playback_duration);
621
/* execute jackmidi player function */
625
if(gui->si->end==0) {//0 means not set, we move the cursor on unless the specific range was specified
626
DenemoStaff *staff = (DenemoStaff *) gui->si->currentstaff->data;
627
//FIXME add a delay before starting the timer.
628
timeout_id = g_timeout_add ( 4*((double)staff->timesig.time1/(double)staff->timesig.time2)/(gui->si->tempo/(60.0*1000.0)), (GSourceFunc)move_on, gui);
629
// g_print("Setting end time to %f %u\n", duration*1000, (guint)(duration*1000));
630
kill_id = g_timeout_add ((guint)(playback_duration*1000), (GSourceFunc)jack_kill_timer, NULL);
579
if (!jack_server_running)
581
if((gui->si->smf==NULL) || (gui->si->smfsync!=gui->si->changecount))
583
if (Denemo.gui->si->smf == NULL) {
584
g_critical("Loading SMF failed.");
587
static GString *callback_string;
589
if(callback_string==NULL)
590
callback_string=g_string_new("");
592
g_string_assign(callback_string, callback);
594
g_string_assign(callback_string,"(display \"Stopped Playing\")");
600
playing_piece = FALSE;
601
(void)finish_play(callback);
604
if(gui->si->end_time<0.0)
605
gui->si->end_time = smf_get_length_seconds(Denemo.gui->si->smf);
607
if(gui->si->start_time>gui->si->end_time)
608
gui->si->start_time = 0.0;
609
if(gui->si->start_time<0.0)
610
gui->si->start_time = 0.0;
611
if( (pause_time>0.0) && (pause_time<gui->si->end_time))
612
gui->si->start_player = get_time() - pause_time;
614
pause_time = -1.0, gui->si->start_player = get_time() - gui->si->start_time;
615
playing_piece = TRUE;
617
gui->si->tempo_change_time = gui->si->start_player;
619
smf_rewind(Denemo.gui->si->smf);
620
last_draw_time = 0.0;
621
g_idle_add(jackmidi_play_smf_event, callback_string->str);
622
smf_seek_to_seconds(gui->si->smf, pause_time>0.0? pause_time:gui->si->start_time);
637
626
jack_midi_playback_stop ()
639
stop_midi_output = TRUE;
641
jack_transport_stop(jack_client);
642
g_debug("\nStopping Transport and midi playback\n");
643
playback_started = -1;
648
#endif // _HAVE_JACK_
629
//jack_transport_stop(jack_client);
632
Denemo.gui->si->playingnow = NULL;
633
playing_piece = FALSE;
641
gint client_number, port_number;
642
jack_midi_playback_stop ();
643
unsigned char buffer[3];
645
//flush buffers, stop callback?
646
#define MD Denemo.prefs.midi_device
647
for (i=0;MD[i].client_name;i++)
648
for(j=0;MD[i].ports[j].port_name;j++)
650
buffer[0] = MIDI_CONTROLLER | c;
651
buffer[1] = MIDI_ALL_SOUND_OFF;
653
jack_output_midi_event(buffer, i, j);
656
Denemo.gui->si->end_time = pause_time = -1.0;
657
Denemo.gui->si->start_time = 0.0;
658
displayhelper(Denemo.gui);
661
#else //If not _HAVE_JACK_
662
void jack_playpitch(){}
663
void jack_output_midi_event(){}
664
int jack_kill_timer(){}
665
void jack_midi_playback_stop (){}
666
void jack_midi_playback_start (){}
667
void jack_midi_play(){}
668
void remove_last_jack_midi_port (){}
669
void create_jack_midi_port (){}
670
void remove_jack_midi_client (){}
671
void remove_jack_midi_port (){}
672
void rename_jack_midi_port (){}
674
void create_jack_midi_client (){}
675
jackmidi_default_client_name(){}
676
jackmidi_default_port_name(){}
677
int maxnumber_of_ports(){ return 0;}
678
int maxnumber_of_clients(){ return 0;}
679
int jackmidi_server_running(){ return 0;}
681
void jack_midi_panic(){}