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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

3372閲覧

Java Sound APIで音楽の速度を上げようとすると砂嵐(ホワイトノイズ)になる

KureteRubyLua

総合スコア206

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2016/02/06 12:18

Java Sound APIを用いて音楽の速度を上げるプログラムを書いているのですが、
何故か砂荒良のような音、所謂ホワイトノイズが鳴ります。原因が全く分かりません。
一体どうすればいいのでしょうか?プログラムの問題ではなく、パソコンの問題なのでしょうか?
環境はWindows 7 32bit、メモリは4GB、CPUはCore i5 2.2GHzです

ソースコードは以下の通りです。よろしくお願いします。

Java

1import java.io.ByteArrayInputStream; 2import java.io.ByteArrayOutputStream; 3import java.io.File; 4import java.util.Date; 5 6import javax.sound.sampled.AudioFormat; 7import javax.sound.sampled.AudioInputStream; 8import javax.sound.sampled.AudioSystem; 9import javax.sound.sampled.Clip; 10 11public class SoundTest { 12 public static void main(String[] args) throws Exception { 13 14 //この変数で音の速度を変更する 15 //この設定では1.2倍速になる。 16 double playBackSpeed = 1.2; 17 18 System.out.println("Playback Rate: " + playBackSpeed); 19 20 File url = new File("battle1.wav"); 21 22 AudioInputStream ais = AudioSystem.getAudioInputStream(url); 23 AudioFormat af = ais.getFormat(); 24 25 int frameSize = af.getFrameSize(); 26 27 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 28 29 byte[] b = new byte[2^16]; 30 31 int read = 1; 32 33 while( read > -1 ) { 34 read = ais.read(b); 35 if (read > 0) { 36 baos.write(b, 0, read); 37 } 38 } 39 40 byte[] b1 = baos.toByteArray(); 41 byte[] b2 = new byte[(int)((float)(b1.length/playBackSpeed))]; 42 for (int ii=0; ii<b2.length/frameSize; ii++) { 43 for (int jj=0; jj<frameSize; jj++) { 44 b2[(ii*frameSize)+jj] = b1[(int)(ii*frameSize*playBackSpeed)+jj]; 45 } 46 } 47 48 ByteArrayInputStream bais = new ByteArrayInputStream(b2); 49 AudioInputStream aisAccelerated = 50 new AudioInputStream(bais, af, b2.length); 51 Clip clip = AudioSystem.getClip(); 52 clip.open(aisAccelerated); 53 clip.loop((int)(2*playBackSpeed)); 54 clip.start(); 55 } 56}

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

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

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

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

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

guest

回答2

0

データをbyte型の配列からShort型の配列に変換してリサンプリングをかけ、その後再びbyte型の配列に修正したら、うまく行きました。回答、有難うございました。

投稿2016/02/14 06:54

KureteRubyLua

総合スコア206

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

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

tatsuya6502

2016/02/17 00:26

返事が遅れてごめんなさい。解決できでよかったです!
guest

0

ベストアンサー

ぱっと見た感じ、データーを8ビット単位で間引いているようですが、読み込んでいるオーディオデーターのエンコーディングはこれと一致しているのですか?(PCM形式で8ビットで量子化されているのですか?) AudioFormat af#getSampleSizeInBits()8 が返ってくるかチェックしてみてください。

もし 8 でなかった場合は、オーディオデーターを8ビットで作り直すか、プログラムの方を修正して、そのビット数を1セットとして間引くようにすれば、うまくいきそうに思えます。

投稿2016/02/07 11:54

tatsuya6502

総合スコア2035

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

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

KureteRubyLua

2016/02/10 12:41

オーディオデータを8ビットで作り直したら、うまく行きました。 16ビット等8ビット以外のデータでも速度を上げられるようにしたいのですが どうすればよろしいでしょうか? 8ビット以上のビット数をどうすれば1セットとして扱えるようになるのか 分かりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問