Страница: 1 |
|
Вопрос: Сохранить midi в файле
|
Добавлено: 13.10.08 17:52
|
|
Автор вопроса: Андрей
|
Необходимо всунуть цикл в трек, чтобы изменяя данные создать и сохранить мелодию. Играет только написанное (в примере аккорд из 4 нот), но не более. Думаю, не могу правильно расчитать длину трека.
midi$ = "4D546864" 'блок заголовка
midi$ = midi$ & "00000006" 'длина блока - 6 байт
midi$ = midi$ & "0000" 'формат файла - 0
midi$ = midi$ & "0001" 'номер трека
midi$ = midi$ & "0060" '96 тиков в четверти
midi$ = midi$ & "4D54726B" 'блок трека
midi$ = midi$ & "0000003B" 'длина трека - 59 байт
midi$ = midi$ & "00FF580404021808" 'дельта-время 0, размер 4/4, один удар метронома на четверть, 8 тридцать вторых на 24 midi Clock
midi$ = midi$ & "00FF510309F38E" 'дельта-время 0, размер 4/4, темп - 652174 микросекунды на четверть
midi$ = midi$ & "00C000" 'канал 0, инструмент 00
midi$ = midi$ & "00C100" 'канал 1, инструмент 00
midi$ = midi$ & "00C200" 'канал 2, инструмент 00
midi$ = midi$ & "00923060" 'дельта-время 00 тиков, канал 2, играть ноту До малой октавы, громкость 60
midi$ = midi$ & "60914340" 'дельта-время 96 тиков, канал 1, играть ноту Соль первой октавы, громкость 40
midi$ = midi$ & "003C40" 'дельта-время 00 тиков, канал 1, играть ноту До первой октавы (Running Status), громкость 40
midi$ = midi$ & "60904C20" 'дельта-время 96 тиков, канал 0, играть ноту Ми второй октавы, громкость 20
midi$ = midi$ & "8140823060" 'дельта-время 192 тика, канал 2, снять ноту До малой октавы, громкость 60
midi$ = midi$ & "00814340" 'дельта-время 00 тиков, канал 1, снять ноту Соль первой октавы, громкость 40
midi$ = midi$ & "003C40" 'дельта-время 00 тиков, канал 1, снять ноту До первой октавы (Running Status), громкость 40
midi$ = midi$ & "00804C20" 'дельта-время 00 тиков, канал 0, снять ноту Ми второй октавы, громкость 20
midi$ = midi$ & "00FF2F00" 'конец трека
midi$ = Hex2Str(midi$)
Call SaveToFile(midi$, "C:\Windows\temp\file.mid")
Ответить
|
Номер ответа: 1 Автор ответа: Андрей
Вопросов: 8 Ответов: 42
|
Профиль | | #1
|
Добавлено: 13.10.08 20:00
|
Сори, решил сам)
n = 2
midi$ = "4D546864" 'блок заголовка
midi$ = midi$ & "00000006" 'длина блока - 6 байт
midi$ = midi$ & "0000" 'формат файла - 0
midi$ = midi$ & "0001" 'номер трека
midi$ = midi$ & "0060" '96 тиков в четверти
midi$ = midi$ & "4D54726B" 'блок трека
midi$ = midi$ & "000000" & Hex(28 + 31 * n) 'длина трека - 59+31 байт
midi$ = midi$ & "00FF580404021808" 'дельта-время 0, размер 4/4, один удар метронома на четверть, 8 тридцать вторых на 24 midi Clock
midi$ = midi$ & "00FF510309F38E" 'дельта-время 0, размер 4/4, темп - 652174 микросекунды на четверть
midi$ = midi$ & "00C000" 'канал 0, инструмент 00
midi$ = midi$ & "00C100" 'канал 1, инструмент 00
midi$ = midi$ & "00C200" 'канал 2, инструмент 00
For i = 1 To n
midi$ = midi$ & "00923060" 'дельта-время 00 тиков, канал 2, играть ноту До малой октавы, громкость 60
midi$ = midi$ & "60914340" 'дельта-время 96 тиков, канал 1, играть ноту Соль первой октавы, громкость 40
midi$ = midi$ & "003C40" 'дельта-время 00 тиков, канал 1, играть ноту До первой октавы (Running Status), громкость 40
midi$ = midi$ & "60904C20" 'дельта-время 96 тиков, канал 0, играть ноту Ми второй октавы, громкость 20
midi$ = midi$ & "8140823060" 'дельта-время 192 тика, канал 2, снять ноту До малой октавы, громкость 60
midi$ = midi$ & "00814340" 'дельта-время 00 тиков, канал 1, снять ноту Соль первой октавы, громкость 40
midi$ = midi$ & "003C40" 'дельта-время 00 тиков, канал 1, снять ноту До первой октавы (Running Status), громкость 40
midi$ = midi$ & "00804C20" 'дельта-время 00 тиков, канал 0, снять ноту Ми второй октавы, громкость 20
Next i
midi$ = midi$ & "00FF2F00" 'конец трека
midi$ = Hex2Str(midi$)
Call SaveToFile(midi$, "C:\Windows\temp\file.mid"
Ответить
|
Номер ответа: 2 Автор ответа: Андрей
Вопросов: 8 Ответов: 42
|
Профиль | | #2
|
Добавлено: 14.10.08 20:07
|
Получился забавный код.
Прошу считать меня родоначальником музыкальных фракталов.))) Делюсь упрощенной версией.
Код в форму:
Private Sub Form_Load()
n = 21 'max число для данного примера
'играем замедляющуюся и затихающую синусоиду
Call MidiTrackOpen(0, n) 'инструмент (0-127), кол-во нот
For i = 1 To n
Call MidiTrack(Round(Abs(Sin(i)) * 70), 127 - i * 4, 16 + i) 'm - нота (36 = "До" первой октавы), громкость (16-127), темп (16-127)
Next i
Call MidiTrackClose
Call MidiFileSave 'сохраняем мелодию в файле mid
Call MidiFilePlay 'проигрываем мелодию
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call MidiFileClose 'выгружаем и удаляем файл
End Sub
Код в модуль:
Option Explicit
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" ( ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Dim midi$
Dim i, n As Integer
'Начало трека
Sub MidiTrackOpen(Instrument, Num)
On Error Resume Next
If Instrument < 16 Then Instrument = 0 & Hex(Instrument)
If Instrument >= 16 Then Instrument = Hex(Instrument)
midi$ = ""
midi$ = "4D546864000000060000000100244D54726B000000"
midi$ = midi$ & Hex(22 + 8 * Num)
midi$ = midi$ & "00FF58040402180800FF510309F38E00C0"
midi$ = midi$ & Instrument
End Sub
'Тело трека
Sub MidiTrack(Nota, Volume, Temp)
midi$ = midi$ & "0090" & Hex(Nota + 12) & Hex(Volume)
midi$ = midi$ & Hex(Temp) & "80" & Hex(Nota + 12) & Hex(Volume)
End Sub
'Конец трека
Sub MidiTrackClose()
midi$ = midi$ & "00FF2F00"
End Sub
'Сохраняем файл
Sub MidiFileSave()
On Error Resume Next
Kill "C:\Windows\temp\file.mid"
midi$ = Hex2Str(midi$)
Call SaveToFile(midi$, "C:\Windows\temp\file.mid"
End Sub
'Проигрываем файл
Sub MidiFilePlay()
On Error Resume Next
mciSendString "OPEN C:\Windows\temp\file.mid TYPE SEQUENCER ALIAS file", 0&, 0, 0
mciSendString "PLAY file FROM 0", 0&, 0, 0
mciSendString "CLOSE ANIMATION", 0&, 0, 0
End Sub
'Выгружаем файл
Sub MidiFileClose()
On Error Resume Next
mciSendString& "STOP file", 0&, 0, 0
mciSendString& "CLOSE file", 0&, 0, 0
Kill "C:\Windows\temp\file.mid"
End Sub
'Функция сохранения переменной в файле
Sub SaveToFile(Data$, PathFile As String)
On Error Resume Next
n = FreeFile
Open PathFile For Binary As #n
Put n, , Data$
Close #n
Exit Sub
End Sub
'Функция декодирование переменной
Public Function Hex2Str(str$) As String
On Error Resume Next
Dim S$
For i = 1 To Len(str$) Step 2
S$ = Val("&H" & ( Mid(str$, i, 2)))
Hex2Str = Hex2Str & Chr(S$)
Next i
End Function
Ответить
|
Страница: 1 |
Поиск по форуму