前提・実現したいこと
https://qiita.com/goodclues/items/67a20140fd7c205872d6
を参考にwavデータをByte配列に直してそれをもとに折れ線グラフを書こうとしています。
サイトに載ってあるコードからkotlinに変換したのですが、そこで何か不具合が生じているのかそもそもjavaの時点でどこかおかしいのかわからない状態です。
どこが間違っているか教えていただければと思います。
該当のソースコード
kotlin
1 val `is`: InputStream = resources.openRawResource(R.raw.woodenpaper) 2 var wavData = ByteArray(`is`.available()) 3 4 try { 5 val readBytes: String = 6 java.lang.String.format(Locale.US, "read bytes = %d", `is`.read(wavData)) 7 Log.e(TAG, readBytes) 8 `is`.close() 9 }catch (e: Exception){ 10 println(e) 11 } 12 13 var fmtIdx = 0 14 for (i in 0 until wavData.size - 4) { 15 if (wavData[i] == 0x66.toByte() && wavData[i + 1] == 0x6d.toByte() && wavData[i + 2] == 0x74.toByte() && wavData[i + 3] == 0x20.toByte() 16 ) { // 'fmt ' chunk 17 fmtIdx = i 18 Log.i("Test", "fmtIdx:$fmtIdx") 19 break 20 } 21 } 22 if (fmtIdx == 0) { 23 Log.e(TAG, "No fmt chunk") 24 } 25 26 var dataIdx = 0 27 for (i in 0 until wavData.size - 4) { 28 if (wavData[i] == 0x64.toByte() && wavData[i + 1] == 0x61.toByte() && wavData[i + 2] == 0x74.toByte() && wavData[i + 3] == 0x61.toByte() 29 ) { // 'data' chunk 30 dataIdx = i 31 Log.i("Test", "dataIdx:$dataIdx") 32 break 33 } 34 } 35 if (dataIdx == 0) { 36 Log.e(TAG, "No data chunk") 37 } 38 39 val wavChannel = wavData[fmtIdx + 10].toInt() 40 Log.i("Test", "wavChannel:$wavChannel") 41 42 //int wavSamplingRate = ((int)(wavData[fmtIdx + 15]) << 24) + ((int)(wavData[fmtIdx + 14]) << 16) 43 // + ((int)(wavData[fmtIdx + 13]) << 8) + (int)(wavData[fmtIdx + 12]); 44 // ↑の書き方はよくなさそうなので修正 45 val bytes1 = byteArrayOf( 46 wavData[fmtIdx + 15], 47 wavData[fmtIdx + 14], wavData[fmtIdx + 13], wavData[fmtIdx + 12] 48 ) 49 val wavSamplingRate: Int = ByteBuffer.wrap(bytes1).int 50 51 Log.i("Test", "wavSamplingRate:$wavSamplingRate") 52 53 val wavByte = wavData[fmtIdx + 22].toInt() / 8 54 Log.i("Test", "wavByte:$wavByte") 55 56 //int wavDataSize = ((int)(wavData[dataIdx + 7]) << 24) + ((int)(wavData[dataIdx + 6]) << 16) 57 // + ((int)(wavData[dataIdx + 5]) << 8) + (int)(wavData[dataIdx + 4]); 58 59 val bytes2 = byteArrayOf( 60 wavData[dataIdx + 7], 61 wavData[dataIdx + 6], wavData[dataIdx + 5], wavData[dataIdx + 4] 62 ) 63 val wavDataSize: Int = ByteBuffer.wrap(bytes2).int 64 65 66 Log.i("Test", "wavDataSize:$wavDataSize") 67 68 val wavHeaderSize = dataIdx + 8 69 70 val musicDataRight = IntArray(wavDataSize / wavByte / wavChannel) 71 val musicDataLeft = IntArray(wavDataSize / wavByte / wavChannel) 72 73 val bytestemp = byteArrayOf(0, 0, 0, 0) // 4byteないとBufferUnderflowExceptionになる 74 75 if (wavByte == 1 && wavChannel == 1) { 76 var i = 0 77 var j = wavHeaderSize 78 while (i < musicDataRight.size) { 79 musicDataRight[i] = wavData[j].toInt() 80 musicDataLeft[i] = wavData[j].toInt() 81 i++ 82 j++ 83 } 84 } else if (wavByte == 1 && wavChannel == 2) { 85 var i = 0 86 var j = wavHeaderSize 87 while (i < musicDataRight.size) { 88 musicDataRight[i] = wavData[j].toInt() 89 musicDataLeft[i] = wavData[j + 1].toInt() 90 i++ 91 j += 2 92 } 93 } else if (wavByte == 2 && wavChannel == 1) { 94 var i = 0 95 var j = wavHeaderSize 96 while (i < musicDataRight.size) { 97 98 //musicDataRight[i] = ((int)wavData[j + 1] << 8) + (int)wavData[j]; 99 //musicDataLeft[i] = ((int)wavData[j + 1] << 8) + (int)wavData[j]; 100 bytestemp[2] = wavData[j + 1] 101 bytestemp[3] = wavData[j] 102 musicDataRight[i] = ByteBuffer.wrap(bytestemp).int 103 musicDataLeft[i] = ByteBuffer.wrap(bytestemp).int 104 i++ 105 j += 2 106 } 107 } else if (wavByte == 2 && wavChannel == 2) { 108 var i = 0 109 var j = wavHeaderSize 110 while (i < musicDataRight.size) { 111 112 //musicDataRight[i] = ((int)wavData[j + 1] << 8) + (int)wavData[j]; 113 //musicDataLeft[i] = ((int)wavData[j + 3] << 8) + (int)wavData[j + 2]; 114 bytestemp[2] = wavData[j + 1] 115 bytestemp[3] = wavData[j] 116 musicDataRight[i] = ByteBuffer.wrap(bytestemp).int 117 bytestemp[2] = wavData[j + 3] 118 bytestemp[3] = wavData[j + 2] 119 musicDataLeft[i] = ByteBuffer.wrap(bytestemp).int 120 i++ 121 j += 4 122 } 123 }
試したこと
最初のtrycatchの部分でByte配列を作っていると書かれてあったのですがいまいち仕組みがよくわかっていません。
プログラムにsin波の音源を入れてグラフを描画したところ下のようになりました。
あなたの回答
tips
プレビュー