{"id":370,"date":"2012-08-03T11:10:24","date_gmt":"2012-08-03T11:10:24","guid":{"rendered":"http:\/\/garysieling.com\/blog\/?p=370"},"modified":"2012-08-03T11:10:24","modified_gmt":"2012-08-03T11:10:24","slug":"how-to-write-a-wav-file-in-scala","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/how-to-write-a-wav-file-in-scala\/","title":{"rendered":"How to Write a Wav File in Scala"},"content":{"rendered":"<p>The following code will play a chord to a Wav file using Scala. This is adapted from sample code and uses the library <a href=\"http:\/\/www.labbookpages.co.uk\/audio\/javaWavFiles.html\">here<\/a> to handle the file format. <\/p>\n<p>One of the nice things about Scala is the ease of using existing Java code, since it runs on the JVM. I started this project by converting Java code into various functional languages, and ran into difficulties converting Java types into Clojure types, but have had no such problems with Scala.<\/p>\n<pre lang=\"scala\">\n\nobject pitches {\n\tdef write(filename: String) {\n\t    val G3 = 196;\n\t    val A3 = 220;\n\t    val F4G4 = 369.99\n\t\t\n\t    val notes = Array[Double]( G3, A3, F4G4 );\n\t    val file = new File(filename)\n\t\t\n\t    val sampleRate : Long = 44100; \n\t    val duration : Double = 10.0;\n\t    val bufferSize : Int = 100;\n\t\n\t    val numFrames : Long = \n                (duration * sampleRate).toLong\n\t    val wavFile = \n\t        WavFile.newWavFile(file, 1, numFrames, \n                                   16, sampleRate);\n\t    val buffer : Array[Array[Double]] = \n\t        Array.fill(1, bufferSize)(0.0);\n\t\n\t    var frameCounter : Int = 0;\n\t\n\t    while (frameCounter < numFrames)\n\t    {\n\t        val remaining : Long = \n\t        \t   wavFile.getFramesRemaining();\n\t        val toWrite = \n\t        \t   if (remaining > bufferSize) \n\t        \t      bufferSize \n\t        \t   else \n                              remaining.toInt;\n\t\n\t        for (val s : Int <- 0 to toWrite - 1)\n\t        {\n\t           frameCounter = frameCounter + 1\n\t           for (j : Int <- 0 to (notes.length - 1))\n\t           {\n\t        \tbuffer(0)(s) = buffer(0)(s) + \n\t        \t        Math.sin(2.0 * Math.PI * \n\t        \t   \t         notes(j) * \n\t        \t   \t         frameCounter \/ \n\t        \t   \t         sampleRate) \/ \n\t        \t   \t(notes.length + 1);\n\t           }\n\t        }\n\t\n\t        wavFile.writeFrames(buffer, toWrite)\n\t    }\n\t\n\t    wavFile.close()\n\t}\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>The following code will play a chord to a Wav file using Scala. This is adapted from sample code and uses the library here to handle the file format. One of the nice things about Scala is the ease of using existing Java code, since it runs on the JVM. I started this project by &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/how-to-write-a-wav-file-in-scala\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;How to Write a Wav File in Scala&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[4],"tags":[67,108,178,300,373,480,507,584],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/370"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=370"}],"version-history":[{"count":0,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/370\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}