// Назначение: создавать список: нота/длительность. // Параметры: массив структур блоков, каждый из которых содержит массив структур событий; количество блоков. public ArrayList СreateNotesArray(MIDIMTrkStruct[] arrayST, int arrayCount) { ArrayList arrayChannelNote = new ArrayList(); // Массив каналов. for (int indexBlock = 0; indexBlock < arrayCount; indexBlock++) // Проходим по всем блокам MIDI. { for (int eventArray = 0; eventArray < arrayST[indexBlock].arrayNoteStruct.Count; eventArray++) // Пробегаемся по всем событиям массива каждого канала. { noteStruct bufferNoteST = (noteStruct)arrayST[indexBlock].arrayNoteStruct[eventArray]; // Достаем событие ноты. if (bufferNoteST.flagNote == true) // Если нажимают ноту. { byte indexChennelNoteWrite = 0; while (true) // Перебераем каналы для записи. { if (indexChennelNoteWrite < arrayChannelNote.Count) // Если мы еще не просмотрели все существующие каналы. { channelNote bufferChannel = (channelNote)arrayChannelNote[indexChennelNoteWrite]; // Достаем канал с выбранным номером. if (bufferChannel.ToWriteaNewNote(bufferNoteST.roomNotes, bufferNoteST.noteTime) == true) { break; // Если запись проша удачно - выходим. } } else // Если свободного канала не найдено - создать новый и кинуть в него все. { channelNote noteNambeChannelBuffer = new channelNote(); // Канал с реальным временем предыдущего. noteNambeChannelBuffer.ToWriteaNewNote(bufferNoteST.roomNotes, bufferNoteST.noteTime); // Если запись проша удачно - выходим. arrayChannelNote.Add(noteNambeChannelBuffer); // Добавляем канал в массив каналов. break; // Наверняка выходим. } indexChennelNoteWrite++; // Если не удалось записать - следующий канал. } } else // Если ноту наоборот отпускают. { byte indexChennelNoteWrite = 0; while (true) // Перебераем каналы для записи. { channelNote bufferChannel = (channelNote)arrayChannelNote[indexChennelNoteWrite]; // Достаем канал с выбранным номером. if (bufferChannel.EntryEndNotes(bufferNoteST.roomNotes, bufferNoteST.noteTime) == true) { break; // Если запись проша удачно - выходим. } indexChennelNoteWrite++; // Если не удалось записать - следующий канал. } } } } return(arrayChannelNote); }
// Вывод массивов каналов в richTextBox1. public void outData(ArrayList Data) { for (int loop = 0; loop < Data.Count; loop++) // Идем по всем каналам. { channelNote buffer = (channelNote)Data[loop]; // Получаем ссылку на канал. // Проходимся по всем нотам канала. richTextBox1.Text += "uint16_t channel" + loop.ToString() + "[" + buffer.arrayNoteChannel.Count.ToString() + "][2] = {"; for (int loop1 = 0; loop1 < buffer.arrayNoteChannel.Count; loop1++) { channelNote.noteInChannelNote DataD = (channelNote.noteInChannelNote)buffer.arrayNoteChannel[loop1]; richTextBox1.Text += DataD.roomNotes.ToString() + "," + DataD.noteTime.ToString(); if (loop1 != (buffer.arrayNoteChannel.Count - 1)) { richTextBox1.Text += ", \t"; } } richTextBox1.Text += "};\n\n"; } }