Exemple #1
0
 private void UpdateSquareWave_(Channel channel, int total_frames)
 {
     if (channel.status)
     {
         var square = channel.square_wave;
         while (total_frames > 0)
         {
             int  frames = (int)(square.ticks / APU_TICKS);
             byte sample = Apu.CHANNELX_SAMPLE(channel, square.sample);
             if (frames <= total_frames)
             {
                 square.ticks    = square.period;
                 square.position = (byte)((square.position + 1) % DUTY_CYCLE_COUNT);
                 square.sample   = Apu.GetDuty(square.duty, square.position);
             }
             else
             {
                 frames        = total_frames;
                 square.ticks -= (uint)frames * APU_TICKS;
             }
             channel.accumulator += sample * (uint)frames;
             total_frames        -= frames;
         }
     }
 }