0

オーディオプログラムの1つに対してテストを作成しようとしていますが、このテスト設定に頭を悩ませています。まず、入力する必要のある60行×10000列のテーブルがあります。各セルの値は、ON、OFF、またはLEFTです(つまり、左に最も近いON / OFFと同じ値です)。ランダムな20〜40行をいつでもオンにしたいと思います。ランダムな6〜200セルの場合、それぞれがオンになっている必要があります。ONまたはOFFを設定するコマンドは、行、列の順に並べる必要があります。座標キーとオン/オフ値が付いたスパース辞書を描いています。私が理解していないのは、現在の行がオンかオフかを簡単に判断できるように、オン/オフセルをどのように格納するかです。ヘルプ?御時間ありがとうございます。

4

1 に答える 1

0

これについてさらに考えた後、私は2つのパスでそれを行うことができることに気づきました。これが私が最終的に得たものです。このアプローチについてコメントしてください。

        var table = new byte[60, 10000];
        for(int i = 0; i < 60; i++)
        {
            // we want at least half the row to be blank
            int j = 0;
            while(j < 10000)
            {
                var width = rand.Next(7, 200);
                j += width * 2;
                var vol = (byte)rand.Next(50, 125);
                for(int k = j - width; k < Math.Min(10000, j); k++)
                    table[i, k] = vol;
            }
        }

        var midiEvents = new List<BASS_MIDI_EVENT>();
        midiEvents.Add(new BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_PROGRAM, 0, 0, 0, 0));

        for(int j = 0; j < 10000; j++)
        {
            for(int i = 0; i < 60; i++)
            {
                var cur = (int)table[i, j];
                var left = j > 0 ? table[i, j - 1] : 0;
                if(cur > 0 && left == 0)
                {
                    cur <<= 8;
                    cur |= i + 33;
                    midiEvents.Add(new BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_NOTE, cur, 0, j, 0));
                }
                else if(cur == 0 && left > 0)
                {
                    midiEvents.Add(new BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_NOTE, i + 33, 0, j, 0));
                }
            }
        }
于 2012-04-05T14:48:36.367 に答える