質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

608閲覧

wavのアナログデータを取得したい

ryu-sei

総合スコア12

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/04/24 06:40

編集2021/05/02 06:37

前提・実現したいこと

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波の音源を入れてグラフを描画したところ下のようになりました。イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satokei

2021/04/26 10:03

> 下のコードでは恐らく元のデータ削って配列に直していると思うのですが、できるだけアナログ波形に近いグラフを書きたいと考えています。 参考ページを見ましたが、データを削っているような説明は見当たりませんでした。 何をもってそのように判断されたのでしょう? とりあえずやってみて、グラフを描画したら分かるのではないでしょうか。
ryu-sei

2021/05/02 06:23

返信ありがとうございます。 sin波の音源をDLしてこのプログラムに入れたところsin波のグラフが描画されなかったので疑問に思った次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問