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

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

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

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

API

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

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

1回答

1473閲覧

java sound api で波形観察プログラムを作成した結果,一部予期しない結果を得ました

Lapis_nul

総合スコア6

Java

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

API

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

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

0クリップ

投稿2020/03/05 15:25

前提・実現したいこと

java sound api を使って波形を観察するプログラムを作る.
行く行くは時間間隔毎に波形がパッパッと切り替わり,ボタンで開始終了を制御できるようにする.

該当のソースコード

java

1import java.awt.*; 2import java.awt.event.*; 3 4import javax.sound.sampled.*; 5import javax.swing.*; 6class recordsys extends JPanel{ 7 int x=800;//ウィンドウの横幅 8 controler cont; 9 byte wavedata[]; 10 AudioFormat format; 11 DataLine.Info info; 12 TargetDataLine target; 13 AudioInputStream input; 14 double width=1;//録音時間(1秒) 15 int rate=44100;//サンプリングレート 16 public recordsys() { 17 cont=new controler(this); 18 this.setLayout(new BorderLayout()); 19 this.add(cont,BorderLayout.SOUTH); 20 try { 21 wavedata=new byte[(int)(width*rate)]; 22 format= new AudioFormat(rate,8,1,true,false); 23 info=new DataLine.Info(TargetDataLine.class, format); 24 target=(TargetDataLine)AudioSystem.getLine(info); 25 input= new AudioInputStream(target); 26 }catch(Exception e) { 27 System.out.println("ERROR"); 28 } 29 } 30 public void paintComponent(Graphics g) { 31 super.paintComponent(g); 32 for(int i=0;i<x-1;i++) { 33 g.drawLine(i,-1*wavedata[(int)((wavedata.length-1)*(double)i/x)]+127, 34 i+1,-1*wavedata[(int)((wavedata.length-1)*(double)(i+1)/x)]+127); 35 } 36 } 37 public void startrecord() { 38 //1回だけ録音 39 try{ 40 target.open(format); 41 target.start(); 42 input.read(wavedata,0,wavedata.length); 43 target.stop(); 44 target.close(); 45 repaint(); 46 }catch(Exception e) { 47 System.out.println("ERROR"); 48 } 49 } 50 public void stoprecord() { 51 //まだ 52 } 53} 54 55class controler extends JPanel implements ActionListener{ 56 JButton start,stop; 57 recordsys sys; 58 public controler(recordsys s) { 59 sys=s; 60 start= new JButton("開始"); stop=new JButton("停止"); 61 start.addActionListener(this); 62 stop.addActionListener(this); 63 this.setLayout(new GridLayout(1,12)); 64 this.add(start); 65 this.add(stop); 66 } 67 public void actionPerformed(ActionEvent ev) { 68 if(ev.getSource()==start) { 69 sys.startrecord(); 70 }else if(ev.getSource()==stop) { 71 sys.stoprecord(); 72 } 73 } 74} 75 76class soundwave extends JFrame{ 77 recordsys sys; 78 public static void main(String[] args) { 79 new soundwave(); 80 } 81 82 public soundwave() { 83 sys=new recordsys(); 84 this.setSize(800,400); 85 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 86 this.add(sys); 87 this.setVisible(true); 88 } 89} 90

試したこと

(本当はスクリーンショットを載せる予定でしたがうまくのりませんでした)
プログラムを実行して,声を出したり机を叩いたりしてその波形が現れることを確認した.しかし最初の一瞬だけ(おおよそ0.1秒)グラフが平行線のままになっていていた.JButtonの処理でラグが起きたと考えられるが少し気持ち悪いのでどうにかしたい.

補足情報(FW/ツールのバージョンなど)

Version: Oxygen.3a Release (4.7.3a)
Build id: 20180405-1200

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

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

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

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

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

guest

回答1

0

自己解決

やはり2回目の録音ではすぐに波形が変化していることが確認できました.

投稿2020/03/08 05:15

Lapis_nul

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問