Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将声音从合成器传输到音序器_Java_Audio_Midi_Synthesizer - Fatal编程技术网

Java 如何将声音从合成器传输到音序器

Java 如何将声音从合成器传输到音序器,java,audio,midi,synthesizer,Java,Audio,Midi,Synthesizer,好的,这是我的第一个问题,所以对我放松点。我正在尝试使用内置Java合成器的MidiChannel类中的noteOn动态生成声音。它能发出完美的声音。我的问题是将声音输出到音序器,以便将其保存到midi文件。目前,我的程序创建的文件是空的。断开连接发生在我的发射器/接收器设置中。当我尝试获取synth的发射机时,它会产生可爱的MidiUnavailableException 我这里有一大堆的代码,所以我只给你一些亮点。整个课程将在最底层 public Piano() { try

好的,这是我的第一个问题,所以对我放松点。我正在尝试使用内置Java合成器的MidiChannel类中的noteOn动态生成声音。它能发出完美的声音。我的问题是将声音输出到音序器,以便将其保存到midi文件。目前,我的程序创建的文件是空的。断开连接发生在我的发射器/接收器设置中。当我尝试获取synth的发射机时,它会产生可爱的MidiUnavailableException

我这里有一大堆的代码,所以我只给你一些亮点。整个课程将在最底层

public Piano()
{

    try 
    {
        //previous code not shown//

        sequence = new Sequence(Sequence.PPQ, 4); //I know. Just let it be.
        
        sequence.createTrack();
        
        sequencer = MidiSystem.getSequencer();
        
        sequencer.open();
        
        sequencer.setSequence(sequence);
        
        sequencer.recordEnable(sequencer.getSequence().getTracks()[0], 1);
            
        receiver = sequencer.getReceiver();
        
        transmitter = synth.getTransmitter();
        
        transmitter.setReceiver(receiver);

    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

}
当它点击
transmiter=synth.getTransmiter()时,我得到MidiUnavailableException。关于如何将MIDI事件从synth发送到sequencer有什么想法吗

//完整课程-警告:可能导致头痛和/或歇斯底里
packagemain;
导入java.awt.*;
导入java.awt.event.*;
导入java.awt.image.*;
导入java.io.*;
导入java.lang.reflect.Method;
导入java.net.URL;
导入java.text.DecimalFormat;
导入java.text.NumberFormat;
导入java.util.List;
导入javax.imageio.imageio;
导入javax.sound.midi.*;
导入javax.sound.midi.MidiDevice.Info;
导入javax.sound.sampled.AudioFileFormat;
导入javax.sound.sampled.AudioFormat;
导入javax.sound.sampled.AudioInputStream;
导入javax.sound.sampled.AudioSystem;
导入javax.sound.sampled.DataLine;
导入javax.sound.sampled.LineUnavailableException;
导入javax.sound.sampled.Mixer;
导入javax.sound.sampled.TargetDataLine;
导入javax.swing.*;
导入org.jfugue.devicethat将接收MIDI;
导入org.jfugue.devicethattwilltransmitmidi;
公共课钢琴演奏者
![在此处输入图像描述][2]{
KeyEventDispatcher dispatcher=新的KeyEventDispatcher()
{
公共布尔dispatchKeyEvent(KeyEvent e)
{           
如果(如getID()==401)
{
if(例如getKeyCode()==KeyEvent.VK_空间)
{
维持();
}
如果(例如getKeyCode()==KeyEvent.VK_周期)
{
octaveUp();
}
if(例如getKeyCode()==KeyEvent.VK_逗号)
{
octaveDown();
}
如果(例如getKeyCode()==KeyEvent.VK_A)
{
启动(频率);
}
if(e.getKeyCode()==KeyEvent.VK_W)
{
启动(频率+1);
}
如果(例如getKeyCode()==KeyEvent.VK_S)
{
启动(频率+2);
}
if(e.getKeyCode()==KeyEvent.VK_e)
{
启动(频率+3);
}
如果(例如getKeyCode()==KeyEvent.VK_D)
{
启动(频率+4);
}
if(e.getKeyCode()==KeyEvent.VK\u F)
{
启动(频率+5);
}
如果(例如getKeyCode()==KeyEvent.VK\T)
{
启动(频率+6);
}
如果(例如getKeyCode()==KeyEvent.VK_G)
{
启动(频率+7);
}
如果(例如getKeyCode()==KeyEvent.VK_Y)
{
启动(频率+8);
}
if(e.getKeyCode()==KeyEvent.VK_H)
{
启动(频率+9);
}
如果(例如getKeyCode()==KeyEvent.VK_)
{
启动(频率+10);
}
if(e.getKeyCode()==KeyEvent.VK_J)
{
启动(频率+11);
}
如果(例如getKeyCode()==KeyEvent.VK_K)
{
启动(频率+12);
}
if(e.getKeyCode()==KeyEvent.VK_O)
{
启动(频率+13);
}
如果(例如getKeyCode()==KeyEvent.VK_L)
{
启动(频率+14);
}
如果(例如getKeyCode()==KeyEvent.VK\P)
{
启动(频率+15);
}
if(e.getKeyCode()==KeyEvent.VK_分号)
{
启动(频率+16);
}
}
如果(例如getID()==402)
{
如果(!持续)
{
如果(例如getKeyCode()==KeyEvent.VK_A)
{
结束(频率);
}
if(e.getKeyCode()==KeyEvent.VK_W)
{
结束(频率+1);
}
如果(例如getKeyCode()==KeyEvent.VK_S)
{
结束(频率+2);
}
if(e.getKeyCode()==KeyEvent.VK_e)
{
结束(频率+3);
}
如果(例如getKeyCode()==KeyEvent.VK_D)
{
结束(频率+4);
}
if(e.getKeyCode()==KeyEvent.VK\u F)
{
结束(频率+5);
}
如果(例如getKeyCode()==KeyEvent.VK\T)
{
结束(频率+6);
}
如果(例如getKeyCode()==KeyEvent.VK_G)
{
结束(频率+7);
}
如果(例如getKeyCode()==KeyEvent.VK_Y)
{
结束(频率+8);
}
if(e.getKeyCode()==KeyEvent.VK_H)
{
结束(频率+9);
}
如果(例如getKeyCode()==KeyEvent.VK_)
{
结束(频率+10);
}
if(e.getKeyCode()==KeyEvent.VK_J)
{
结束(频率+11);
}
如果(例如getKeyCode()==KeyEvent.VK_K)
{
结束(频率+12);
}
if(e.getKeyCode()==KeyEvent.VK_O)
{
结束(频率+13);
}
如果(例如getKeyCode()==KeyEvent.VK_L)
{
结束(频率+14);
}
如果(例如getKeyCode()=
package main;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
import javax.imageio.ImageIO;
import javax.sound.midi.*;
import javax.sound.midi.MidiDevice.Info;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.TargetDataLine;
import javax.swing.*;

import org.jfugue.DeviceThatWillReceiveMidi;
import org.jfugue.DeviceThatWillTransmitMidi;

public class Piano implements ActionListener
![enter image description here][2]{
        KeyEventDispatcher dispatcher = new KeyEventDispatcher()
{
    public boolean dispatchKeyEvent(KeyEvent e)
    {           
        if(e.getID()==401)
        {
            if(e.getKeyCode()==KeyEvent.VK_SPACE)
            {
                sustain();
            }
            if(e.getKeyCode()==KeyEvent.VK_PERIOD)
            {
                octaveUp();
            }
            if(e.getKeyCode()==KeyEvent.VK_COMMA)
            {
                octaveDown();
            }
            if(e.getKeyCode()==KeyEvent.VK_A)
            {
                start(freq);
            }
            if(e.getKeyCode()==KeyEvent.VK_W)
            {
                start(freq+1);
            }
            if(e.getKeyCode()==KeyEvent.VK_S)
            {
                start(freq+2);
            }
            if(e.getKeyCode()==KeyEvent.VK_E)
            {
                start(freq+3);
            }
            if(e.getKeyCode()==KeyEvent.VK_D)
            {
                start(freq+4);
            }
            if(e.getKeyCode()==KeyEvent.VK_F)
            {
                start(freq+5);
            }
            if(e.getKeyCode()==KeyEvent.VK_T)
            {
                start(freq+6);
            }
            if(e.getKeyCode()==KeyEvent.VK_G)
            {
                start(freq+7);
            }
            if(e.getKeyCode()==KeyEvent.VK_Y)
            {
                start(freq+8);
            }
            if(e.getKeyCode()==KeyEvent.VK_H)
            {
                start(freq+9);
            }
            if(e.getKeyCode()==KeyEvent.VK_U)
            {
                start(freq+10);
            }
            if(e.getKeyCode()==KeyEvent.VK_J)
            {
                start(freq+11);
            }
            if(e.getKeyCode()==KeyEvent.VK_K)
            {
                start(freq+12);
            }
            if(e.getKeyCode()==KeyEvent.VK_O)
            {
                start(freq+13);
            }
            if(e.getKeyCode()==KeyEvent.VK_L)
            {
                start(freq+14);
            }
            if(e.getKeyCode()==KeyEvent.VK_P)
            {
                start(freq+15);
            }
            if(e.getKeyCode()==KeyEvent.VK_SEMICOLON)
            {
                start(freq+16);
            }
        }

        if(e.getID()==402)
        {
            if(!sustain)
            {

                if(e.getKeyCode()==KeyEvent.VK_A)
                {
                    end(freq);
                }
                if(e.getKeyCode()==KeyEvent.VK_W)
                {
                    end(freq+1);
                }
                if(e.getKeyCode()==KeyEvent.VK_S)
                {
                    end(freq+2);
                }
                if(e.getKeyCode()==KeyEvent.VK_E)
                {
                    end(freq+3);
                }
                if(e.getKeyCode()==KeyEvent.VK_D)
                {
                    end(freq+4);
                }
                if(e.getKeyCode()==KeyEvent.VK_F)
                {
                    end(freq+5);
                }
                if(e.getKeyCode()==KeyEvent.VK_T)
                {
                    end(freq+6);
                }
                if(e.getKeyCode()==KeyEvent.VK_G)
                {
                    end(freq+7);
                }
                if(e.getKeyCode()==KeyEvent.VK_Y)
                {
                    end(freq+8);
                }
                if(e.getKeyCode()==KeyEvent.VK_H)
                {
                    end(freq+9);
                }
                if(e.getKeyCode()==KeyEvent.VK_U)
                {
                    end(freq+10);
                }
                if(e.getKeyCode()==KeyEvent.VK_J)
                {
                    end(freq+11);
                }
                if(e.getKeyCode()==KeyEvent.VK_K)
                {
                    end(freq+12);
                }
                if(e.getKeyCode()==KeyEvent.VK_O)
                {
                    end(freq+13);
                }
                if(e.getKeyCode()==KeyEvent.VK_L)
                {
                    end(freq+14);
                }
                if(e.getKeyCode()==KeyEvent.VK_P)
                {
                    end(freq+15);
                }
                if(e.getKeyCode()==KeyEvent.VK_SEMICOLON)
                {
                    end(freq+16);
                }
            }
            else
            {
                if(e.getKeyCode()==KeyEvent.VK_A)
                {
                    endSoft(freq);
                }
                if(e.getKeyCode()==KeyEvent.VK_W)
                {
                    endSoft(freq+1);
                }
                if(e.getKeyCode()==KeyEvent.VK_S)
                {
                    endSoft(freq+2);
                }
                if(e.getKeyCode()==KeyEvent.VK_E)
                {
                    endSoft(freq+3);
                }
                if(e.getKeyCode()==KeyEvent.VK_D)
                {
                    endSoft(freq+4);
                }
                if(e.getKeyCode()==KeyEvent.VK_F)
                {
                    endSoft(freq+5);
                }
                if(e.getKeyCode()==KeyEvent.VK_T)
                {
                    endSoft(freq+6);
                }
                if(e.getKeyCode()==KeyEvent.VK_G)
                {
                    endSoft(freq+7);
                }
                if(e.getKeyCode()==KeyEvent.VK_Y)
                {
                    endSoft(freq+8);
                }
                if(e.getKeyCode()==KeyEvent.VK_H)
                {
                    endSoft(freq+9);
                }
                if(e.getKeyCode()==KeyEvent.VK_U)
                {
                    endSoft(freq+10);
                }
                if(e.getKeyCode()==KeyEvent.VK_J)
                {
                    endSoft(freq+11);
                }
                if(e.getKeyCode()==KeyEvent.VK_K)
                {
                    endSoft(freq+12);
                }
                if(e.getKeyCode()==KeyEvent.VK_O)
                {
                    endSoft(freq+13);
                }
                if(e.getKeyCode()==KeyEvent.VK_L)
                {
                    endSoft(freq+14);
                }
                if(e.getKeyCode()==KeyEvent.VK_P)
                {
                    endSoft(freq+15);
                }
                if(e.getKeyCode()==KeyEvent.VK_SEMICOLON)
                {
                    endSoft(freq+16);
                }

            }
        }

        return false;

    }
};

final int VOLUME_MAX = 120;

int freq = 60;

int volume = VOLUME_MAX;

int instr; 

int delay = 1000;

int velocity = 1000;

int count = 0;

boolean sustain = false;

boolean recording = false;

DecimalFormat df;

List<Icon> icons;

AnimatedIcon aIcon;

Synthesizer synth;

Sequence sequence;

Sequencer sequencer;

MidiChannel[] mc;

Instrument[] instruments;

Instrument instrument;

Transmitter transmitter;

Receiver receiver;

File file;

JFrame mainFrame;

JPanel mainPanel;

ImagePanel iPanel;

JButton rec;

JButton stop;

JButton load;

JButton sustainB;

JButton octave;

JButton up;

JButton down;

JButton volumeB;

JButton vUp;

JButton vDown;

OctavePanel oPanel;

VolumePanel vPanel;

GridBagLayout gridBag;

GridBagConstraints c;

Image redCir;

Image greenCir;

Image recCir;

public Piano()
{
    DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().
    addKeyEventDispatcher(dispatcher);

    InputMap im = (InputMap)UIManager.get("Button.focusInputMap");
    im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none");
    im.put(KeyStroke.getKeyStroke("released SPACE"), "none");

    try 
    {
        synth = MidiSystem.getSynthesizer();

        synth.open();

        FileInputStream stream = new FileInputStream(this.getClass().getResource("resources/soundbank1.gm").toString().substring(6));

        Soundbank sBank = MidiSystem.getSoundbank(stream);

        instruments = sBank.getInstruments();

        synth.loadAllInstruments(sBank);

        mc = synth.getChannels();

        instrument = (Instrument)JOptionPane.showInputDialog(null, "Choose an instrument", "", JOptionPane.PLAIN_MESSAGE, null, instruments, instruments[0]);

        mc[0].programChange(instrument.getPatch().getProgram());

        greenCir = ImageIO.read(getClass().getResource("resources/greenCir.gif"));

        redCir  = ImageIO.read(getClass().getResource("resources/redCir.gif"));

        recCir = ImageIO.read(getClass().getResource("resources/rec.gif"));

        sequence = new Sequence(Sequence.PPQ, 4);
        
        sequence.createTrack();
        
        sequencer = MidiSystem.getSequencer();
        
        sequencer.open();
        
        sequencer.setSequence(sequence);
        
        sequencer.recordEnable(sequencer.getSequence().getTracks()[0], 1);
        
        df = new DecimalFormat("000");
        
        receiver = sequencer.getReceiver();
        
        transmitter = synth.getTransmitter();
        
        transmitter.setReceiver(receiver);

    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

}

public void sustain()
{
    sustain = !sustain;

    if(sustain)
    {
        sustainB.setIcon(new ImageIcon(greenCir));
    }
    else
    {
        sustainB.setIcon(new ImageIcon(redCir));
    }
}

public void octaveUp()
{
    freq += 12;

    octave.setText("Octave: " + (freq-60)/12);
}

public void octaveDown()
{
    freq -= 12;

    octave.setText("Octave: " + (freq-60)/12);
}

public void vUp()
{
    if(volume < 120)
        volume += 12;

    volumeB.setText(setVText(volume));
}

public void vDown()
{
    if(volume > 0)
        volume -= 12;

    volumeB.setText(setVText(volume));
}

public void resetVolume()
{
    volume = VOLUME_MAX;
    volumeB.setText(setVText(volume));
}

public String setVText(int v)
{
    return "Volume " + volume/12 * 10 + "%";
}

public void selectInstrument()
{
    instrument = (Instrument)JOptionPane.showInputDialog(null, "Choose an instrument", "", JOptionPane.PLAIN_MESSAGE, null, instruments, instruments[0]);

    mc[0].programChange(instrument.getPatch().getProgram());
}

public BufferedImage getPiano()
{
    URL url = this.getClass().getResource("piano.gif");


    try 
    {

        BufferedImage buffImage = ImageIO.read(url);

        return buffImage;
    } 
    catch (IOException e) 
    {
        System.out.println("Error");

        return null;
    }
}

public void start(int note)
{
    mc[0].noteOn(note, volume);     
}

public void end(int note)
{
    mc[0].noteOff(note);
}

public void endSoft(int note)
{
    //mc[0].noteOff(note, velocity);
}

public void createAndShowGUI()
{   
    mainFrame = new JFrame("Piano Maestro");
    mainFrame.setDefaultCloseOperation(0);
    mainFrame.addWindowListener(new WindowAdapter() 
    {
        public void windowClosing(WindowEvent e) {System.exit(0);}
    });

    setupFrame(mainFrame.getContentPane());

    mainFrame.pack();
    mainFrame.setMinimumSize(new Dimension(500, 300));
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setVisible(true);
    mainFrame.setMinimumSize(new Dimension(iPanel.getWidth()+20, mainFrame.getHeight()));

    mainFrame.setResizable(false);
}

public void setupFrame(Container pane)
{
    gridBag = new GridBagLayout();

    pane.setLayout(gridBag);

    c = new GridBagConstraints();

    sustainB = new JButton("Sustain");
    sustainB.addActionListener(this);
    sustainB.setActionCommand("sustain");

    up = new JButton();
    up.addActionListener(this);
    up.setActionCommand("up");

    down = new JButton();
    down.addActionListener(this);
    down.setActionCommand("down");

    octave = new JButton("Octave: 0");
    octave.addActionListener(this);
    octave.setActionCommand("resetOctave");

    stop = new JButton("Stop");
    stop.addActionListener(this);
    stop.setActionCommand("stop");

    rec = new JButton("rec");
    rec.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){rec();}});

    load = new JButton("Load Instr.");
    load.addActionListener(this);
    load.setActionCommand("load");

    volumeB = new JButton(setVText(volume));
    volumeB.addActionListener(this);
    volumeB.setActionCommand("resetVolume");

    vUp = new JButton();
    vUp.addActionListener(this);
    vUp.setActionCommand("vUp");

    vDown = new JButton();
    vDown.addActionListener(this);
    vDown.setActionCommand("vDown");

    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 1;
    c.ipady = 10;

    vPanel = new VolumePanel(vDown,volumeB,vUp);

    pane.add(vPanel,c);

    c.gridy = 1;

    oPanel = new OctavePanel(down,octave,up);

    pane.add(oPanel,c);

    c.gridx = 1;
    c.gridy = 0;

    pane.add(sustainB,c);

    c.gridx = 2;

    pane.add(rec,c);

    c.gridx = 1;
    c.gridy = 1;

    pane.add(load,c);

    c.gridx = 2;

    pane.add(stop,c);

    c.gridy = 2;
    c.gridx = 0;
    c.gridwidth = 3;

    try 
    {

        sustainB.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/redCir.gif"))));

        up.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/up.gif"))));

        vUp.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/up.gif"))));

        down.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/down.gif"))));

        vDown.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/down.gif"))));

        stop.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/square.gif"))));

        rec.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("resources/rec.gif"))));

        iPanel = new ImagePanel("resources/piano.gif");

        pane.add(iPanel,c);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

    aIcon = new AnimatedIcon(rec,750,1,new ImageIcon(this.getClass().getResource("resources/recOn.gif")),new ImageIcon(this.getClass().getResource("resources/recOff.gif")));

    load.setPreferredSize(sustainB.getPreferredSize());

    rec.setPreferredSize(stop.getPreferredSize());

    octave.setPreferredSize(volumeB.getPreferredSize());

    volumeB.setPreferredSize(volumeB.getPreferredSize());

    volumeB.setText(setVText(volume));
}

public void rec()
{
    recording = true;

    rec.setIcon(aIcon);

    aIcon.start();

    sequencer.startRecording();

}

public void stop()
{
    if(recording)
    {
        aIcon.stop();

        rec.setIcon(new ImageIcon(recCir));

        sequencer.stop();

        if(sequence!=null)
        {
            file = new File("Song" + df.format(count) + ".midi");

            while(file.exists())
            {
                count++;

                file = new File("Song" + df.format(count) + ".midi");
            }

            try 
            {
                MidiSystem.write(sequence, 1, file);
            } 
            catch (IOException e) 
            {
                JOptionPane.showMessageDialog(null, "Your system is unable to write files.","Error",2);
            }
        }
        else
        {
            JOptionPane.showMessageDialog(null, "Your system is unable to write files.","Error",2);
        }
    }

    mc[0].allNotesOff();

}

public void actionPerformed(ActionEvent e)
{

    if(e.getActionCommand().equals("sustain"))
    {
        sustain();
    }
    if(e.getActionCommand().equals("up"))
    {
        octaveUp();
    }
    if(e.getActionCommand().equals("down"))
    {
        octaveDown();
    }
    if(e.getActionCommand().equals("resetOctave"))
    {
        freq = 60;
        octave.setText("Octave: " + (freq-60)/12);
    }
    if(e.getActionCommand().equals("load"))
    {
        this.selectInstrument();
    }
    if(e.getActionCommand().equals("piano"))
    {
        mc[0].programChange(instruments[0].getPatch().getProgram());
    }
    if(e.getActionCommand().equals("stop"))
    {
        stop();
    }
    if(e.getActionCommand().equals("vUp"))
    {
        vUp();
    }
    if(e.getActionCommand().equals("vDown"))
    {
        vDown();
    }
    if(e.getActionCommand().equals("resetVolume"))
    {
        resetVolume();
    }
}