我正在制作一个生成 .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)) )))))
但它并没有做我想做的事:将所有字节数组连接到一个向量中,然后连接到一个单字节数组中。对我来说为什么不能这样做是有道理的:它不能连接/展平一个字节[],因为它不是向量;这是一个字节[]。而且它不能将 byte[] 转换为 byte。但是我需要做什么才能让它工作?