2

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

我有这个大网格,双数组 new int [13][9],它有 13 行,9 列。第一列 [0-12][0] 是键盘,顶部是“high C”(midi note 72),底部是“low C”(midi note 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) {}
    }

非常感谢您的帮助!

4

1 回答 1

0

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

于 2011-09-16T20:33:50.307 回答