Midiplayer在16个音符后停止播放声音

时间:2010-05-25 07:37:58

标签: java keyboard midi

我目前正在编写一个钢琴键盘编辑器,就像你可以在Cubase,Logic,Reason等中找到的那样。

我有这个大网格,双数组new int [13] [9],这使得它有13行,9列。 第一列[0-12] [0]是键盘,顶部是“高C”(midi音符72),底部是“低音C”(midi音符60)。该列是一个JButton数组,当你按下例如“low C”时,合成器正在播放音符60。

我现在已经让它工作得很好了,但我遇到的一个问题是我只能连续播放16个音符,然后它就像合成器关闭一样。

你们有没有想到问题是什么?

一些代码:

 import java.awt.*;
        import javax.swing.*;
        import java.awt.event.*;
        import java.util.*;
        import javax.sound.midi.*;

    actionPerformed(ActionEvent ae){
    for(int i = 0; i<13; i++){
            if(o== instr[i]){//instr is the button array
                SpelaTangent(i);
            }
        }

    }

    public void SpelaTangent(int tangent){


            int [] klaviatur = new int[13];
            for(int i = 0; i<13; i++){

                klaviatur[i] = (72-i);
                }

                         try {
                       Synthesizer synth = MidiSystem.getSynthesizer();                

synth.open(); 
                       final MidiChannel[] mc    = synth.getChannels();               

 Instrument[]        instrument = synth.getDefaultSoundbank().getInstruments();     

               synth.loadInstrument(instrument[1]);  
                        mc[0].noteOn(klaviatur[tangent],350);
                        mc[0].noteOff(klaviatur[tangent],350);

                   } catch (MidiUnavailableException e) {}
    }

非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

您似乎为每个播放的音符初始化MIDI系统。尝试将初始化代码移动到程序开始时只执行一次的地方,并重用您在那里创建的MidiChannel。