protected override void UpdateNote() { patternDelay = 0; for (int ch = 0; ch < module.numberOfChannels; ch++) { MOD_MixerChannel mc = (MOD_MixerChannel)mixChannels[ch]; MOD_PatternChannel pe = (MOD_PatternChannel)pattern.patternRows[(int)currentRow].patternChannels[ch]; mc.patternChannel = pe; mc.effect = pe.effekt; mc.effectArg = pe.effektOp; mc.effectArgX = (mc.effectArg & 0xF0) >> 4; mc.effectArgY = mc.effectArg & 0x0F; if (pe.instrumentIndex > 0 && pe.period > 0) { mc.instrumentLastIndex = mc.instrumentIndex; mc.instrumentIndex = pe.instrumentIndex; ResetChannelInstrument(mc); mc.channelVolume = module.Instruments[(int)mc.instrumentIndex - 1].volume; mc.portamentoStart = (int)mc.period; mc.noteIndex = ModuleConst.GetNoteIndexForPeriod((int)pe.period); mc.period = GetNoteFreq(mc.noteIndex, mc.currentFineTune); mc.portamentoEnd = (int)mc.period; mc.periodInc = CalcClampPeriodIncrement(mc); } if (pe.instrumentIndex > 0 && pe.period == 0 && pe.instrumentIndex != mc.instrumentLastIndex) { mc.instrumentLastIndex = pe.instrumentIndex; mc.instrumentIndex = pe.instrumentIndex; ResetChannelInstrument(mc); mc.channelVolume = module.Instruments[(int)mc.instrumentIndex - 1].volume; } if (pe.instrumentIndex > 0 && pe.period == 0 && pe.instrumentIndex == mc.instrumentLastIndex) { mc.channelVolume = module.Instruments[(int)mc.instrumentIndex - 1].volume; } if (pe.instrumentIndex == 0 && pe.period > 0) { mc.portamentoStart = (int)mc.period; mc.noteIndex = ModuleConst.GetNoteIndexForPeriod((int)pe.period); mc.period = GetNoteFreq(mc.noteIndex, mc.currentFineTune); mc.portamentoEnd = (int)mc.period; mc.periodInc = CalcClampPeriodIncrement(mc); ResetChannelInstrument(mc); } } NextRow(); }
private MOD_PatternChannel CreateNewPatternChannel(Stream stream, uint numberOfSamples) { MOD_PatternChannel channel = new MOD_PatternChannel(); uint b0 = (uint)stream.ReadByte(); uint b1 = (uint)stream.ReadByte(); uint b2 = (uint)stream.ReadByte(); uint b3 = (uint)stream.ReadByte(); channel.instrumentIndex = (byte)(((b0 & 0xF0) | ((b2 & 0xF0) >> 4)) & numberOfSamples); channel.period = (uint)(((b0 & 0x0F) << 8) | b1); if (channel.period > 0) { channel.noteIndex = ModuleConst.GetNoteIndexForPeriod((int)channel.period); } channel.effekt = b2 & 0x0F; channel.effektOp = b3; return(channel); }