2 TiMidity++ -- MIDI to WAVE converter and player
3 Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4 Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #endif /* HAVE_CONFIG_H */
24 /* rcp.c - written by Masanao Izumo <mo@goice.co.jp> */
39 #define RCP_MAXCHANNELS 32
40 /* #define RCP_LOOP_CONT_LIMIT 16 */
41 #define RCP_LOOP_TIME_LIMIT 600
45 int32 gate; /* Note length */
47 int note; /* Note number */
48 struct NoteList *next; /* next note */
53 int gfmt; /*! RCP format (1 if G36 or G18) */
54 int32 at; /*! current time */
55 int32 tempo; /*! current tempo (sync with current_tempo) */
56 int32 tempo_to; /*! tempo gradate to */
57 int tempo_grade; /*! tempo gradation slope */
58 int tempo_step; /*! tempo gradation step */
59 struct NoteList *notes; /*! note list */
60 MBlockList pool; /*! memory pool for notes */
61 struct NoteList *freelist; /*! free note list */
64 #define SETMIDIEVENT(e, at, t, ch, pa, pb) \
65 { (e).time = (at); (e).type = (t); \
66 (e).channel = (uint8)(ch); (e).a = (uint8)(pa); (e).b = (uint8)(pb); }
68 #define MIDIEVENT(at, t, ch, pa, pb) \
69 { MidiEvent event; SETMIDIEVENT(event, at, t, ch, pa, pb); \
70 readmidi_add_event(&event); }
72 static int read_rcp_track(struct timidity_file *tf, int trackno, int gfmt);
73 static int preprocess_sysex(uint8* ex, int ch, int gt, int vel);
76 static void ntr_init(struct RCPNoteTracer *ntr, int gfmt, int32 at);
77 static void ntr_end(struct RCPNoteTracer *ntr);
78 static void ntr_incr(struct RCPNoteTracer *ntr, int step);
79 static void ntr_note_on(struct RCPNoteTracer *ntr,
80 int ch, int note, int velo, int gate);
81 static void ntr_wait_all_off(struct RCPNoteTracer *ntr);
82 #define ntr_at(ntr) ((ntr).at)
84 #define USER_EXCLUSIVE_LENGTH 24
85 #define MAX_EXCLUSIVE_LENGTH 1024
86 static uint8 user_exclusive_data[8][USER_EXCLUSIVE_LENGTH];
87 static int32 init_tempo;
88 static int32 init_keysig;
91 #define TEMPO_GRADATION_SKIP 2
92 #define TEMPO_GRADATION_GRADE 600
94 int read_rcp_file(struct timidity_file *tf, char *magic0, char *fn)
97 int ntrack, timebase1, timebase2, i, len, gfmt;
99 strncpy(buff, magic0, 4);
100 if(tf_read(buff + 4, 1, 32-4, tf) != 32-4)
103 if(strncmp(buff, "RCM-PC98V2.0(C)COME ON MUSIC", 28) == 0)
107 if(check_file_extension(fn, ".r36", 1))
108 current_file_info->file_type = IS_R36_FILE;
110 current_file_info->file_type = IS_RCP_FILE;
112 else if(strncmp(buff, "COME ON MUSIC RECOMPOSER RCP3.0", 31) == 0)
116 if(check_file_extension(fn, ".g18", 1))
117 current_file_info->file_type = IS_G18_FILE;
119 current_file_info->file_type = IS_G36_FILE;
125 if(tf_read(buff, 1, 64, tf) != 64)
127 if(current_file_info->seq_name == NULL)
130 for(len = 63; len >= 0; len--)
134 else if(buff[len] != '\0')
138 len = SAFE_CONVERT_LENGTH(len + 1);
139 p = (char *)new_segment(&tmpbuffer, len);
140 code_convert(buff, p, len, NULL, NULL);
141 current_file_info->seq_name = (char *)safe_strdup(p);
142 reuse_mblock(&tmpbuffer);
144 current_file_info->format = 1;
146 if(!gfmt) /* RCP or R36 */
148 if(tf_read(buff, 1, 336, tf) != 336)
152 for(len = 335; len >= 0; len--)
156 else if(buff[len] != '\0')
159 len = SAFE_CONVERT_LENGTH(len + 1);
161 p = (char *)new_segment(&tmpbuffer, len);
162 code_convert(buff, p, len, NULL, NULL);
163 ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "Memo: %s", p);
164 reuse_mblock(&tmpbuffer);
172 strncpy(tmp,buff+i,28);
174 for(len=28; len>=0; len--)
178 else if(tmp[len] != '\0')
183 len = SAFE_CONVERT_LENGTH(len + 1);
185 p = (char *)new_segment(&tmpbuffer, len);
186 code_convert(tmp, p, len, NULL, NULL);
187 ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "Memo: %s", p);
188 reuse_mblock(&tmpbuffer);
193 skip(tf, 16); /* 0x40 */
195 timebase1 = tf_getc(tf);
196 init_tempo = tf_getc(tf); /* tempo */
197 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Tempo %d", init_tempo);
198 if(init_tempo < 8 || init_tempo > 250)
201 /* Time Signature: numerator, denominator, Key Signature */
202 current_file_info->time_sig_n = tf_getc(tf);
203 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Time signature(n) %d",
204 current_file_info->time_sig_n);
205 current_file_info->time_sig_d = tf_getc(tf);
206 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Time signature(d) %d",
207 current_file_info->time_sig_d);
208 init_keysig = tf_getc(tf);
209 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Key signature %d", init_keysig);
210 if (init_keysig < 0 || init_keysig >= 32)
213 play_bias = (int)(signed char)tf_getc(tf);
214 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Play bias %d", play_bias);
215 if(play_bias < -36 || play_bias > 36)
218 skip(tf, 12); /* cm6 */
219 skip(tf, 4); /* reserved */
220 skip(tf, 12); /* gsd */
221 skip(tf, 4); /* reserved */
223 if((ntrack = tf_getc(tf)) == EOF)
225 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Number of tracks %d", ntrack);
226 if(ntrack != 18 && ntrack != 36)
228 timebase2 = tf_getc(tf);
229 skip(tf, 14); /* reserved */
232 skip(tf, 32 * (14 + 2)); /* rhythm definition */
234 else /* G36 or G18 */
236 skip(tf, 64); /* reserved */
239 if(tf_read(buff, 1, 360, tf) != 360)
242 for(len = 359; len >= 0; len--)
246 else if(buff[len] != '\0')
249 len = SAFE_CONVERT_LENGTH(len + 1);
250 p = (char *)new_segment(&tmpbuffer, len);
251 code_convert(buff, p, len, NULL, NULL);
252 ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "Memo: %s", p);
253 reuse_mblock(&tmpbuffer);
255 /* Number of tracks */
256 ntrack = tf_getc(tf);
257 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Number of tracks %d", ntrack);
258 if(ntrack != 18 && ntrack != 36)
261 timebase1 = tf_getc(tf);
262 timebase2 = tf_getc(tf);
263 init_tempo = tf_getc(tf); /* tempo */
264 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Tempo %d", init_tempo);
265 if(init_tempo < 8 || init_tempo > 250)
267 skip(tf, 1); /* ?? */
269 /* Time Signature: numerator, denominator, Key Signature */
270 current_file_info->time_sig_n = tf_getc(tf);
271 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Time signature(n) %d",
272 current_file_info->time_sig_n);
273 current_file_info->time_sig_d = tf_getc(tf);
274 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Time signature(n) %d",
275 current_file_info->time_sig_d);
276 init_keysig = tf_getc(tf);
277 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Key signature %d", init_keysig);
278 if (init_keysig < 0 || init_keysig >= 32)
281 play_bias = (int)(signed char)tf_getc(tf);
282 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Play bias %d", play_bias);
283 if(play_bias < -36 || play_bias > 36)
285 skip(tf, 6 + 16 + 112); /* reserved */
286 skip(tf, 12); /* gsd */
288 skip(tf, 12); /* gsd */
290 skip(tf, 12); /* cm6 */
292 skip(tf, 80); /* reserved */
293 skip(tf, 128 * (14 + 2)); /* rhythm definition */
297 for(i = 0; i < 8; i++)
300 skip(tf, 24); /* memo */
301 if(tf_read(user_exclusive_data[i], 1, USER_EXCLUSIVE_LENGTH, tf)
302 != USER_EXCLUSIVE_LENGTH)
304 mid = user_exclusive_data[i][0];
305 if(mid > 0 && mid < 0x7e &&
306 (current_file_info->mid == 0 || current_file_info->mid >= 0x7e))
307 current_file_info->mid = mid;
310 current_file_info->divisions = (timebase1 | (timebase2 << 8));
311 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "divisions %d",
312 current_file_info->divisions);
313 current_file_info->format = 1;
314 current_file_info->tracks = ntrack;
316 if(!IS_URL_SEEK_SAFE(tf->url))
317 if((tf->url = url_cache_open(tf->url, 1)) == NULL)
320 for(i = 0; i < ntrack; i++)
321 if(read_rcp_track(tf, i, gfmt))
323 if(ignore_midi_error)
330 static void rcp_tempo_set(int32 at, int32 tempo)
335 mid = ((tempo >> 8) & 0xff);
336 hi = ((tempo >> 16) & 0xff);
337 MIDIEVENT(at, ME_TEMPO, lo, hi, mid);
340 static int32 rcp_tempo_change(struct RCPNoteTracer *ntr, int a, int b)
344 tempo = (int32)((uint32)60000000 * 64 / (init_tempo * a)); /* 6*10^7 / (ini*a/64) */
345 ntr->tempo_grade = b;
348 ntr->tempo_to = tempo;
350 ntr->tempo_grade *= TEMPO_GRADATION_GRADE * TEMPO_GRADATION_SKIP;
351 tempo = ntr->tempo; /* unchanged */
356 rcp_tempo_set(ntr_at(*ntr), tempo);
361 static void rcp_timesig_change(int32 at)
365 n = current_file_info->time_sig_n;
366 d = current_file_info->time_sig_d;
367 MIDIEVENT(at, ME_TIMESIG, 0, n, d);
370 static void rcp_keysig_change(int32 at, int32 key)
377 sf = 8 - key, mi = 0;
379 sf = key - 16, mi = 1;
381 sf = 24 - key, mi = 1;
382 MIDIEVENT(at, ME_KEYSIG, 0, sf, mi);
385 static char *rcp_cmd_name(int cmd)
389 static char name[16];
390 sprintf(name, "NoteOn %d", cmd);
396 case 0x90: return "UserExclusive0";
397 case 0x91: return "UserExclusive1";
398 case 0x92: return "UserExclusive2";
399 case 0x93: return "UserExclusive3";
400 case 0x94: return "UserExclusive4";
401 case 0x95: return "UserExclusive5";
402 case 0x96: return "UserExclusive6";
403 case 0x97: return "UserExclusive7";
404 case 0x98: return "ChannelExclusive";
405 case 0xc0: return "DX7 function";
406 case 0xc1: return "DX parameter";
407 case 0xc2: return "DX RERF";
408 case 0xc3: return "TX function";
409 case 0xc5: return "FB-01 P parameter";
410 case 0xc6: return "FB-01 S System";
411 case 0xc7: return "TX81Z V VCED";
412 case 0xc8: return "TX81Z A ACED";
413 case 0xc9: return "TX81Z P PCED";
414 case 0xca: return "TX81Z S System";
415 case 0xcb: return "TX81Z E EFFECT";
416 case 0xcc: return "DX7-2 R REMOTE SW";
417 case 0xcd: return "DX7-2 A ACED";
418 case 0xce: return "DX7-2 P PCED";
419 case 0xcf: return "TX802 P PCED";
420 case 0xd0: return "YamahaBase";
421 case 0xd1: return "YamahaPara";
422 case 0xd2: return "YamahaDevice";
423 case 0xd3: return "XGPara";
424 case 0xdc: return "MKS-7";
425 case 0xdd: return "RolandBase";
426 case 0xde: return "RolandPara";
427 case 0xdf: return "RolandDevice";
428 case 0xe1: return "BnkLPrg";
429 case 0xe2: return "Bank&ProgCng";
430 case 0xe5: return "KeyScan";
431 case 0xe6: return "ChChange";
432 case 0xe7: return "TempoChange";
433 case 0xea: return "ChannelAfterTouch";
434 case 0xeb: return "ControlChange";
435 case 0xec: return "ProgChange";
436 case 0xed: return "AfterTouch";
437 case 0xee: return "PitchBend";
438 case 0xf5: return "KeyChange";
439 case 0xf6: return "Comment";
440 case 0xf7: return "2ndEvent";
441 case 0xf8: return "LoopEnd";
442 case 0xf9: return "LoopStart";
443 case 0xfc: return "SameMeasure";
444 case 0xfd: return "MeasureEnd";
445 case 0xfe: return "EndOfTrack";
450 static int rcp_parse_sysex_event(int32 at, uint8 *val, int32 len)
452 MidiEvent ev, evm[260];
455 if(len == 0) {return 0;}
457 if(parse_sysex_event(val, len, &ev))
460 readmidi_add_event(&ev);
462 if ((ne = parse_sysex_event_multi(val, len, evm)) > 0)
463 for (i = 0; i < ne; i++) {
465 readmidi_add_event(&evm[i]);
471 #define MAX_STACK_DEPTH 16
472 static int read_rcp_track(struct timidity_file *tf, int trackno, int gfmt)
477 long last_point, cmdlen;
479 struct RCPNoteTracer ntr;
482 long start_at; /* loop start time */
483 long loop_start; /* loop start seek point */
484 int count; /* loop count */
485 } stack[MAX_STACK_DEPTH];
488 uint8 sysex[MAX_EXCLUSIVE_LENGTH];
490 int roland_base_init = 0;
491 int roland_dev_init = 0;
492 int roland_base_addr0 = 0;
493 int roland_base_addr1 = 0;
494 int roland_device_id = 0x10;
495 int roland_model_id = 0x16;
497 int yamaha_base_init = 0;
498 int yamaha_dev_init = 0;
499 int yamaha_base_addr0 = 0;
500 int yamaha_base_addr1 = 0;
501 int yamaha_device_id = 0x10; /* ??? */
502 int yamaha_model_id = 0x16; /* ??? */
504 unsigned char cs; /* check sum */
506 long same_measure = -1; /* Meassure to stack pointer */
507 long track_top, data_top;
516 track_top = tf_tell(tf);
517 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY, "Track top: %d", track_top);
520 size |= (tf_getc(tf) << 8);
522 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Track size %d", size);
523 last_point = size + tf_tell(tf) - 2;
533 i = tf_getc(tf); /* Track Number */
534 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Track number %d", i);
535 skip(tf, 1); /* Rhythm */
537 if((ch = tf_getc(tf)) == 0xff) /* No playing */
539 tf_seek(tf, last_point, SEEK_SET);
543 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Track channel %d", ch);
545 if(ch >= RCP_MAXCHANNELS)
546 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
547 "RCP: Invalid channel: %d", ch);
550 key_offset = tf_getc(tf);
551 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Key offset %d", key_offset);
554 key_offset += play_bias;
557 time_offset = (int)(signed char)tf_getc(tf);
558 ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Time offset %d", time_offset);
559 if(time_offset < -99 || 99 < time_offset)
561 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
562 "RCP: Invalid time offset: %d", time_offset);
563 if(time_offset < -99)
569 i = tf_getc(tf); /* mode */
573 tf_seek(tf, last_point, SEEK_SET);
578 tf_read(buff, 1, 36, tf);
580 for(len = 35; len >= 0; len--)
584 else if(buff[len] != '\0')
587 len = SAFE_CONVERT_LENGTH(len+1);
588 p = (char *)new_segment(&tmpbuffer, len);
589 code_convert(buff, p, len, NULL, NULL);
591 ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "RCP Track name: %s", p);
592 reuse_mblock(&tmpbuffer);
595 * End of Track Header
599 ntr.tempo = current_tempo = 60000000 / init_tempo;
600 ntr_init(&ntr, gfmt, readmidi_set_track(trackno, 1));
601 if(trackno == 0 && init_tempo != 120)
602 ntr.tempo = current_tempo = rcp_tempo_change(&ntr, 64, 0);
604 rcp_timesig_change(ntr_at(ntr));
605 rcp_keysig_change(ntr_at(ntr), init_keysig);
607 ntr_incr(&ntr, time_offset);
609 data_top = tf_tell(tf);
610 while(last_point >= tf_tell(tf) + cmdlen)
612 int cmd, a, b, step, gate;
613 int st1, gt1, st2, gt2;
615 if(readmidi_error_flag)
625 gate = a = tf_getc(tf);
626 if((b = tf_getc(tf)) == EOF)
631 st1 = gt1 = st2 = gt2 = 0;
633 if(ctl->verbosity >= VERB_DEBUG_SILLY)
635 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
636 "[%d] %d %s: ch=%d step=%d a=%d b=%d sp=%d",
637 tf_tell(tf) - 4 - track_top,
638 ntr_at(ntr), rcp_cmd_name(cmd), ch, step, a, b, sp);
647 a = gt1 = tf_getc(tf);
648 if((gt2 = tf_getc(tf)) == EOF)
654 step = st1 + (st2 << 8);
655 gate = gt1 + (gt2 << 8);
657 if(ctl->verbosity >= VERB_DEBUG_SILLY)
659 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
660 "[%d] %d %s: ch=%d step=%d gate=%d a=%d b=%d sp=%d",
661 tf_tell(tf) - 6 - track_top,
662 ntr_at(ntr), rcp_cmd_name(cmd), ch,
663 step, gate, a, b, sp);
667 if(cmd < 0x80) /* Note event */
671 int note = cmd + key_offset;
672 ntr_note_on(&ntr, ch, note & 0x7f, b, gate);
674 ntr_incr(&ntr, step);
681 case 0x90: /* User Exclusive 1 */
682 case 0x91: /* User Exclusive 2 */
683 case 0x92: /* User Exclusive 3 */
684 case 0x93: /* User Exclusive 4 */
685 case 0x94: /* User Exclusive 5 */
686 case 0x95: /* User Exclusive 6 */
687 case 0x96: /* User Exclusive 7 */
688 case 0x97: /* User Exclusive 8 */
689 memcpy(sysex, user_exclusive_data[cmd - 0x90],
690 USER_EXCLUSIVE_LENGTH);
691 sysex[USER_EXCLUSIVE_LENGTH] = 0xf7;
692 len = preprocess_sysex(sysex, ch, a, b);
693 rcp_parse_sysex_event(ntr_at(ntr), sysex, len);
694 ntr_incr(&ntr, step);
697 case 0x98: /* Channel Exclusive */
699 while(tf_getc(tf) == 0xf7 && len + 6 < sizeof(sysex))
703 if(tf_read(sysex + len, 1, 5, tf) != 5)
712 tf_getc(tf); /* 0x00 */
713 if(tf_read(sysex + len, 1, 2, tf) != 2)
721 tf_seek(tf, -1, SEEK_CUR);
723 len = preprocess_sysex(sysex, ch, a, b);
724 rcp_parse_sysex_event(ntr_at(ntr), sysex, len);
725 ntr_incr(&ntr, step);
728 case 0xd0: /* Yamaha base */
731 yamaha_base_addr0 = a;
732 yamaha_base_addr1 = b;
733 yamaha_base_init = 1;
734 ntr_incr(&ntr, step);
737 case 0xd1: /* Yamaha para */
740 if(!yamaha_base_init)
741 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
742 "YamPara used before initializing YamBase");
744 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
745 "YamPara used before initializing YamDev#");
746 yamaha_base_init = yamaha_dev_init = 1;
748 sysex[1] = yamaha_device_id;
749 sysex[2] = yamaha_model_id;
752 cs += sysex[4] = yamaha_base_addr0;
753 cs += sysex[5] = yamaha_base_addr1;
756 sysex[8] = 128 - (cs & 0x7f);
758 rcp_parse_sysex_event(ntr_at(ntr), sysex, 10);
759 ntr_incr(&ntr, step);
762 case 0xd2: /* Yamaha device */
765 yamaha_device_id = a;
768 ntr_incr(&ntr, step);
771 case 0xd3: /* XG para */
776 sysex[1] = yamaha_device_id;
777 sysex[2] = yamaha_model_id;
780 cs += sysex[4] = yamaha_base_addr0;
781 cs += sysex[5] = yamaha_base_addr1;
784 sysex[8] = 128 - (cs & 0x7f);
786 rcp_parse_sysex_event(ntr_at(ntr), sysex, 10);
787 ntr_incr(&ntr, step);
790 case 0xdd: /* Roland base */
793 roland_base_addr0 = a;
794 roland_base_addr1 = b;
795 roland_base_init = 1;
796 ntr_incr(&ntr, step);
799 case 0xde: /* Roland para */
802 if(!roland_base_init)
803 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
804 "RolPara used before initializing RolBase");
806 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
807 "RolPara used before initializing RolDev#");
808 roland_base_init = roland_dev_init = 1;
810 sysex[1] = roland_device_id;
811 sysex[2] = roland_model_id;
814 cs += sysex[4] = roland_base_addr0;
815 cs += sysex[5] = roland_base_addr1;
818 sysex[8] = 128 - (cs & 0x7f);
820 rcp_parse_sysex_event(ntr_at(ntr), sysex, 10);
821 ntr_incr(&ntr, step);
824 case 0xdf: /* Roland device */
827 roland_device_id = a;
830 ntr_incr(&ntr, step);
833 case 0xe1: /* BnkLPrg */
834 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
835 "BnkLPrg is not supported: 0x%02x 0x%02x", a, b);
836 ntr_incr(&ntr, step);
839 case 0xe2: /* bank & program change */
840 readmidi_add_ctl_event(ntr_at(ntr), ch, 0, b); /*Change MSB Bank*/
841 MIDIEVENT(ntr_at(ntr), ME_PROGRAM, ch, a & 0x7f, 0);
842 ntr_incr(&ntr, step);
845 case 0xe5: /* key scan */
849 case 12: /* suspend playing */
850 case 18: /* increase play bias */
851 case 23: /* stop playing */
852 case 32: /* show main screen */
853 case 33: /* show 11th track */
854 case 34: /* show 12th track */
855 case 35: /* show 13th track */
856 case 36: /* show 14th track */
857 case 37: /* show 15th track */
858 case 38: /* show 16th track */
859 case 39: /* show 17th track */
860 case 40: /* show 18th track */
861 case 48: /* show 10th track */
862 case 49: /* show 1st track */
863 case 50: /* show 2nd track */
864 case 51: /* show 3rd track */
865 case 52: /* show 4th track */
866 case 53: /* show 5th track */
867 case 54: /* show 6th track */
868 case 55: /* show 7th track */
869 case 56: /* show 8th track */
870 case 57: /* show 9th track */
871 case 61: /* mute 1st track */
875 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
876 "Key scan 0x%02x 0x%02x is not supported", a, b);
877 ntr_incr(&ntr, step);
880 case 0xe6: /* MIDI channel change */
882 if(ch == 0) /* ##?? */
883 ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "MIDI channel off");
884 else if(ch >= RCP_MAXCHANNELS)
885 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
886 "RCP: Invalid channel: %d", ch);
887 ntr_incr(&ntr, step);
890 case 0xe7: /* tempo change */
893 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
894 "Invalid tempo change\n");
897 current_tempo = rcp_tempo_change(&ntr, a, b);
898 ntr_incr(&ntr, step);
901 case 0xea: /* channel after touch (channel pressure) */
903 MIDIEVENT(ntr_at(ntr), ME_CHANNEL_PRESSURE, ch, a, 0);
904 ntr_incr(&ntr, step);
907 case 0xeb: /* control change */
908 readmidi_add_ctl_event(ntr_at(ntr), ch, a, b);
909 ntr_incr(&ntr, step);
912 case 0xec: /* program change */
914 MIDIEVENT(ntr_at(ntr), ME_PROGRAM, ch, a, 0);
915 ntr_incr(&ntr, step);
918 case 0xed: /* after touch polyphonic (polyphonic key pressure) */
921 MIDIEVENT(ntr_at(ntr), ME_KEYPRESSURE, ch, a, b);
922 ntr_incr(&ntr, step);
925 case 0xee: /* pitch bend */
928 MIDIEVENT(ntr_at(ntr), ME_PITCHWHEEL, ch, a, b);
929 ntr_incr(&ntr, step);
932 case 0xf5: /* key change */
933 if (step < 0 || step >= 32) {
934 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE, "Invalid key change\n");
937 rcp_keysig_change(ntr_at(ntr), step);
940 case 0xf6: /* comment */
956 while(tf_getc(tf) == 0xf7 && len + 6 < sizeof(buff))
960 if(tf_read(buff + len, 1, 5, tf) != 5)
969 tf_getc(tf); /* 0x00 */
970 if(tf_read(buff + len, 1, 2, tf) != 2)
978 tf_seek(tf, -1, SEEK_CUR);
980 if(ctl->verbosity >= VERB_VERBOSE || opt_trace_text_meta_event)
983 for(len--; len >= 0; len--)
987 else if(buff[len] != '\0')
991 if(opt_trace_text_meta_event)
994 if(readmidi_make_string_event(ME_TEXT, buff, &ev, 1)
997 ev.time = ntr_at(ntr);
998 readmidi_add_event(&ev);
1001 else if(ctl->verbosity >= VERB_VERBOSE)
1003 len = SAFE_CONVERT_LENGTH(len+1);
1004 p = (char *)new_segment(&tmpbuffer, len);
1005 code_convert(buff, p, len, NULL, NULL);
1006 ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "Comment: %s", p);
1007 reuse_mblock(&tmpbuffer);
1012 case 0xf7: /* 2nd Event */
1013 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1014 "Something's wrong: 2nd Event is appeared");
1017 case 0xf8: /* loop end */
1018 if(ctl->verbosity >= VERB_DEBUG_SILLY)
1019 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
1021 tf_tell(tf) - track_top - cmdlen);
1023 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1024 "Misplaced loop end (ch=%d)", ch);
1025 else if(sp > MAX_STACK_DEPTH)
1026 sp--; /* through deeply loop */
1033 if(same_measure == top)
1036 tf_seek(tf, stack[sp].loop_start, SEEK_SET);
1038 goto break_loop_end;
1041 if((!gfmt && step == 0xff) || (gfmt && step == 0xffff))
1044 goto break_loop_end;
1047 if(stack[top].count >= step)
1049 #ifdef RCP_LOOP_CONT_LIMIT
1050 else if(stack[top].count >= RCP_LOOP_CONT_LIMIT)
1052 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1053 "Loop limit exceeded (ch=%d)", ch);
1056 #endif /* RCP_LOOP_CONT_LIMIT */
1057 #ifdef RCP_LOOP_TIME_LIMIT
1058 else if((current_tempo * DIV_1000000) *
1059 (ntr_at(ntr) - stack[top].start_at)
1060 / current_file_info->divisions
1061 > RCP_LOOP_TIME_LIMIT)
1063 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1064 "Loop time exceeded (ch=%d)", ch);
1067 #endif /* RCP_LOOP_TIME_LIMIT */
1071 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
1072 "Jump to %d (cnt=%d)",
1073 stack[top].loop_start - track_top,
1075 tf_seek(tf, stack[top].loop_start, SEEK_SET);
1081 case 0xf9: /* loop start */
1083 if(!gfmt && step == 0xff) /* ##?? */
1086 if(ctl->verbosity >= VERB_DEBUG_SILLY)
1087 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
1089 tf_tell(tf) - track_top - cmdlen);
1091 if(sp >= MAX_STACK_DEPTH)
1092 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1093 "Too deeply nested %d (ch=%d, Ignored this loop)",
1097 stack[sp].start_at = ntr_at(ntr);
1098 stack[sp].loop_start = tf_tell(tf);
1099 stack[sp].count = 1;
1104 case 0xfc: /* same measure */
1105 if(ctl->verbosity >= VERB_DEBUG_SILLY)
1106 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
1107 "Same measure at %d",
1108 tf_tell(tf) - track_top - cmdlen);
1109 if(sp >= MAX_STACK_DEPTH)
1110 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1111 "Too deeply nested %d (ch=%d)", sp, ch);
1116 if(same_measure >= 0)
1119 tf_seek(tf, stack[sp].loop_start, SEEK_SET);
1121 goto break_same_measure;
1129 jmp = (long)a | ((long)b << 8);
1131 if(jmp & 0x03) /* ##?? */
1133 /* What do these two bits mean? */
1134 /* Clear them here. */
1135 ctl->cmsg(CMSG_WARNING, VERB_DEBUG,
1136 "Jump %d is changed to %d",
1138 jmp &= ~3; /* jmp=(jmp/4)*4 */
1150 if(current_file_info->file_type == IS_G36_FILE)
1151 jmp = jmp * 6 - 242;
1153 jmp -= (jmp + 2) % 6; /* (jmp+2)%6==0 */
1156 if(jmp < data_top - track_top ||
1157 jmp >= last_point - track_top)
1159 ctl->cmsg(CMSG_WARNING, VERB_NOISY,
1160 "RCP Invalid same measure: %d (ch=%d)", jmp, ch);
1166 stack[sp].start_at = ntr_at(ntr);
1167 stack[sp].loop_start = tf_tell(tf);
1172 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY, "Jump to %d", jmp);
1173 tf_seek(tf, track_top + jmp, SEEK_SET);
1175 if(tf_getc(tf) == 0xfc)
1180 tf_getc(tf); /* step */
1187 tf_getc(tf); /* st1 */
1188 tf_getc(tf); /* st2 */
1189 a = gt1 = tf_getc(tf);
1190 gate = gt1 + (gt2 << 8);
1192 goto next_same_measure;
1194 tf_seek(tf, -1, SEEK_CUR);
1199 case 0xfd: /* measure end */
1200 if(same_measure >= 0)
1203 tf_seek(tf, stack[sp].loop_start, SEEK_SET);
1208 case 0xfe: /* end of track */
1211 case 0xc0: /* DX7 function */
1212 case 0xc1: /* DX parameter */
1213 case 0xc2: /* DX RERF */
1214 case 0xc3: /* TX function */
1215 case 0xc5: /* FB-01 P parameter */
1216 case 0xc6: /* FB-01 S System */
1217 case 0xc7: /* TX81Z V VCED */
1218 case 0xc8: /* TX81Z A ACED */
1219 case 0xc9: /* TX81Z P PCED */
1220 case 0xca: /* TX81Z S System */
1221 case 0xcb: /* TX81Z E EFFECT */
1222 case 0xcc: /* DX7-2 R REMOTE SW */
1223 case 0xcd: /* DX7-2 A ACED */
1224 case 0xce: /* DX7-2 P PCED */
1225 case 0xcf: /* TX802 P PCED */
1226 case 0xdc: /* MKS-7 */
1228 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1229 "RCP %s is not unsupported: "
1230 "0x%02x 0x%02x 0x%02x 0x%02x (ch=%d)",
1231 rcp_cmd_name(cmd), cmd, step, a, b, ch);
1233 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1234 "RCP %s is not unsupported: "
1235 "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x (ch=%d)",
1236 rcp_cmd_name(cmd), cmd, b, st1, st2, gt1, gt2, ch);
1237 ntr_incr(&ntr, step);
1242 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1243 "RCP Unknown Command: 0x%02x 0x%02x 0x%02x 0x%02x "
1245 cmd, step, a, b, ch);
1247 if(cmd == 0xe9 && step == 0xf0 && a == 0xe0 && b == 0x80)
1249 ctl->cmsg(CMSG_ERROR, VERB_VERBOSE,
1250 "RCP e9 f0 e0 80 is end of track ??");
1255 ctl->cmsg(CMSG_WARNING, VERB_VERBOSE,
1256 "RCP Unknown Command: "
1257 "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x (ch=%d)",
1258 cmd, b, st1, st2, gt1, gt2, ch);
1260 ntr_incr(&ntr, step);
1268 ntr_wait_all_off(&ntr);
1270 tf_seek(tf, last_point, SEEK_SET);
1274 static void ntr_init(struct RCPNoteTracer *ntr, int gfmt, int32 at)
1276 memset(ntr, 0, sizeof(*ntr));
1277 init_mblock(&ntr->pool);
1280 ntr->tempo_grade = 0;
1283 static void ntr_end(struct RCPNoteTracer *ntr)
1285 reuse_mblock(&ntr->pool);
1288 static void ntr_add(struct RCPNoteTracer *ntr, int ch, int note, int gate)
1295 ntr->freelist = ntr->freelist->next;
1298 p = (struct NoteList *)new_segment(&ntr->pool,
1299 sizeof(struct NoteList));
1303 p->next = ntr->notes;
1307 static void ntr_note_on(struct RCPNoteTracer *ntr,
1308 int ch, int note, int velo, int gate)
1312 for(p = ntr->notes; p != NULL; p = p->next)
1313 if(p->ch == ch && p->note == note)
1319 MIDIEVENT(ntr->at, ME_NOTEON, ch, note, velo);
1320 ntr_add(ntr, ch, note, gate);
1323 static void rcp_tempo_gradate(struct RCPNoteTracer *ntr, int step)
1325 int tempo_grade, tempo_step, tempo, diff, sign, at;
1327 if (step <= 0 || (tempo_grade = ntr->tempo_grade) == 0)
1329 tempo_step = ntr->tempo_step - step;
1330 if (tempo_step <= 0)
1333 diff = ntr->tempo_to - tempo;
1334 sign = (diff < 0) ? -1 : 1;
1335 diff *= sign; /* abs(diff) */
1337 while (tempo_step <= 0 && diff != 0)
1339 if (tempo_grade > diff)
1341 tempo += sign * tempo_grade;
1342 diff -= tempo_grade;
1343 rcp_tempo_set(at, tempo);
1344 at += TEMPO_GRADATION_SKIP;
1345 tempo_step += TEMPO_GRADATION_SKIP;
1349 ntr->tempo_grade = 0;
1351 ntr->tempo_step = tempo_step;
1354 static void ntr_incr(struct RCPNoteTracer *ntr, int step)
1359 for(p = ntr->notes; p != NULL; p = p->next)
1364 rcp_tempo_gradate(ntr, step);
1369 struct NoteList *p, *q;
1371 if(ntr->notes == NULL)
1382 struct NoteList *next;
1387 if(ctl->verbosity >= VERB_DEBUG_SILLY)
1388 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
1389 "NoteOff %d at %d", p->note, ntr->at);
1390 MIDIEVENT(ntr->at, ME_NOTEOFF, p->ch, p->note, 0);
1391 p->next = ntr->freelist;
1396 if(mingate > p->gate)
1411 for(p = ntr->notes; p != NULL; p = p->next)
1416 static void ntr_wait_all_off(struct RCPNoteTracer *ntr)
1421 struct NoteList *p, *q;
1428 struct NoteList *next;
1433 if(ctl->verbosity >= VERB_DEBUG_SILLY)
1434 ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY,
1435 "NoteOff %d", p->note);
1436 MIDIEVENT(ntr->at, ME_NOTEOFF, p->ch, p->note, 0);
1437 p->next = ntr->freelist;
1442 if(mingate > p->gate)
1450 for(p = ntr->notes; p != NULL; p = p->next)
1452 rcp_tempo_gradate(ntr, mingate);
1457 static int preprocess_sysex(uint8 *ex, int ch, int gt, int vel)
1459 uint8 cs = 0; /* check sum */
1463 for(i = 0; i < MAX_EXCLUSIVE_LENGTH && ex[i] != 0xf7; i++)
1468 cs += ex[len++] = gt;
1471 cs += ex[len++] = vel;
1474 cs += ex[len++] = ch;
1476 case 0x83: /* (Clear Sum) */
1478 if(ex[0] == 0x41 && len == 3 &&
1479 ex[len - 2] == 0x10 && ex[len - 1] == 0x12) /* ##?? */
1487 case 0x84: /* (Send Sum) */
1488 ex[len++] = 128 - (cs & 0x7f);
1491 cs += ex[len++] = ex[i];