Example #1
0
void* mdx_parse_mml_ym2151_async_initialize(MDX_DATA *orig_mdx, PDX_DATA *orig_pdx) {
    __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! */
        return NULL;
    }

    /* start parsing */

    self->all_track_finished=FLAG_FALSE;
    self->fade_out_wait=0;
    self->master_volume=127;

    return (void *)self;
}
Example #2
0
int mdx_parse_mml_ym2151_async_get_length(songdata *data)
{
  int next,sec;
  
  __GETSELF(data)
  
  next = 1;
  while(next && self->mdx->elapsed_time < (1200 * 1000000))
  {
	next = mdx_parse_mml_ym2151_async(data);
  }
  
  sec = (int)self->mdx->elapsed_time / 1000000;

  /* stop */
  ym2151_all_note_off(data);

  /* reinitialize */ 
  mdx_init_track_work_area_ym2151(data);
  pcm8_init(data);
  
  if (!ym2151_reg_init( self->mdx, data )) {
    /* failed to initialize opm! */
    return 0;
  }
  
  
  /* start parsing */

  self->all_track_finished=FLAG_FALSE;
  self->fade_out_wait=0;
  self->master_volume=127;
  
  return sec;
}
Example #3
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;
}
Example #4
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;
}