前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。