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

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

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

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

Q&A

解決済

1回答

909閲覧

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

akirasada1972

総合スコア41

Java

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

0グッド

0クリップ

投稿2020/10/14 15:56

編集2020/10/18 13:03

キーボードの、”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();

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

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} 162

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

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

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

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

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

m.ts10806

2020/10/14 21:29

.getKeyCode() で想定の情報が取れているかデバッグされましたか?
TN8001

2020/10/16 13:05

回答へのコメントは質問者に通知されないんでしたっけ? `JPanel`はデフォルトだとキーボードフォーカスを取らないため、`setFocusable(true)`も必要です^^
TN8001

2020/10/18 13:54

いろいろ試行錯誤されているのはわかりますが、変更点が明後日の方向です。 >line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported. とエラーがなっているんですから、つまり >new AudioFormat(44100,16,2,true,false); ここの部分ですよね? そこ以外をいくら変えても問題は解決しないでしょう。 まずは前回の質問で動いていた(?) >new AudioFormat(44100,8,1,true,false); ならどうなりますか?
akirasada1972

2020/10/18 14:09

すみません。 前回は、Linuxを利用し、今回はWindows10でやっています。 Linuxでは、どちらも動きました。
TN8001

2020/10/18 14:31

Windows10ではどちらも動かないという意味ですか? 私は音声データについてよくわからないので、残念ながら適切なアドバイスができません。 すくなくともタイトルの件は解決されていると思うので、この質問はクローズし新たに質問を立てていただきたいです。 その際は音声再生だけに絞ったコードで、やりたい事・参考サイト・開発環境等を明確にしてください(このコードのまま質問されると「過去に投稿した質問と同じ内容の質問」とマイナス評価される可能性があります)
guest

回答1

0

ベストアンサー

KeyListenerがどのコンポーネントにも登録されていないように見えます。
JPanel#addKeyListenerでlistenerを登録する必要があります。

例えば、こんな風に
p1 = new JPanel();
p1.addKeyListener(this);

投稿2020/10/15 03:17

perorin0418

総合スコア90

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

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

TN8001

2020/10/15 15:09

`JPanel`はデフォルトだとキーボードフォーカスを取らないため、`setFocusable(true)`も必要です^^
perorin0418

2020/10/16 03:26

そうなんですね。訂正ありがとうございます。
akirasada1972

2020/10/17 14:23

修正をしたところ、キーボードからの信号を受け取ることは、できるようになったのですが、スライダーを動かすと、信号が受け取れなくなります。
TN8001

2020/10/17 21:13

キーボードフォーカスがスライダーに行っています。 Tabキーを1,2回押せばパネルに戻ります。 面倒なら slider1.setFocusable(false); としてフォーカスを取らないようにしてもいいです。 この使い方だと InputMap ActionMap でやったほうがいいかもしれません。 [How to Use Key Bindings (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html エラーの件は再現しないので何とも言えませんが、キーを押している間 keyPressed が連続で来ます(キーリピート)その兼ね合いかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問