diff --git a/src/apu.rs b/src/apu.rs
index 349232a7d3ec5c9f568a845656cf825a24044431..0e1b92ef824b3f9afccaed3f122b4983c204b655 100644
--- a/src/apu.rs
+++ b/src/apu.rs
@@ -146,9 +146,27 @@ impl Apu {
 
     #[inline(always)]
     pub fn cycle(&mut self, freq: u32) {
+        self.ch1_timer = self.ch1_timer.saturating_sub(1);
+        if self.ch1_timer == 0 {
+            let target_freq = 1048576.0 / (2048.0 - self.ch1_wave_length as f32);
+            self.ch1_timer = (freq as f32 / target_freq) as u16;
+            self.ch1_sequence = (self.ch1_sequence + 1) & 7;
+
+            if self.ch1_enabled {
+                self.ch1_output =
+                    if DUTY_TABLE[self.ch1_wave_duty as usize][self.ch1_sequence as usize] == 1 {
+                        self.ch1_volume
+                    } else {
+                        0
+                    };
+            } else {
+                self.ch1_output = 0;
+            }
+        }
+
         self.ch2_timer = self.ch2_timer.saturating_sub(1);
         if self.ch2_timer == 0 {
-            let target_freq = 1048576.0 / (2048.0 - self.ch1_wave_length as f32);
+            let target_freq = 1048576.0 / (2048.0 - self.ch2_wave_length as f32);
             self.ch2_timer = (freq as f32 / target_freq) as u16;
             self.ch2_sequence = (self.ch2_sequence + 1) & 7;
 
@@ -166,6 +184,6 @@ impl Apu {
     }
 
     pub fn output(&self) -> u8 {
-        self.ch2_output
+        self.ch1_output + self.ch2_output
     }
 }