• ベストアンサー

自作した波形データを Wave 形式で保存する

 フリーハンドで好き勝手な波形を描き、離散的にデータを取って配列 wave[] を作ったとします。これをオーディオファイルとして保存出来たらと思うのですが、出来ません。  取り合えず次のような形を考えました(骨組みからして見当外れかも知れません)。 AudioFormat format=new AudioFormat(rate,8,1,true,true); Line.Info li=new DataLine.Info(…); …Line l=(…)AudioSystem.getLine(li); File sound=new File("sound.wav"); try { l.open(); l.start(); AudioInputStream ais=new AudioInputStream(l); AudioSystem.write(ais, AudioFileFormat.Type.WAVE, sound); l.stop(); l.close(); } catch(Exception e) { }  上記に於て "…" で示した所の近辺、つまり配列データをどうやって AudioInputStream に流し込むか、という所が分らないのです。TargetDataLine その他、あてずっぽうに二三のものを試みても、コンパイルの時点で撥ねられたり、出来たファイルが WMP に撥ねられたりします。  どなたか御存知の方、宜しく御教示をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

ByteArrayInputStream 経由で出力する単純な例です。 public static void main(String[] args) throws IOException { byte[] data = new byte[48000 * 2]; for (int i = 0; i < data.length; i++) { data[i] = (byte) (((i & (1 << 6)) == 0) ? -18 : 18); } AudioFormat af = new AudioFormat(48000, 8, 1/*mono*/, true/*signed*/, false/*little-endian*/); InputStream in = new ByteArrayInputStream(data); AudioInputStream ais = new AudioInputStream(in, af, 48000 * 2); AudioFileFormat.Type type = AudioFileFormat.Type.WAVE; File sound = new File("sound.wav"); AudioSystem.write(ais, type, sound); }

noname#15728
質問者

お礼

 回答有難うございます。  早速取り入れて( open() などの取り外しの所でちょっと躓きましたが)やってみましたら wave ファイルが出現してプログラムが終了し、ファイルを WMP に放り込みますと見事に鳴りました。  大変助かりました。感謝します。

その他の回答 (1)

  • realmarch
  • ベストアンサー率10% (1/10)
回答No.1

そもそもWMPで音が鳴らないということは、ファイルが きちんと生成できていないのではないでしょうか? エンディアンはあっていますか? そのせいで、データ長がマイナスとかなってたりしませんか? あと、ByteInputStreamで配列をラップしてAudioInputストリームに流し込むのが楽だと 思います。

noname#15728
質問者

補足

 回答有難うございます。  WMP が撥ねるときのメッセージに「サポートしていない」云々の文言がありますから、ファイルが正常に生成されていない点はその通りだと思います。第一、TargetDataLine を使うと WMP マークのファイルは生成してくれるのですが、プログラム自体は終了しないので(タスクマネジャを見るとダイナミックストップでは無さそうなのですが)明らかに上手く行っていません。  データ長がマイナスという点は大丈夫です。念の為 System.out.println(); で出力させてみると 70400 という数値が出ました。それにプログラム中の配列 wave[] に SourceDataLine を繋げばちゃんと音になりますので。  ByteInputStream というのは ByteArrayInputStream のことでしょうか。それなら一応使ってはみました。けれどもオーディオとしての情報を附随させる方法がどうしても分らず、諦めてしまったのです。  御教示を承けてもう一度試みましたが、やはり上手く行きませんでした。