2012-04-05 2 views
0

내 오디오 프로그램 중 하나에 대한 테스트를 작성하려고하는데이 테스트 설정에서 두뇌를 감싸는 데 문제가 있습니다. 첫째로, 필자는 60 개의 열과 10000 개의 열을 채워야하는 테이블을 가지고있다. 각 셀에는 ON, OFF 또는 LEFT 값이 있습니다. 즉, 왼쪽에있는 가장 가까운 ON/OFF와 동일한 값을가집니다. 주어진 시간에 무작위로 20 ~ 40 행이 필요합니다. 각각 6 ~ 200 개의 무작위 세포가 있어야합니다. ON 또는 OFF를 설정하는 명령은 행 순으로 정렬해야합니다. 저는 좌표 키와 on/off 값으로 나오는 희소 사전을 보았습니다. 내가 이해하지 못하는 것은 현재 행이 ON 또는 OFF인지 쉽게 판별 할 수 있도록 ON/OFF 셀을 저장하는 방법입니다. 도움? 시간 내 줘서 고마워.무작위 (Gantt-ish) 차트 만들기

답변

0

이것에 대해 더 생각한 후에 나는 두 번 통과 할 수 있음을 깨달았습니다. 여기 내가 결국에 끝난거야. 이 접근법에 대해 자유롭게 의견을 말하십시오.

 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)); 
       } 
      } 
     }