// Назначение: разбор главной структуры MIDI файла. // Параметры: Открытый FileStream поток. // Возвращаемой значение - заполненная структура типа MIDIheaderStruct. public MIDIheaderStruct CopyHeaderOfMIDIFile(MIDIReaderFile MIDIFile) { MIDIheaderStruct ST = new MIDIheaderStruct(); // Создаем пустую структуру заголовка файла. ST.nameSection = MIDIFile.ReadStringOf4byte(); // Копируем имя раздела. ST.lengthSection = MIDIFile.ReadUInt32BigEndian(); // Считываем 4 байта длины блока. Должно в итоге быть 0x6 ST.mode = MIDIFile.ReadUInt16BigEndian(); // Считываем 2 байта режима MIDI. Должно быть 0, 1 или 2. ST.channels = MIDIFile.ReadUInt16BigEndian(); // Считываем 2 байта количество каналов в MIDI файле. ST.settingTime = MIDIFile.ReadUInt16BigEndian(); // Считываем 2 байта параметров тактирования. return(ST); // Возвращаем заполненную структуру. }
// Назначение: Открытие файла для чтения. // Параметры: путь к файлу. // Возвращаемое значение: успешность операции. true - успешно, false - нет. public bool openMIDIFile(string pathToFile) { FileStream fileStream = new FileStream(pathToFile, FileMode.Open, FileAccess.Read); // Открываем файл только для чтения. MIDIReaderFile MIDIFile = new MIDIReaderFile(fileStream); // Собственный поток для работы с MIDI файлом со спец. функциями. На основе байтового потока открытого файла. MIDIheaderStruct HeaderMIDIStruct = CopyHeaderOfMIDIFile(MIDIFile); // Считываем заголовок. MIDIMTrkStruct[] MTrkStruct = new MIDIMTrkStruct[HeaderMIDIStruct.channels]; // Определяем массив для MTrkStruct. richTextBox1.Text += "Количество блоков: " + HeaderMIDIStruct.channels.ToString() + "\n"; // Количество каналов. richTextBox1.Text += "Параметры времени: " + HeaderMIDIStruct.settingTime.ToString() + "\n"; richTextBox1.Text += "Формат MIDI: " + HeaderMIDIStruct.mode.ToString() + "\n"; for (int loop = 0; loop < HeaderMIDIStruct.channels; loop++) { MTrkStruct[loop] = CopyMIDIMTrkSection(MIDIFile); // Читаем блоки MIDI файла. } outData(СreateNotesArray(MTrkStruct, HeaderMIDIStruct.channels)); // Получаем список нота/длительность. return(true); }