void Player_AD::setupRhythm(uint rhythmInstr, uint instrOffset) { if (rhythmInstr == 1) { setupChannel(6, _musicData + instrOffset); writeReg(0xA6, _musicData[instrOffset++]); writeReg(0xB6, _musicData[instrOffset] & 0xDF); _mdvdrState |= 0x10; writeReg(0xBD, _mdvdrState); } else if (rhythmInstr < 6) { const byte *secondOperatorOffset = _musicData + instrOffset + 8; setupOperator(_rhythmOperatorTable[rhythmInstr], secondOperatorOffset); writeReg(0xA0 + _rhythmChannelTable[rhythmInstr], _musicData[instrOffset++]); writeReg(0xB0 + _rhythmChannelTable[rhythmInstr], _musicData[instrOffset++] & 0xDF); writeReg(0xC0 + _rhythmChannelTable[rhythmInstr], _musicData[instrOffset]); _mdvdrState |= _mdvdrTable[rhythmInstr]; writeReg(0xBD, _mdvdrState); } }
void MusicPlayer::setupRhythm(uint8_t rhythmInstr, uint16_t instrOffset) { if (rhythmInstr == 1) { setupChannel(6, instrOffset); writeReg(0xA6, _file.at(instrOffset++)); writeReg(0xB6, _file.at(instrOffset) & 0xDF); _mdvdrState |= 0x10; writeReg(0xBD, _mdvdrState); } else if (rhythmInstr < 6) { uint16_t secondOperatorOffset = instrOffset + 8; setupOperator(_rhythmOperatorTable[rhythmInstr], secondOperatorOffset); writeReg(0xA0 + _rhythmChannelTable[rhythmInstr], _file.at(instrOffset++)); writeReg(0xB0 + _rhythmChannelTable[rhythmInstr], _file.at(instrOffset++) & 0xDF); writeReg(0xC0 + _rhythmChannelTable[rhythmInstr], _file.at(instrOffset)); _mdvdrState |= _mdvdrTable[rhythmInstr]; writeReg(0xBD, _mdvdrState); } else { // throw range error } }
void Player_AD::setupChannel(const uint channel, const byte *instrOffset) { instrOffset += 2; writeReg(0xC0 + channel, *instrOffset++); setupOperator(_operatorOffsetTable[channel * 2 + 0], instrOffset); setupOperator(_operatorOffsetTable[channel * 2 + 1], instrOffset); }