我正在生成一個生成.wav文件的函數。我有所有的標題,但我遇到了data
本身的麻煩。我有一個以880Hz的頻率創建正弦波的函數(至少我認爲這就是它的作用,但這不是我的問題) - 問題是,如何將字節數組的集合轉換爲一個字節數組及其內容?這是我最好的嘗試:如何連接/拼合字節數組
(defn lil-endian-bytes [i]
(let [i (int i)]
(byte-array
(map #(.byteValue %)
[(bit-and i 0x000000ff)
(bit-shift-right (bit-and i 0x0000ff00) 8)
(bit-shift-right (bit-and i 0x00ff0000) 16)
(bit-shift-right (bit-and i 0xff000000) 24)]))))
(def leb lil-endian-bytes)
(let [wr (io/output-stream (str name ".wav") :append true)]
(.write wr
(byte-array (flatten (concat (map
(fn [sample] (leb (* 0xffff (math/sin (+ (* 2 3.14 880) sample)))))
(range (* duration s-rate)))))))
但它不會做我想做的事情:CONCAT所有的字節數組到一個載體,然後到一個單一的字節數組。它對我來說很重要,爲什麼它不能:它不能連接/壓扁一個字節[],因爲它不是一個向量;它是一個字節[]。它不能將一個字節[]轉換爲一個字節。但是,我需要做些什麼來實現這個目標?
好,這實際上並沒有做任何事情比我已經在做,除非有一些神奇的一個本應在發生不同'seq'功能。如果是這樣,那有什麼魔力? – tjb1982 2013-05-06 13:55:41
在你的代碼中,它看起來像你在調用'(concat sequence-of-byte-arrays)'而不是'(concat byte-array-1 byte-array-2 ...)'。你可以用'(apply concat(map ...))'或者'mapcat'來解決這個問題。 – ToBeReplaced 2013-05-06 14:25:16