# HG changeset patch # User Robert McIntyre # Date 1340562855 18000 # Node ID 2620d6318e8dba55bbb6423dd5c2c14e08320082 # Parent fa7676dbf6f2352c625f320aa72d2cefcfd57425 sound recording complete. diff -r fa7676dbf6f2 -r 2620d6318e8d clojure/com/aurellem/gb/gb_driver.clj --- a/clojure/com/aurellem/gb/gb_driver.clj Sun Jun 24 13:12:51 2012 -0500 +++ b/clojure/com/aurellem/gb/gb_driver.clj Sun Jun 24 13:34:15 2012 -0500 @@ -1,6 +1,7 @@ (ns com.aurellem.gb.gb-driver (:import com.aurellem.gb.Gb) (:import java.io.File) + (:import javax.sound.sampled.AudioFormat) (:import org.apache.commons.io.FileUtils) (:import (java.nio IntBuffer ByteOrder))) @@ -193,21 +194,21 @@ ([new-data] (store-data @current-state new-data)))) -(let [store (byte-array Gb/SOUND_SIZE)] - (defn sound-data - ([](sound-data @current-state)) +(def gb-sound-format + "44100 hertz, linear PCM, 2 channels with 16 bits per sample." + (AudioFormat. 44100 16 2 true false)) + +(let [store (byte-array Gb/MAX_SOUND_BYTES)] + (defn sound-bytes + "Returns a byte array containting the sound samples + generated this step." + ([](sound-bytes @current-state)) ([state] (set-state! state) (Gb/getFrameSound store) - store))) - -(let [store (byte-array (* 1470 2))] - (defn sound-data-2 - ([](sound-data-2 @current-state)) - ([state] - (set-state! state) - (Gb/getFrameSound2 store) - store))) + (let [actual-bytes (* 2 (Gb/getSoundFrameWritten))] + (Gb/setSoundFrameWritten 0) + (byte-array (take actual-bytes store)))))) (def memory (cpu-data Gb/GB_MEMORY #(Gb/getMemory %))) diff -r fa7676dbf6f2 -r 2620d6318e8d clojure/com/aurellem/run/sound.clj --- a/clojure/com/aurellem/run/sound.clj Sun Jun 24 13:12:51 2012 -0500 +++ b/clojure/com/aurellem/run/sound.clj Sun Jun 24 13:34:15 2012 -0500 @@ -8,45 +8,50 @@ (:import [com.aurellem.gb.gb_driver SaveState]) (:import java.awt.image.BufferedImage) (:import java.io.File) - (:import javax.sound.sampled.AudioFormat) + (:import com.aurellem.gb.WaveWriter)) (defn sound-test [] (step (mid-game)) - (println (frequencies (sound-data))) + (println (frequencies (sound-bytes))) (run-moves @current-state (repeat 10 [])) - (println (frequencies (sound-data)))) + (println (frequencies (sound-bytes)))) -(def probable-format (AudioFormat. 44100 16 2 true false)) +(defn record-sound! + ([^File target-file state n] + (set-state! state) + (let [writer (WaveWriter. target-file)] + (dorun + (for [y (range n)] + (do (step) + (.process writer + (sound-bytes) + gb-sound-format)))) + (.cleanup writer) + (Thread/sleep 1000) + (clojure.java.shell/sh + "aplay" + (.getCanonicalPath target-file)))) + ([n] (record-sound! + (File. "/home/r/proj/vba-clojure/sounds/test-sound.wav") + (play-midi pony-csv) n))) -(defn test-writing-file! [n] - (set-state! (play-midi pony-csv)) - (let [target-file - (File. "/home/r/proj/vba-clojure/test-sound.wav") - writer (WaveWriter. target-file)] - (dorun - (for [y (range n)] - (do - (let [quanta 1] - (run-moves @current-state (repeat quanta [])) - (let [ - - data (sound-data) - bytes (* 2 (com.aurellem.gb.Gb/getSoundFrameWritten)) - step-section - (byte-array - (take (* bytes quanta) data)) +(defn gen-pony! [] + (record-sound! + (File. user-home "proj/vba-clojure/sounds/pony.wav") + (play-midi pony-csv) + 1800)) +(defn gen-regret! [] + (record-sound! + (File. user-home "proj/vba-clojure/sounds/regret.wav") + (play-midi regret-csv) + 3380)) - ] - (com.aurellem.gb.Gb/setSoundFrameWritten 0) - (.process writer - ;;data - step-section - probable-format)))))) - (.cleanup writer) - (Thread/sleep 1000) - (clojure.java.shell/sh - "aplay" - (.getCanonicalPath target-file)))) +(defn gen-mother! [] + (record-sound! + (File. user-home "proj/vba-clojure/sounds/mother.wav") + (play-midi mother-csv) + 2200)) + diff -r fa7676dbf6f2 -r 2620d6318e8d java/src/com/aurellem/gb/Gb.java --- a/java/src/com/aurellem/gb/Gb.java Sun Jun 24 13:12:51 2012 -0500 +++ b/java/src/com/aurellem/gb/Gb.java Sun Jun 24 13:34:15 2012 -0500 @@ -101,9 +101,7 @@ public static final int GB_MEMORY = 0x10000; - public static final int SOUND_SIZE = - 44100*2; - //1470*2; + public static final int MAX_SOUND_BYTES = 44100*2; public static native void getMemory(int[] store); diff -r fa7676dbf6f2 -r 2620d6318e8d sounds/mother.wav Binary file sounds/mother.wav has changed diff -r fa7676dbf6f2 -r 2620d6318e8d sounds/pony.wav Binary file sounds/pony.wav has changed diff -r fa7676dbf6f2 -r 2620d6318e8d sounds/regret.wav Binary file sounds/regret.wav has changed diff -r fa7676dbf6f2 -r 2620d6318e8d test-sound.wav Binary file test-sound.wav has changed diff -r fa7676dbf6f2 -r 2620d6318e8d todo.org --- a/todo.org Sun Jun 24 13:12:51 2012 -0500 +++ b/todo.org Sun Jun 24 13:34:15 2012 -0500 @@ -1,7 +1,7 @@ -* vba-clojure [1/7] +* vba-clojure [2/7] - [X] create ram display - [ ] derpy hack - - [ ] sound recording + - [X] sound recording - [ ] fix unnecessary pauses before take-over - [ ] design demo choreography - [ ] implement choreography