static void SelectWaveAndPlayNote(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) { struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; int bank = 0x20000 + pVoice->bank*0x20000; int addr = ReadMetaDataWord(chip,4)+10*data; float pbase = (float)SAMPLE_RATE_BASE / (float)Machine->sample_rate; INT32 frequency; pVoice->flags = ReadMetaDataWord(chip,addr+0*2); pVoice->start = ReadMetaDataWord(chip,addr+3*2)*2+bank; pVoice->end = ReadMetaDataWord(chip,addr+4*2)*2+bank; pVoice->loop = pVoice->start; pVoice->start <<= FIXED_POINT_SHIFT; pVoice->end <<= FIXED_POINT_SHIFT; pVoice->loop <<= FIXED_POINT_SHIFT; pVoice->leftVolume = ReadMetaDataByte(chip,addr+1*2); pVoice->rightVolume = ReadMetaDataByte(chip,addr+1*2+1); frequency = ReadMetaDataWord(chip,addr+2*2); pVoice->delta = (long)((float)frequency * pbase); pVoice->delta >>= 16-FIXED_POINT_SHIFT; pVoice->bActive = 2; pVoice->pos = pVoice->start; } /* SelectWaveAndPlayNote */
static void PanCtrlTable(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) { struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; int addr = ReadMetaDataWord(chip,12) + data*4; pVoice->panCtrlTable = addr; pVoice->panCtrlSpeed = ReadMetaDataByte(chip,addr+3); if( pVoice->panCtrlSpeed & 0x80) pVoice->panCtrlSpeed = -(0x100 - pVoice->panCtrlSpeed); } /* PanCtrlTable */
static void MapArgs( struct sequence *pSequence, int bCommon, void (*callback)( struct sequence *, int chan, data8_t data ) ) { data8_t set = ReadMetaDataByte(pSequence->addr++); data8_t data = 0; int i; if( bCommon ) { data = ReadMetaDataByte( pSequence->addr++ ); } for( i=0; i<8; i++ ) { if( set&(1<<(7-i)) ) { if( !bCommon ) { data = ReadMetaDataByte( pSequence->addr++ ); } callback( pSequence, i, data ); } } } /* MapArgs */
static void MapArgs(struct namcona *chip, struct sequence *pSequence, int bCommon, void (*callback)( struct namcona *chip, struct sequence *, int chan, UINT8 data ) ) { UINT8 set = ReadMetaDataByte(chip,pSequence->addr++); UINT8 data = 0; int i; if( bCommon ) { data = ReadMetaDataByte( chip, pSequence->addr++ ); } for( i=0; i<8; i++ ) { if( set&(1<<(7-i)) ) { if( !bCommon ) { data = ReadMetaDataByte( chip,pSequence->addr++ ); } callback( chip, pSequence, i, data ); } } } /* MapArgs */
static void HandleRepeatOut( struct sequence *pSequence ) { int count = ReadMetaDataByte( pSequence->addr++ ); int addr = ReadMetaDataWord( pSequence->addr ); if( pSequence->count2 < count ) { pSequence->count2++; pSequence->addr += 2; } else { pSequence->count2 = 0; pSequence->addr = addr; } } /* HandleRepeatOut */
static void HandleRepeat(struct namcona *chip, struct sequence *pSequence ) { int count = ReadMetaDataByte( chip, pSequence->addr++ ); int addr = ReadMetaDataWord(chip, pSequence->addr ); if( pSequence->count < count ) { pSequence->count++; pSequence->addr = addr; } else { pSequence->count = 0; pSequence->addr += 2; } } /* HandleRepeat */
static data16_t ReadMetaDataWord( int addr ) { return ReadMetaDataByte(addr)+ReadMetaDataByte(addr+1)*256; } /* ReadMetaDataWord */
static UINT16 ReadMetaDataWord( struct namcona *chip, int addr ) { return ReadMetaDataByte(chip, addr)+ReadMetaDataByte(chip, addr+1)*256; } /* ReadMetaDataWord */