我目前正在编写一个钢琴键盘编辑器,就像你可以在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) {}
}
非常感谢帮助!
答案 0 :(得分:0)
您似乎为每个播放的音符初始化MIDI系统。尝试将初始化代码移动到程序开始时只执行一次的地方,并重用您在那里创建的MidiChannel。