Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: basicproduction.nm.ru
 Профиль | | #17
Добавлено: 31.08.05 19:08
Вот более оптимизированная функция, которую выдаёт версия 2.2 LocASM'а на выходе:
Public CodeArray() As Byte
 '...
 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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам