4 Copyright 1999 by Daisuke Nagano <breeze.nagano@nifty.ne.jp>
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28 /* ------------------------------------------------------------------- */
32 #endif /* HAVE_CONFIG_H */
42 # define strrchr rindex
49 #include "rcp_functions.h"
50 #include "gettext_wrapper.h"
53 /* ------------------------------------------------------------------- */
55 static unsigned char *rcptomid_name = (uint8*)"rcptomid";
56 static unsigned char *undefined_date = (uint8*)"2000-01-01";
57 static unsigned char *undefined_filename = (uint8*)"(NO NAME)";
59 /* ------------------------------------------------------------------- */
62 # define RCPMSG(x,y) fprintf(stderr,x,y)
68 typedef struct _TEMPO_EVENT_SEQUENCE {
75 struct _TEMPO_EVENT_SEQUENCE *next;
77 } TEMPO_EVENT_SEQUENCE;
79 /* ------------------------------------------------------------------- */
81 static TEMPO_EVENT_SEQUENCE *TES_top = (TEMPO_EVENT_SEQUENCE *)NULL;
83 /* ------------------------------------------------------------------- */
85 /* Converter engine */
87 unsigned char *rcptomid( RCP_DATA *rcp ) {
96 if ( rcptomid_init_track_buffer( rcp ) != 0 ) return NULL;
97 if ( rcptomid_read_rcp_header( rcp ) != 0 ) return NULL;
99 for ( track = 0 ; track < rcp->tracks ; track++ ) {
100 rcp->roland_dev_id = 0x10;
101 rcp->roland_model_id = 0x16;
102 rcp->yamaha_dev_id = 0x10;
103 rcp->yamaha_model_id = 0x16;
107 init_track_header( rcp, track );
108 rcp->result_smf[0] = SMF_TERM;
110 while ( rcp->track[track].finished == FLAG_FALSE ) {
112 if ( rcp->track[track].all_notes_expired == FLAG_TRUE )
113 goto rcptomid_expire_event;
115 /* checks for each notes' gate time is expired */
116 gate_min = rcp->track[track].step;
118 for ( n = rcp->track[track].notes_min ;
119 n <= rcp->track[track].notes_max ; n++ ) {
120 if ( rcp->track[track].notes[n] == 0 ) continue;
121 if ( rcp->track[track].notes[n] <= gate_min ) {
122 gate_min = rcp->track[track].notes[n];
126 if ( nt < 0 ) goto rcptomid_expire_event;
129 rcp->step += gate_min;
130 rcp->track[track].delta_step += gate_min;
131 rcp->track[track].total_step += gate_min;
132 rcp->track[track].step -= gate_min;
133 for ( n = rcp->track[track].notes_min ;
134 n <=rcp->track[track].notes_max ; n++ ) {
135 if ( rcp->track[track].notes[n] == gate_min ) {
136 rcp_note_off( rcp, track, n );
137 flush_event( rcp, track );
139 rcp->track[track].notes[n] -= gate_min;
140 if ( rcp->track[track].notes[n] < 0 ) {
141 rcp->track[track].notes[n] = 0;
146 /* checks for step time is expired */
148 rcptomid_expire_event:
150 s = rcp->track[track].step;
152 rcp->track[track].delta_step += s;
153 rcp->track[track].total_step += s;
154 rcp->track[track].step = 0;
155 for ( n = rcp->track[track].notes_min ;
156 n <=rcp->track[track].notes_max ; n++ ) {
157 rcp->track[track].notes[n] -= s;
158 if ( rcp->track[track].notes[n] < 0 ) {
159 rcp->track[track].notes[n] = 0;
162 while ( rcp->track[track].step == 0 ) {
163 rcptomid_set_new_event( rcp, track );
164 if ( rcp->track[track].finished == FLAG_FALSE )
165 flush_event( rcp, track );
171 gate_min = 65536*2; /* large enough */
172 for ( n=0 ; n<RCP_MAX_NOTES ; n++ ) {
173 if ( rcp->track[track].notes[n] <= 0 ) continue;
174 if ( rcp->track[track].notes[n] <= gate_min ) {
175 gate_min = rcp->track[track].notes[n];
178 if ( gate_min == 65536*2 ) break;
179 for ( n=0 ; n<RCP_MAX_NOTES ; n++ ) {
180 if ( rcp->track[track].notes[n] == gate_min ) {
181 rcp_note_off( rcp, track, n );
182 flush_event( rcp, track );
184 rcp->track[track].notes[n]-=gate_min;
185 if ( rcp->track[track].notes[n] < 0 )
186 rcp->track[track].notes[n] = 0;
190 rcp->result_smf[0] = MIDI_META;
191 rcp->result_smf[1] = META_EOT;
192 rcp->result_smf[2] = 0;
193 rcp->result_smf[3] = SMF_TERM;
194 flush_event( rcp, track );
197 /* set up first / tempo track */
198 set_tempo_track( rcp );
200 /* create SMF data */
201 smf = set_smf_data( rcp );
206 /* ------------------------------------------------------------------- */
208 int rcptomid_init_track_buffer( RCP_DATA *rcp ) {
212 rcp->roland_dev_id = 0x10;
213 rcp->roland_model_id = 0x16;
214 rcp->yamaha_dev_id = 0x10;
215 rcp->yamaha_model_id = 0x16;
218 rcp->result_smf[0] = SMF_TERM;
220 for ( track=0 ; track<RCP_MAX_TRACKS ; track++ ) {
221 rcp->track[track].enabled = FLAG_FALSE;
222 rcp->track[track].finished = FLAG_FALSE;
224 rcp->track[track].gate = 0;
225 rcp->track[track].step = 1;
226 rcp->track[track].delta_step = -1; /* initial value should be -1 */
227 rcp->track[track].total_step = -1;
229 rcp->track[track].yamaha_base[0] = -1; /* not specified */
230 rcp->track[track].roland_base[0] = -1; /* not specified */
232 rcp->track[track].loop_depth = 0;
233 rcp->track[track].same_measure_flag = FLAG_FALSE;
235 rcp->track[track].current_ptr = 0;
237 for ( n=0 ; n<RCP_MAX_NOTES ; n++ )
238 rcp->track[track].notes[n] = 0;
239 rcp->track[track].notes_min = 127;
240 rcp->track[track].notes_max = 0;
241 rcp->track[track].all_notes_expired = FLAG_TRUE;
243 rcp->track[track].smf =
244 (unsigned char *)malloc(sizeof(unsigned char)*RCP_DEFAULT_SMF_SIZE);
245 if ( rcp->track[track].smf == NULL ) {
249 rcp->track[track].smf_ptr = 0;
252 TES_top = (TEMPO_EVENT_SEQUENCE *)malloc(sizeof(TEMPO_EVENT_SEQUENCE));
253 if ( TES_top == (TEMPO_EVENT_SEQUENCE *)NULL ) {
257 TES_top->absolute_step = 0; /* Initial value */
258 TES_top->next = NULL;
260 rcp->smf_tempo_track = (unsigned char *)malloc(sizeof(unsigned char)*RCP_DEFAULT_SMF_SIZE);
261 if ( rcp->smf_tempo_track == (unsigned char *)NULL ) {
265 rcp->smf_tempo_track_ptr = 0;
270 int rcptomid_read_rcp_header( RCP_DATA *rcp ) {
274 int base,size,max_st;
279 /* check 1st header */
281 if ( strncmp( (char*)ptr, RCP_HEADER_STRING, 28 ) ==0 ) {
282 rcp->rcp = FLAG_TRUE;
283 rcp->g36 = FLAG_FALSE;
284 } else if ( strncmp( (char*)ptr, STEDDATA_HEADER_STRING, 8 ) ==0 &&
285 strncmp( (char*)ptr+12, (char*)STEDDATA_HEADER_STRING+12, 16 ) ==0 ) {
286 rcp->steddata = FLAG_TRUE;
287 rcp->rcp = FLAG_TRUE;
288 rcp->g36 = FLAG_FALSE;
295 for ( i=0 ; i<65 ; i++ )
296 rcp->title[i] = '\0';
297 for ( i=0 ; i<337 ; i++ )
299 memcpy( rcp->title, ptr+0x0020, 64 ); /* It should be SJIS */
300 memcpy( rcp->memo, ptr+0x0060, 336 ); /* It should be SJIS */
302 /* timebase, tempo, etc */
304 rcp->timebase = ptr[0x01c0] + ptr[0x01e7]*256;
305 if ( rcp->timebase>480 || rcp->timebase<0 ) return 1;
306 rcp->tempo = ptr[0x01c1];
307 rcp->realtempo = ptr[0x01c1];
308 rcp->beat_h = ptr[0x01c2];
309 rcp->beat_l = ptr[0x01c3];
310 rcp->key = ptr[0x01c4];
311 rcp->play_bias = ptr[0x01c5];
312 rcp->rtm_delta = rcp->timebase / 24;
314 rcp->tracks = ptr[0x01e6];
315 if ( rcp->tracks == 0 ) rcp->tracks = 18;
316 /*if ( rcp->tracks !=18 && rcp->tracks !=36 ) return 1;*/
318 t = 1000 * 1000 * 60 / rcp->tempo;
319 TES_top->t1 = (int)((t>>16)&0xff);
320 TES_top->t2 = (int)((t>> 8)&0xff);
321 TES_top->t3 = (int)(t&0xff);
323 RCPMSG("TITLE : %s\n", rcp->title);
324 RCPMSG("MEMO : %s\n", rcp->memo);
325 RCPMSG("TIMEBASE : %d\n", rcp->timebase);
326 RCPMSG("TEMPO : %d\n", rcp->tempo);
327 RCPMSG("BEAT_H : %d\n", rcp->beat_h);
328 RCPMSG("BEAT_L : %d\n", rcp->beat_l);
329 RCPMSG("KEY : %d\n", rcp->key);
330 RCPMSG("PLAY BIAS : %d\n", rcp->play_bias);
331 RCPMSG("TRACKS : %d\n\n", rcp->tracks);
333 /* user exclusive definition */
335 for ( i=0 ; i<RCP_MAX_USER_EXCLUSIVE ; i++ ) {
336 for ( j=0 ; j<RCP_USER_EXCLUSIVE_SIZE ; j++ ) {
337 rcp->user_exclusive[i][j] = ptr[0x0406 + i*48 + 24+j];
346 for ( t=0 ; t<rcp->tracks ; t++ ) {
350 rcp->track[t].top = base;
352 size = ptr[base+0] + ptr[base+1]*256;
353 rcp->track[t].size = size;
357 rcp->track[t].enabled = FLAG_FALSE;
358 rcp->track[t].midi_ch = 0;
359 rcp->track[t].port = 0;
362 rcp->track[t].enabled = FLAG_TRUE;
363 rcp->track[t].midi_ch = ch&0x0f;
364 if ( rcp->steddata ) {
365 rcp->track[t].port = ch>>4&0x0f;
367 rcp->track[t].port = ch>0x10 ? 1:0;
371 if ( ptr[base+5] >= 0x80 )
372 rcp->track[t].key = 0x80;
374 if ( ptr[base+5] > 63 )
375 rcp->track[t].key = ptr[base+5]-128;
377 rcp->track[t].key = ptr[base+5];
379 rcp->track[t].st = ptr[base+6];
380 rcp->track[t].mode = ptr[base+7];
382 i = (rcp->track[t].st > 0x7f) ? rcp->track[t].st-0x100:0;
383 if ( max_st > i ) max_st = i;
385 if ( rcp->track[t].mode == 1 )
386 rcp->track[t].enabled = FLAG_FALSE;
388 for ( j=0 ; j<RCP_MAX_COMMENT_SIZE ; j++ ) {
389 rcp->track[t].comment[j] = ptr[base+8+j]; /* It should be SJIS */
392 rcp->track[t].current_ptr = base+8+RCP_MAX_COMMENT_SIZE;
394 RCPMSG("Track : %d\n", t);
395 RCPMSG("Base : %d\n", rcp->track[t].top);
396 RCPMSG("Size : %d\n", rcp->track[t].size);
397 RCPMSG("MIDI CH : %d\n", rcp->track[t].midi_ch);
398 RCPMSG("Key : %d\n", rcp->track[t].key);
399 RCPMSG("ST : %d\n", rcp->track[t].st);
400 RCPMSG("Mode : %d\n", rcp->track[t].mode);
401 RCPMSG("Comment : %s\n\n", rcp->track[t].comment);
404 for ( t=0 ; t<rcp->tracks ; t++ ) {
405 i = rcp->track[t].st > 0x7f ? rcp->track[t].st - 0x100 : rcp->track[t].st;
406 rcp->track[t].step = 1+i-max_st;
412 int init_track_header( RCP_DATA *rcp, int track ) {
416 if ( rcp->track[track].enabled == FLAG_FALSE ) return 0;
420 rcp->result_smf[i++] = MIDI_META;
421 rcp->result_smf[i++] = META_SEQNAME;
422 rcp->result_smf[i++] = RCP_MAX_COMMENT_SIZE;
423 for ( j=0 ; j<RCP_MAX_COMMENT_SIZE ; j++ ) {
424 unsigned char c = rcp->track[track].comment[j];
425 if ( c == 0 ) c = 0x20;
426 rcp->result_smf[i++] = c;
429 #ifdef ENABLE_PORT_CHANGE
431 rcp->result_smf[i++] = 0; /* delta time = 0 */
432 rcp->result_smf[i++] = MIDI_META;
433 rcp->result_smf[i++] = META_PORT;
434 rcp->result_smf[i++] = 1; /* one byte follow */
435 rcp->result_smf[i++] = rcp->track[track].port;
436 #endif /* ENABLE_PORT_CHANGE */
438 rcp->result_smf[i++] = SMF_TERM;
439 rcp->track[track].delta_step = 0;
440 flush_event( rcp, track );
443 rcp->track[track].delta_step = -1;
448 int rcptomid_set_new_event( RCP_DATA *rcp, int t ) {
456 ptr = rcp->track[t].current_ptr;
458 if ( ptr > rcp->track[t].top + rcp->track[t].size ) {
459 rcp->track[t].finished = FLAG_TRUE;
463 rcp->track[t].event = data[ptr+0];
464 rcp->track[t].step = data[ptr+1];
465 rcp->track[t].gate = data[ptr+2];
466 rcp->track[t].vel = data[ptr+3];
469 fprintf(stderr,"%d : %02x %d %d %d\n", t,
476 if ( rcp->track[t].event < 0x80 ) { /* note event */
477 rcp_note_on( rcp, t );
479 switch ( rcp->track[t].event ) {
481 case RCP_USER_EXCLUSIVE_1:
482 case RCP_USER_EXCLUSIVE_2:
483 case RCP_USER_EXCLUSIVE_3:
484 case RCP_USER_EXCLUSIVE_4:
485 case RCP_USER_EXCLUSIVE_5:
486 case RCP_USER_EXCLUSIVE_6:
487 case RCP_USER_EXCLUSIVE_7:
488 case RCP_USER_EXCLUSIVE_8:
489 rcp_user_exclusive( rcp, t );
492 case RCP_CH_EXCLUSIVE:
493 rcp_ch_exclusive( rcp, t );
496 case RCP_EXEC_EXTERN_PROG:
497 rcp_exec_extern_prog( rcp, t );
501 case RCP_BANK_AND_PROG:
502 rcp_bank_and_prog( rcp, t );
506 rcp_key_scan( rcp, t );
509 case RCP_MIDI_CH_CHANGE:
510 rcp_midi_ch_change( rcp, t );
513 case RCP_TEMPO_CHANGE:
514 rcp_tempo_change( rcp, t );
517 case RCP_AFTER_TOUCH:
518 rcp_after_touch( rcp, t );
521 case RCP_CONTROL_CHANGE:
522 rcp_control_change( rcp, t );
525 case RCP_PROGRAM_CHANGE:
526 rcp_program_change( rcp, t );
529 case RCP_AFTER_TOUCH_POLY:
530 rcp_after_touch_poly( rcp, t );
534 rcp_pitch_bend( rcp, t );
537 case RCP_YAMAHA_BASE:
538 rcp_yamaha_base( rcp, t );
541 case RCP_YAMAHA_DEV_NUM:
542 rcp_yamaha_dev_name( rcp, t );
545 case RCP_YAMAHA_ADDR:
546 rcp_yamaha_addr( rcp, t );
549 case RCP_YAMAHA_XG_AD:
550 rcp_yamaha_xg_ad( rcp, t );
553 case RCP_ROLAND_BASE:
554 rcp_roland_base( rcp, t );
557 case RCP_ROLAND_PARA:
558 rcp_roland_para( rcp, t );
562 rcp_roland_dev( rcp, t );
566 rcp_key_change( rcp, t );
570 case RCP_COMMENT_START:
571 rcp_comment_start( rcp, t );
576 rcp_loop_end( rcp, t );
581 rcp_loop_start( rcp, t );
585 case RCP_SAME_MEASURE:
586 rcp_same_measure( rcp, t );
590 case RCP_MEASURE_END:
591 rcp_measure_end( rcp, t );
595 case RCP_END_OF_TRACK:
596 rcp_end_of_track( rcp, t );
600 case RCP_DX7_FUNCTION:
601 rcp_dx7_function( rcp, t );
604 case RCP_DX_PARAMETER:
605 rcp_dx_parameter( rcp, t );
609 rcp_dx_rerf( rcp, t );
612 case RCP_TX_FUNCTION:
613 rcp_tx_function( rcp, t );
616 case RCP_FB01_PARAMETER:
617 rcp_fb01_parameter( rcp, t );
620 case RCP_FB01_SYSTEM:
621 rcp_fb01_system( rcp, t );
625 rcp_tx81z_vced( rcp, t );
629 rcp_tx81z_aced( rcp, t );
633 rcp_tx81z_pced( rcp, t );
636 case RCP_TX81Z_SYSTEM:
637 rcp_tx81z_system( rcp, t );
640 case RCP_TX81Z_EFFECT:
641 rcp_tx81z_effect( rcp, t );
644 case RCP_DX7_2_REMOTE_SW:
645 rcp_dx7_2_remote_sw( rcp, t );
649 rcp_dx7_2_aced( rcp, t );
653 rcp_dx7_2_pced( rcp, t );
657 rcp_tx802_pced( rcp, t );
675 rcp->track[t].step = 0;
677 ptr=rcp->track[t].current_ptr;
679 if ( ptr >= rcp->track[t].top + rcp->track[t].size ||
681 rcp->track[t].finished = FLAG_TRUE;
682 rcp->track[t].step=-1;
685 rcp->track[t].current_ptr = ptr;
690 int flush_event( RCP_DATA *rcp, int track ) {
695 if ( rcp->result_smf[0] == SMF_TERM ) return 0;
697 /* is the event set-tempo ? */
698 if ( rcp->result_smf[0] == MIDI_META &&
699 rcp->result_smf[1] == META_TEMPO ) {
701 insert_tempo_event( rcp );
702 goto flush_event_end;
705 /* is the track disabled ? */
706 if ( rcp->track[track].enabled == FLAG_FALSE &&
707 rcp->result_smf[0] != MIDI_NOTEOFF ) {
708 goto flush_event_end;
711 /* flushing smf data */
713 ptr = rcp->track[track].smf_ptr;
715 if ( rcp->track[track].delta_step < 0 ) {
716 fprintf(stderr,"%d\n",(int)rcp->track[track].delta_step);
719 len = smf_number_conversion( rcp->track[track].delta_step );
721 rcp->track[track].smf[ptr++] = len[i];
722 if ( (ptr % RCP_DEFAULT_SMF_SIZE) == 0 ) {
724 size = (1+ptr/RCP_DEFAULT_SMF_SIZE) * RCP_DEFAULT_SMF_SIZE;
725 if ( (rcp->track[track].smf = (uint8*)realloc( rcp->track[track].smf,
726 sizeof(unsigned char)*size )) == (unsigned char *)NULL ) {
731 } while ( len[i++] >= 0x80 );
734 while ( rcp->result_smf[i] != SMF_TERM ) {
735 rcp->track[track].smf[ptr++] = rcp->result_smf[i++];
737 if ( (ptr % RCP_DEFAULT_SMF_SIZE) == 0 ) {
739 size = (1+ptr/RCP_DEFAULT_SMF_SIZE) * RCP_DEFAULT_SMF_SIZE;
740 if ( (rcp->track[track].smf = (uint8*)realloc( rcp->track[track].smf,
741 sizeof(unsigned char)*size )) == (unsigned char *)NULL ) {
747 rcp->track[track].smf_ptr = ptr;
748 rcp->track[track].delta_step = 0;
751 rcp->result_smf[0] = SMF_TERM;
756 int insert_tempo_event( RCP_DATA *rcp ) {
758 TEMPO_EVENT_SEQUENCE *t, *t_last, *t_new;
760 t_new = (TEMPO_EVENT_SEQUENCE *)malloc(sizeof(TEMPO_EVENT_SEQUENCE));
761 if ( t_new == (TEMPO_EVENT_SEQUENCE *)NULL ) {
765 t_new->absolute_step = rcp->step;
766 t_new->t1 = rcp->result_smf[3];
767 t_new->t2 = rcp->result_smf[4];
768 t_new->t3 = rcp->result_smf[5];
772 while ( t != (TEMPO_EVENT_SEQUENCE *)NULL ) {
773 if ( t->absolute_step > t_new->absolute_step ) break;
778 t_last->next = t_new;
784 int set_tempo_track ( RCP_DATA *rcp ) {
786 TEMPO_EVENT_SEQUENCE *t = TES_top, *tn;
791 unsigned char buf[1024];
793 p = rcp->smf_tempo_track_ptr;
794 data = rcp->smf_tempo_track;
800 data[p++] = MIDI_META;
801 data[p++] = META_SEQNAME;
802 for ( i=0 ; i<64 ; i++ ) {
803 unsigned char c = rcp->title[i];
807 for ( j=0 ; j<i ; j++ ) {
808 data[p++] = rcp->title[j];
811 /* Copyright notice */
812 if ( rcp->copyright != NULL ) {
814 data[p++] = MIDI_META;
815 data[p++] = META_COPYRIGHT;
817 while ( rcp->copyright[i++] != 0 );
819 for ( j=0 ; j<i ; j++ ) {
820 data[p++] = rcp->copyright[j];
824 /* converter notice */
825 if ( rcp->enable_converter_notice == FLAG_TRUE ) {
828 sprintf( (char*)buf,"\nThis file was converted by %s version %s (%s - %s).\nOriginal RCP file is \"%s\" (%s, %d bytes).",
829 (rcp->command_name!=NULL)?rcp->command_name:rcptomid_name,
830 VERSION_ID, VERSION_TEXT1, VERSION_TEXT2,
831 (rcp->file_name!=NULL)?rcp->file_name:undefined_filename,
832 (rcp->date!=NULL)?rcp->date:undefined_date,
836 while ( buf[i]!=0 ) i++;
838 data[p++] = 0; /* delta time = 0 */
839 data[p++] = MIDI_META;
840 data[p++] = META_TEXT;
842 len = smf_number_conversion( i );
846 } while ( len[j++] >= 0x80 );
848 for ( j=0 ; j<i ; j++ ) {
855 j = rcp->key > 0x0f ? 1:0;
857 if ( i > 0x07 ) i = (0x100-i)%0x100;
860 data[p++] = MIDI_META;
861 data[p++] = META_KEYSIG;
870 data[p++] = MIDI_META;
871 data[p++] = META_TIMESIG;
881 dt = t->absolute_step;
882 while ( t != NULL ) {
883 k = p / RCP_DEFAULT_SMF_SIZE;
885 d = smf_number_conversion((long)dt);
889 } while ( d[i++] >= 0x80 );
891 data[p++] = MIDI_META;
892 data[p++] = META_TEMPO;
897 if ( p > RCP_DEFAULT_SMF_SIZE*(k+1) ) {
899 size = (1+p/RCP_DEFAULT_SMF_SIZE) * RCP_DEFAULT_SMF_SIZE;
900 if ( (rcp->smf_tempo_track = (uint8*)realloc( rcp->smf_tempo_track,
901 sizeof(unsigned char)*size )) == (unsigned char *)NULL ) {
907 if ( t->next != NULL )
908 dt = t->next->absolute_step - t->absolute_step;
913 data[p++] = MIDI_META;
914 data[p++] = META_EOT;
917 rcp->smf_tempo_track_ptr = p;
920 while ( t != NULL ) {
929 unsigned char *set_smf_data( RCP_DATA *rcp ) {
932 unsigned char *smf_data;
937 /* Allocate memory for SMF data */
939 smf_size = SMF_MTHD_HEADER_SIZE +
940 4+rcp->smf_tempo_track_ptr;
942 for (t=0 ; t<rcp->tracks ; t++ ) {
943 if ( rcp->track[t].enabled == FLAG_TRUE ) {
944 smf_size += 4+rcp->track[t].smf_ptr + 256;
948 if ( smf_size > 0xffffffffL ) return NULL;
949 smf_data = (unsigned char *)malloc(sizeof(unsigned char *) * smf_size);
950 if ( smf_data == (unsigned char *)NULL )
953 /* Set Header Chunk */
955 smf_data[0] = 'M'; /* Chunk type */
965 smf_data[8] = 0; /* Data format ( format 1 ) */
968 smf_data[10] = tr / 256;
969 smf_data[11] = tr % 256;
971 smf_data[12] = rcp->timebase / 256;
972 smf_data[13] = rcp->timebase % 256;
974 /* Set first Track Chunk ( tempo track ) */
977 smf_data[ptr++] = 'M';
978 smf_data[ptr++] = 'T';
979 smf_data[ptr++] = 'r';
980 smf_data[ptr++] = 'k';
982 smf_data[ptr++] = (rcp->smf_tempo_track_ptr>>24)&0xff;
983 smf_data[ptr++] = (rcp->smf_tempo_track_ptr>>16)&0xff;
984 smf_data[ptr++] = (rcp->smf_tempo_track_ptr>>8 )&0xff;
985 smf_data[ptr++] = (rcp->smf_tempo_track_ptr )&0xff;
987 for ( i=0 ; i<rcp->smf_tempo_track_ptr ; i++ ) {
988 smf_data[ptr++] = rcp->smf_tempo_track[i];
991 /* Set all other Track Chunk ( Music track ) */
993 for ( t=0 ; t<rcp->tracks ; t++ ) {
994 if ( rcp->track[t].enabled == FLAG_FALSE ) continue;
996 smf_data[ptr++] = 'M';
997 smf_data[ptr++] = 'T';
998 smf_data[ptr++] = 'r';
999 smf_data[ptr++] = 'k';
1001 smf_data[ptr++] = (rcp->track[t].smf_ptr>>24)&0xff;
1002 smf_data[ptr++] = (rcp->track[t].smf_ptr>>16)&0xff;
1003 smf_data[ptr++] = (rcp->track[t].smf_ptr>>8 )&0xff;
1004 smf_data[ptr++] = (rcp->track[t].smf_ptr )&0xff;
1006 for ( i=0 ; i<rcp->track[t].smf_ptr ; i++ ) {
1007 smf_data[ptr++] = rcp->track[t].smf[i];
1011 /* free all smf data */
1013 free(rcp->smf_tempo_track);
1015 for ( t=0 ; t<RCP_MAX_TRACKS ; t++ ) {
1016 /*fprintf(stderr,"%d: %d\n", t, rcp->track[t].smf_ptr);*/
1017 if ( rcp->track[t].smf != NULL )
1018 free(rcp->track[t].smf);
1020 rcp->smf_size = ptr;
1021 rcp->smf_data = smf_data;
1024 smf_data[4] = (rcp->smf_size / (256*256*256)) % 256; /* Data length */
1025 smf_data[5] = (rcp->smf_size / (256*256)) % 256;
1026 smf_data[6] = (rcp->smf_size / 256) % 256;
1027 smf_data[7] = (rcp->smf_size) % 256;