キーボードの、”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
回答1件
あなたの回答
tips
プレビュー