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

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

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

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

Q&A

解決済

1回答

2209閲覧

AudioFormatのあたりで、例外が出ています。

akirasada1972

総合スコア41

Java

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

0グッド

0クリップ

投稿2020/10/18 20:36

キーボードの、”n””m”を押すと音が鳴るサンプラーを作りたいのですが、
AudioFormatのあたりで、例外が出ています。
例外:
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.
調べてみると、"LineUnavailableException は、ラインが使用不可のため開けないことを示す例外です。この状況がもっともよく発生するのは、要求されたラインがすでにほかのアプリケーションによって使用されている場合です。"と、ありました。
ちなみに、他のアプリケーションは、すべて閉じました。

java

1 AudioFormat frmt= new AudioFormat(44100,16,2,true,false); 2 DataLine.Info info= new DataLine.Info(Clip.class,frmt); 3 clip= (Clip)AudioSystem.getLine(info); 4 clip.open(frmt,wave_data,0,wave_data.length); 5 clip.start();

開発環境;
Os:Windows10
Java:8
Editor:Atom

どなたか、ご指導くださる方、よろしくお願いいたします。

java

1import java.awt.BorderLayout; 2import java.awt.event.KeyEvent; 3import java.awt.event.KeyListener; 4import java.awt.event.KeyListener; 5import java.awt.event.KeyEvent; 6import java.awt.Color; 7import java.awt.Component; 8import java.awt.Container; 9import java.awt.Graphics; 10import java.awt.Dimension; 11 12import java.lang.*; 13import javax.swing.*; 14import javax.swing.event.*; 15import javax.sound.sampled.*; 16 17public class SynthAkira extends JFrame { 18 19 public static void main(String[] args){ 20 21 SynthAkira akira = new SynthAkira("Synth Akira"); 22 akira.setVisible(true); 23 } 24 25 SynthAkira(String title){ 26 setTitle(title); 27 setBounds(100, 100, 600, 600); 28 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 29 30 Container contentPane = getContentPane(); 31 contentPane.add(new Main(), BorderLayout.CENTER); 32 } 33} 34 35class Main extends JPanel { 36 37 static byte[] wave_data = new byte[44100]; 38 39 static JSlider slider1 = new JSlider(0, 1000); 40 static JSlider slider2 = new JSlider(0, 1000); 41 JPanel p1; 42 JPanel p2; 43 JPanel p3; 44 static JPanel p4; 45 JPanel p5; 46 JPanel p6, p7, p8; 47 static JLabel label1; 48 static JLabel label2; 49 static JLabel label3; 50 JButton button1, button2; 51 52 Main() { 53 54 slider1.setValue(100); 55 slider1.setFocusable(false); 56 slider1.addChangeListener(new Slider()); 57 slider2.setValue(100); 58 slider2.setFocusable(false); 59 slider2.addChangeListener(new Slider()); 60 61 p1 = new JPanel(); 62 p1.add(slider1); 63 p1.add(slider2); 64 65 label1 = new JLabel(); 66 label2 = new JLabel(); 67 label1.setText(""+slider1.getValue()); 68 label2.setText(""+slider2.getValue()); 69 70 p3 = new JPanel(); 71 p3.add(label1); 72 p3.add(label2); 73 74 p7 = new JPanel(); 75 p8 = new JPanel(); 76 Key key = new Key(); 77 p7.addKeyListener(key); 78 p7.setFocusable(true); 79 80 p2 = new JPanel(); 81 p2.setLayout(new BorderLayout()); 82 p2.add(p1, BorderLayout.NORTH); 83 p2.add(p3, BorderLayout.CENTER); 84 p2.add(p7, BorderLayout.SOUTH); 85 86 label3 = new JLabel(""); 87 p4 = new JPanel(); 88 p4.setPreferredSize(new Dimension(600, 200)); 89 90 p4.setLayout(new BorderLayout()); 91 p4.add(label3, BorderLayout.NORTH); 92 p4.add(new Paint(), BorderLayout.SOUTH); 93 94 setLayout(new BorderLayout()); 95 add(p2, BorderLayout.NORTH); 96 add(p4, BorderLayout.CENTER); 97// p5.PpsetPreferredSize(new Dimension(600, 350)); 98 } 99} 100class Key implements KeyListener { 101 102 int i; 103 104 public void keyPressed(KeyEvent e) { 105 Main.label3.setText(e.getKeyText(e.getKeyCode())); 106 if(e.getKeyCode() == KeyEvent.VK_N) { 107 new Sound(1); 108 }else if(e.getKeyCode() == KeyEvent.VK_M) { 109 new Sound(2); 110 } 111 Main.p4.add(new Paint()); 112 } 113 114 public void keyReleased(KeyEvent e) { 115// clip.drain(); 116// clip.close(); 117// clip.stop(); 118 } 119 public void keyTyped(KeyEvent e) {} 120} 121 122class Paint extends JPanel { 123 124 protected void paintComponent(Graphics g) { 125 super.paintComponent(g); 126 g.setColor(Color.RED); 127 for(int i = 0; i < (Main.wave_data.length/200-1); i++) { 128 g.drawLine(i*2,128-Main.wave_data[i*200],(i+1)*2,128-Main.wave_data[(i+1)*200]); 129 } 130 } 131} 132 133class Sound { 134 135 Clip clip; 136 137 Sound(int i) { 138 double l1 = i*Main.slider1.getValue()/44100.0; 139 double l2 = i*Main.slider2.getValue()/44100.0; 140 for(int j=0;j<Main.wave_data.length;j++){ 141 Main.wave_data[j]= (byte)(110*(Main.wave_data.length-(j+1))/Main.wave_data.length*Math.sin((j*l1)*Math.PI*2) 142 *Math.sin((j*l2)*Math.PI*2)); 143 } 144 145 try{ 146 AudioFormat frmt= new AudioFormat(44100,16,2,true,false); 147 DataLine.Info info= new DataLine.Info(Clip.class,frmt); 148 clip= (Clip)AudioSystem.getLine(info); 149 clip.open(frmt,Main.wave_data,0,Main.wave_data.length); 150 clip.start(); 151 } 152 catch(Exception e){e.printStackTrace(System.err);} 153 } 154} 155 156class Slider implements ChangeListener { 157 public void stateChanged(ChangeEvent e) { 158 Main.label1.setText(""+Main.slider1.getValue()); 159 Main.label2.setText(""+Main.slider2.getValue()); 160} 161}

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接の回答でなくて申し訳ないですが、半分責任があると思うのでこちらで釈明させてください。

Java - キーボードの、”n””m”を押すと音が鳴るサンプラーを作りたいのですが、 キーを押しても変化がありません。|teratail

すくなくともタイトルの件は解決されていると思うので、この質問はクローズし新たに質問を立てていただきたいです。
その際は音声再生だけに絞ったコードで、やりたい事・参考サイト・開発環境等を明確にしてください(このコードのまま質問されると「過去に投稿した質問と同じ内容の質問」とマイナス評価される可能性があります)

どう見てもそのままですよね?私が無関係なら間違いなくマイナス評価します。

そういうことではなく問題点を絞ったうえで、どこまではOKで何がうまくいかないのかを示していただきたいのです。
例えば

  • ボタンでは鳴るけどキーボードだとエラー
    キーリピート関連?
  • WAVファイルは再生できるけど自前のメソッドはエラー
    その計算は合っているのか?参考サイトは?
  • WAVファイルも鳴らない
    ほかのアプリでは鳴るのか?ハードやドライバの詳細等

私が想定していたコードはこのようなものです。
おそらくWAVファイルが鳴るかすら確認されていないですよね?

Java

1import java.awt.Button; 2import java.awt.event.ActionEvent; 3import java.io.File; 4import javax.sound.sampled.AudioFormat; 5import javax.sound.sampled.AudioInputStream; 6import javax.sound.sampled.AudioSystem; 7import javax.sound.sampled.Clip; 8import javax.sound.sampled.DataLine.Info; 9import javax.swing.AbstractAction; 10import javax.swing.Action; 11import javax.swing.JFrame; 12import javax.swing.JPanel; 13import javax.swing.KeyStroke; 14 15 16class Main extends JPanel { 17 public static void main(String[] args) { 18 JFrame frame = new JFrame(); 19 frame.setSize(400, 200); 20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 frame.setLocationRelativeTo(null); 22 frame.add(new Main()); 23 frame.setVisible(true); 24 } 25 26 Main() { 27 Button b1 = new Button("wav"); 28 b1.addActionListener(e -> wav()); 29 add(b1); 30 31 Button b2 = new Button("sound"); 32 b2.addActionListener(e -> sound(1)); 33 add(b2); 34 35 36 // Key Bindings サンプル 37 Action wavAction = new AbstractAction() { 38 @Override public void actionPerformed(ActionEvent e) { 39 wav(); 40 } 41 }; 42 Action soundAction = new AbstractAction() { 43 @Override public void actionPerformed(ActionEvent e) { 44 sound(1); 45 } 46 }; 47 getInputMap().put(KeyStroke.getKeyStroke("N"), "wav"); 48 getInputMap().put(KeyStroke.getKeyStroke("M"), "sound"); 49 getActionMap().put("wav", wavAction); 50 getActionMap().put("sound", soundAction); 51 } 52 53 private void wav() { 54 File wav = new File("C:\WINDOWS\Media\notify.wav"); 55 try (AudioInputStream ais = AudioSystem.getAudioInputStream(wav)) { 56 AudioFormat format = ais.getFormat(); 57 System.out.println(format); // PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian 58 59 Info info = new Info(Clip.class, format); 60 Clip clip = (Clip) AudioSystem.getLine(info); 61 clip.open(ais); 62 clip.start(); 63 } catch (Exception e) { 64 e.printStackTrace(); 65 } 66 } 67 68 69 private void sound(int i) { 70 byte[] data = new byte[44100]; 71 double l1 = i * 100 / 44100.0; 72 double l2 = i * 100 / 44100.0; 73 for (int j = 0; j < data.length; j++) { 74 data[j] = (byte) (110 * (data.length - (j + 1)) / data.length 75 * Math.sin((j * l1) * Math.PI * 2) 76 * Math.sin((j * l2) * Math.PI * 2)); 77 } 78 79 try { 80 AudioFormat format = new AudioFormat(44100, 16, 2, true, false); 81 Info info = new Info(Clip.class, format); 82 Clip clip = (Clip) AudioSystem.getLine(info); 83 clip.open(format, data, 0, data.length); 84 clip.start(); 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } 88 } 89}

エラー文の後半

line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.

でググると結構引っかかって何となくバグっぽい感じもするんですが、Javaのバージョンを上げることは可能ですか?
私はJava12で動かしましたが、特にエラーは出ないのです。

投稿2020/10/18 23:04

TN8001

総合スコア9862

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

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

akirasada1972

2020/10/19 13:17

申し訳ありませんでした。 Javaのバージョンは、14でした。 逆に、8でやってもダメでした。 グラフィックボードも関係なさそうだし、ヘッドホンは、これから試してみるつもりです。
TN8001

2020/10/19 14:03

Javaのバージョンは関係なさそうだということはわかりました。 akirasada1972さんに謝罪を求めているわけではありません。 問題の解決とともに、第三者に役立つ情報になるようにしたいだけです^^ そのために問題の切り分けをできそうなコードを先回りして提示しましたが(ここに関しては質問者が用意すべきと考えます)それについてどうなるのかがわからないと回答しようがないということです。 >どこまではOKで何がうまくいかないのかを示していただきたいのです。 ほかのアプリでWAVファイルは鳴るのか? JavaコードからWAVファイルは鳴るのか? といったことです(今やっているということでしたらすいません) もしまだ読んでいなければ、一度目を通しておいてください。 [質問するときのヒント|teratail(テラテイル)](https://teratail.com/help/question-tips --- なんとなくハード寄りな話になりそうで、お役に立てるか不安です^^;
akirasada1972

2020/10/19 19:13

ヘッドホンで試したら、聞こえました。 Usbに、スピーカーをつないでいるのが問題なのか? では、Usbにつないでいるときは、どうしたらよいのか? 疑問は、残るのですが、おっしゃる通り、違う内容に質問になってしまうので、このあたりで、解決済みにさせていただきます。 お付き合い、ありがとうございました。 見せていただいたコードは、ゆっくり拝見させていただきます。
akirasada1972

2020/10/19 21:47

補足ですが、usblibjavaというものをインストールしたら、usbでも聞けました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問