Страница: 1 | 2 |
Вопрос: Без ресурсов?
Добавлено: 21.08.05 22:49
Автор вопроса: Amor | ICQ: 1268198
Ответы
Всего ответов: 22
Номер ответа: 16
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #16
Добавлено: 31.08.05 17:00
блин, да я её с закрытыми глазами левой ногой писал, я её и не брался оптимизировать... кому надо, карты в руки!
Номер ответа: 17
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #17
Добавлено: 31.08.05 19:08
Вот более оптимизированная функция, которую выдаёт версия 2.2 LocASM'а на выходе:
'...
ReDim CodeArray((Len(HexCode) \ 2) - 1)
Dim BuildCode As Long, ArrayCounter As Long
For BuildCode = 1 To Len(HexCode) Step 2
CodeArray(ArrayCounter) = Val("&H" & Mid$(HexCode, BuildCode, 2))
ArrayCounter = ArrayCounter + 1
Next BuildCode
Номер ответа: 18
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #18
Добавлено: 01.09.05 01:01
ок, хотя почти одно и тоже, и в моём случае массив нафиг ненужен. Всё что стоит сделать это обозначить переменные, ну чтоб оне не как Variant.. это несколко ускорит, ну и не присваивать результат функции каждый раз при декодированиии одного символа, а уже потом все вместе в конце цикла с переменной функцииприсвоить... ну короче, влом
Номер ответа: 19
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #19
Добавлено: 01.09.05 16:04
Ну конечно, прошлую скорее всего тоже я писал.
Да как сказать. Если тебе действительно нужна юникодовая строка, тогда конечно. Но если ты эту строку передаёшь ByVal какой нибудь WIN32 API, то просто делаешь лишнюю работу. Перед вызовом API VB создаёт копию твоей строки в байтовом массиве и передаёт уже ссылку на этот массив, а не на твою юникодовую строку. Ты надеюсь знаешь чем отличается строка в формате Unicode от обычной?
Номер ответа: 20
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #20
Добавлено: 01.09.05 21:18
знаю, знаю Просто мне не приходилось её передавать апи функциям, просто ещё немного подпарсить и вывести, поэтому я ине стал голову морочить
Номер ответа: 21
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #21
Добавлено: 02.09.05 15:28
Не знаю что ты там собрался парсить, но метод сохранения в файл и запуска с диска выглядит слишком громоздко. Хотя наверное это просто для примера.
Номер ответа: 22
Автор ответа:
Андрей
Вопросов: 8
Ответов: 42
Профиль | | #22
Добавлено: 13.10.08 17:34
Сори, если не по теме. Не стал создавать новый топик.
Изменил код HACKERа, чтобы записывать созданный код в файл mid. Аккорд из 4 нот играет. Но всунуть цикл в середину трека не удается. Думаю, из-за того что нельзя правильно расчитать длину трека. Помогите!
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
Private Sub Form_Load()
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, инструмент 3
midi$ = midi$ & "00C100" 'канал 1, инструмент 17
midi$ = midi$ & "00C200" 'канал 2, инструмент 47
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" 'конец трека
DelFile "C:\Windows\temp\file.mid" 'Удалили чтоб не получилось что дописываем...
midi$ = Hex2Str(midi$) 'Декодировали
Call SaveToFile(midi$, "C:\Windows\temp\file.mid" 'Сохранили
'И запели...
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
Me.Caption = "Satisfaction !!!"
End Sub
Private Sub SaveToFile(Data$, PathFile As String)
'Сохранение переменной в файл
On Error GoTo e
n = FreeFile
Open PathFile For Binary As #n
Put n, , Data$
Close #n
Exit Sub
e:
MsgBox Err.Description, vbCritical, "Error: " & Err.Number
End Sub
Public Function Hex2Str(str$) As String
'Декодирование из хекса
For i = 1 To Len(str$) Step 2
s$ = Val("&H" & (Mid(str$, i, 2)))
Hex2Str = Hex2Str & Chr(s$)
Next i
End Function
Public Sub DelFile(File As String)
On Error Resume Next
Kill File$
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
mciSendString& "STOP file", 0&, 0, 0
mciSendString& "CLOSE file", 0&, 0, 0
End Sub