2

私は現在、Cubase、Logic、Reason などにあるようなピアノ キーボード エディターをプログラミングしています。

私はこの大きなグリッド、二重配列 new int [13][9] を持っています。これにより、13 行、9 列になります。最初の列 [0-12][0] はキーボードで、上部には「ハイ C」(ミディ ノート 72)、下部には「ロー C」(ミディ ノート 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 に答える