int mdx_parse_mml_ym2151_make_samples(short *buffer,int buffer_size, songdata *data) { do_pcm8(buffer, buffer_size, data); return 0; }
int mdx_parse_mml_ym2151( MDX_DATA *orig_mdx, PDX_DATA *orig_pdx ) { int i; long count; struct timeval st,et; int fade_out_wait; int master_volume; int infinite_loops; __GETSELF; self->mdx = orig_mdx; self->pdx = orig_pdx; mdx_init_track_work_area_ym2151(); self->pcm8_disable=FLAG_TRUE; if ( pcm8_open(self->mdx)==0 ) { self->pcm8_disable=FLAG_FALSE; } if (!ym2151_reg_init( self->mdx )) { /* failed to initialize opm! */ pcm8_close(); return 1; } /* start parsing */ all_track_finished=FLAG_FALSE; fade_out_wait=0; master_volume=127; gettimeofday(&st, NULL); srand((int)st.tv_usec%65536); gettimeofday(&et, NULL); while(all_track_finished==FLAG_FALSE) { if ( self->fade_out > 0 ) { if ( fade_out_wait==0 ) { fade_out_wait = self->fade_out; } fade_out_wait--; if ( fade_out_wait==0 ) { master_volume--; } if ( master_volume==0 ) { break; } } ym2151_set_master_volume( master_volume * self->mdx->fm_volume / 127 ); pcm8_set_master_volume( master_volume * self->mdx->pcm_volume / 127 ); all_track_finished=FLAG_TRUE; infinite_loops = 32767; /* large enough */ for ( i=0 ; i<self->mdx->tracks ; i++ ) { if ( self->mdx->track[i].waiting_sync == FLAG_TRUE ) { continue; } count = self->mdx->track[i].counter; if ( count < 0 ) { continue; /* this track has finished */ } all_track_finished=FLAG_FALSE; self->mdx->track[i].gate--; if ( self->mdx->track[i].gate == 0 ) { note_off( i ); } if ( i<8 ) { ym2151_set_freq_volume( i ); /* do portament, lfo, detune */ } count--; while ( count == 0 ) { count=set_new_event( i ); } self->mdx->track[i].counter = count; if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) { infinite_loops = self->mdx->track[i].infinite_loop_times; } } if ( self->mdx->max_infinite_loops > 0 ) { if ( infinite_loops >= self->mdx->max_infinite_loops ) { self->fade_out = self->mdx->fade_out_speed; } } /* timer count */ self->mdx->total_count++; self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000; st.tv_usec += 1000* 1024*(256 - self->mdx->tempo)/4000; while ( st.tv_usec >= 1000*1000 ) { st.tv_usec-=1000*1000; st.tv_sec++; } while( timercmp(&st,&et,>) ) { do_pcm8(0); et.tv_usec += 1000;//PCM8_SYSTEM_RATE*1000; while ( et.tv_usec >= 1000*1000 ) { et.tv_usec-=1000*1000; et.tv_sec++; } } } //for (i=0;i<1000;i++) do_pcm8(0); do_pcm8(1); ym2151_all_note_off(); pcm8_close(); mdx_ym2151_shutdown(); return 0; }
int mdx_parse_mml_ym2151( MDX_DATA *orig_mdx, PDX_DATA *orig_pdx, songdata *data ) { int i; long count; int all_track_finished; int fade_out_wait; int master_volume; int infinite_loops; __GETSELF(data); self->mdx = orig_mdx; self->pdx = orig_pdx; mdx_init_track_work_area_ym2151(data); self->pcm8_disable=FLAG_TRUE; if ( pcm8_open(self->mdx, data)==0 ) { self->pcm8_disable=FLAG_FALSE; } if (!ym2151_reg_init( self->mdx, data )) { /* failed to initialize opm! */ return 1; } /* start parsing */ all_track_finished=FLAG_FALSE; fade_out_wait=0; master_volume=127; while(all_track_finished==FLAG_FALSE) { if ( self->fade_out > 0 ) { if ( fade_out_wait==0 ) { fade_out_wait = self->fade_out; } fade_out_wait--; if ( fade_out_wait==0 ) { master_volume--; } if ( master_volume==0 ) { break; } } ym2151_set_master_volume( master_volume * self->mdx->fm_volume / 127, data ); pcm8_set_master_volume( master_volume * self->mdx->pcm_volume / 127, data ); all_track_finished=FLAG_TRUE; infinite_loops = 32767; /* large enough */ for ( i=0 ; i<self->mdx->tracks ; i++ ) { if ( self->mdx->track[i].waiting_sync == FLAG_TRUE ) { continue; } count = self->mdx->track[i].counter; if ( count < 0 ) { continue; } /* this track has finished */ all_track_finished=FLAG_FALSE; self->mdx->track[i].gate--; if ( self->mdx->track[i].gate == 0 ) { note_off( i, data ); } if ( i<8 ) { ym2151_set_freq_volume( i, data ); /* do portament, lfo, detune */ } count--; while ( count == 0 ) { count=set_new_event( i, data ); } self->mdx->track[i].counter = count; if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) { infinite_loops = self->mdx->track[i].infinite_loop_times; } } if ( self->mdx->max_infinite_loops > 0 ) { if ( infinite_loops >= self->mdx->max_infinite_loops ) { self->fade_out = self->mdx->fade_out_speed; } } /* timer count */ self->mdx->total_count++; self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000; do_pcm8(NULL,-1, data); } ym2151_all_note_off(data); pcm8_close(data); ym2151_shutdown(data); return 0; }