Специальность 123 –«Компьютерная инженерия»; 01...
TRANSCRIPT
-
111111111
Лекция № 11-1
Добавление музыки в программу на Асемблере
Учебные вопросы:
1. Функции WIN32 API MessageBeep и Beep
2. Функция WIN32 API PlaySound
3. Функция WIN32 API mciSendString
4. Функция WIN32 API mciExecute
5. Использование библиотеки mfmplayer.
Презентация не содержит весь
материал лекции. И, поэтому, не
может заменить посещение лекции
студентом
Литература:
1. Рисований О.М. Системне програмування [Текст]: підручник для студентів напрямку “Комп'ютерна
інженерія” вищих навчальних закладів в 2-х томах. Том 1. – Видання четверте: виправлено та доповнено
– Х.: “Слово”, 2015. – 576 с.
2. Рисований О.М. Системне програмування [Текст]: підручник для студентів напрямку “Комп'ютерна
інженерія” вищих навчальних закладів в 2-х томах. Том 2. – Видання четверте: виправлено та доповнено
– Х.: “Слово”, 2015. – 368 с.
3. http://blogs.kpi.kharkov.ua/v2/asm/knigi/ к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
«Системное программирование»
НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
“Харьковский политехнический институт”
Кафедра “Вычислительная техника и программирование”Специальность 123 – «Компьютерная инженерия»;
специализации:
123-01 «Компьютерные системы и сети»;
123-02 «Системное программирование»;
123-03 «Программирование компьютерных игр и мобильных приложений»;
Специальность 125 – «Кибербезопасность»
-
2
1. Функции WIN32 API MessageBeep и Beep
Пример 1.1.
invoke Beep, 4186, 200 ; до (частота, длительность)
invoke Beep, 3951, 200 ; си
invoke Beep, 3440, 200 ; ля
invoke Beep, 3136, 200 ; соль
invoke Beep, 3015, 200 ; фа
invoke Beep, 2637, 200 ; ми
invoke Beep, 2489, 200 ; ре-диез
invoke Beep, 2217, 200 ; до-диез (2217,40)
Пример 1.2.
VAR_DELAY DWORD 2000
VAR_LEVEL DD 4000
BEEP_LONG DWORD 1000
…
Invoke Sleep, VAR_DELAY
Invoke Beep, VAR_LEVEL , BEEP_LONG
Программирование воспроизведения звука функцией
BEEP удобно произвести со сменой частоты в цикле.
BOOL Beep (
DWORD dwFreq , // частота звука в герцах
DWORD dwDuration // продолжительность звука в миллисекундах
);
include win64a.inc
.code
WinMain proc
sub rsp,28h;
mov rbp,rsp
invoke Beep,522, 430;
invoke Beep,439, 430;
invoke Beep,391, 430;
invoke Beep,348, 430;
invoke Beep,329, 215;
invoke Beep,391, 215;
invoke Beep,293, 215;
invoke Beep,329, 215;
invoke Beep,261, 215;
invoke RtlExitUserProcess,0
WinMain endp
end
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
3
Ссылки:
http://romanovaelena.ru/notnaya-gramota-dlya-nachinayushhih - Нотная грамота для начинающих
https://yandex.ua/images/search?img_url=http%3A%2F%2Fwww.totalguitar.ru%2Fwp-
content%2Fuploads%2F2008%2F07%2Ftone.gif&text=частота%20нот&noreask=1&redircnt=1429690833.1&pos=3&lr=147&rpt=sim
age&uinfo=sw-1920-sh-1200-ww-1903-wh-1092-pd-1-wp-16x10_1920x1200 - частота нот
https://yandex.ua/images/search?img_url=http%3A%2F%2Fra-
studio.narod.ru%2Fteoria%2Fdlitelnosti%2F2_dlitelnosti.gif&text=продолжительность%20нот&noreask=1&redircnt=1429690927.1
&pos=1&lr=147&rpt=simage&uinfo=sw-1920-sh-1200-ww-1903-wh-1092-pd-1-wp-16x10_1920x1200 - продолжительность нот
http://freeschool.altlinux.ru/?p=3504 - основы звука
http://akkordy.su/proshhanie-slavyanki-noty-akkordy
http://www.blf.ru/narkhiv/index.htm - муз. поризведения
Задание: найти известную короткую нотную часть муз. произведения и его запрограммировать !!!!!!!!!!!!!!!!
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
4
include win64a.inc
.code
WinMain proc
sub rsp,28h; cтек:
mov rbp,rsp
invoke MessageBeep,-1
invoke Sleep,1000
invoke MessageBeep,MB_ICONASTERISK ; звук "Звездочка" (SystemAsterisk)
invoke Sleep,1000
invoke MessageBeep,MB_ICONEXCLAMATION ; звук "Восклицание"
(SystemExclamation)
invoke Sleep,1000
invoke MessageBeep,MB_ICONHAND ;звук "Критическая ошибка" (SystemHand)
invoke Sleep,1000
invoke MessageBeep,MB_OK ; звук "Стандартный звук" (SystemDefault)
invoke RtlExitUserProcess,0
WinMain endp
end
Функция WIN32 API MessageBeep
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
5
2.Функция WIN32 API PlaySound
Пример:
.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib user32,kernel32,masm32,winmm
.data
pzsFiles db "music.wav",0
.code
start:
invoke PlaySound, ADDR pzsFiles, 0, SND_FILENAME OR SND_ASYNC
invoke Sleep,5000
invoke ExitProcess,0
end startлучше воспроизводить
MCISendString('open file alias media',nil,0,self.handle);
и процедуры вкл. паузы и стоп
MCISendString('play media',nil, 0, self.handle);
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
6
3.Функция WIN32 API mciSendString
mciSendString – проигрывания звука только формата *.mid
(http://www.alexansol.chat.ru/Exp1.html)Call mciSendString ("Open c:\windows\media\flourish.mid type
sequencer alias music", 0, 0, 0)
Call mciSendString ("Play music", 0, 0, 0)
4.Функция WIN32 API mciExecuteПроигрываем файл в формате *.mp3:
mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
"для воспроизведения файла:
Call mciExecute("play имя вашего файла")
"для закрытия файла:
Call mciExecute("close имя вашего файла")
5. Использование библиотеки mfmplayer
Задание: написать программу с использованием
функций mciSendString и mciExecute !!!!!!!!!!!!!!!!!
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
7
Для додавання музики в програму на асемблері необхідно знайти в інтернеті
бібліотеки mfmplayer. Таку бібліотеку, наприклад, містить програма SynApsus.
Бібліотеку mfmplayer.inc додаємо в директорію masm32 в папку
c:\masm32\include\. А бібліотеку mfmplayer.lib додаємо в директорію masm32 в
папку с:\masm32\lib.
Файл ресурсів з ім'ям Music.rc:
#define IDD_DIALOG1 101
IDM_MUSUCA RCDATA DISCARDABLE "music.XM"
IDD_DIALOG1 DIALOGEX 6,6,189,99
CAPTION "Music"
FONT 8,"MS Sans Serif",0,0
STYLE 0x00CF0804
EXSTYLE 0x00000008
BEGIN
END
Командний файл Music.bat для компіляції програми:
ml /c /coff "Music.asm"
rc "Music.rc"
link /SUBSYSTEM:windows "Music.obj" "Music.res"
pause
start Music.exe
5. Використання бібліотеки mfmplayer
Створення допоміжних файлів
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
8
Формат .XM – это формат трекерной музыки,
которая используется в кейгенах, играх и.т.п. (там где
важен размер файла).
Обладая компактностью XM-файлы по качеству не
хуже mp3.
Сам файл состоит из звуковых фрагментов,
скомпилированных в специальной программе-трекере
в соответствии с творческой задумкой автора.
Формат .XM
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
9
invoke FindResource, hInstance, IDM_MUSUCA, RT_RCDATA
; з'ясовує місце ресурсу із заданим типом і ім'ям
Функція FindResource з'ясовує місце ресурсу із заданим типом і ім'ям у вказаному модулі.
FindResource(
HMODULE hModule,
LPCTSTR lpName,
LPCTSTR lpType
);
Параметри:
hModule – дескриптор модуля, виконуваний файл якого містить ресурс. Значення ПУСТО (NULL)
задає дескриптор модуля, пов'язаний із завантажувальним модулем, який операційна система
використовувала, щоб створити поточний процес.
lpName – задает имя ресурса.
lpType – визначає тип ресурсу.
RT_RCDATA – визначуваний програмою ресурс (необроблені дані);
invoke FindResource, hInstance, IDM_MUSUCA, RT_RCDATA
Функція LoadResource читає ресурс з модуля.
LoadResource (
HMODULE hModule, // покажчик модуля
HRSRC hResInfo // покажчик на ресурс
);
Функція LoadResource прочитує адресу завантаженого ресурсу і збільшує його лічильник
посилань. Після цього ресурс не може бути ні переміщений, ні знищений. Повертане значення:
покажчик на завантажений ресурс.
invoke LoadResource,hInstance,eax
Основные функции
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
10
Лістинг 2.24. Файл программы с именем Music.asm:
.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib user32,kernel32,masm32,Comctl32,shell32,mfmplayer
DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
.const
IDD_DIALOG1 equ 101
IDM_MUSUCA EQU 100
.data?
hInstance dd ?
nMusicSize DWORD ?
pMusic LPVOID ?
.code
LPVOID - это указатель. При этом это указатель (P от
Pointer) на что угодно (VOID), да еще и дальний (L - от
Long).
В данном случае LPVOID - это void*, что означает
указатель на нечто в памяти, чей тип не определен. Такой
трюк используется для передачи указателей в случаях,
когда есть проблема приведения типов, а программист
точно знает, что типы приводятся.
Переменная с типом LPVOID имеет размер 32 бит.
Створення програми
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
11
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
; загружаем музыку
push esi
invoke FindResource, hInstance, IDM_MUSUCA, RT_RCDATA
; з'ясовує місце ресурсу із заданим типом і ім'ям
push eax
invoke SizeofResource,hInstance,eax ; розмір вказаного ресурсу
mov nMusicSize,eax ; запис розміру музичного файлу
pop eax
invoke LoadResource,hInstance,eax ; читає ресурс
invoke LockResource,eax ; блокування ділянки пам'яті з ресурсом
mov esi,eax
mov eax, nMusicSize
add eax, SIZEOF nMusicSize
invoke GlobalAlloc,GPTR,eax ; виділяє пам'ять
mov pMusic,eax
mov ecx, nMusicSize
mov dword ptr [eax],ecx
add eax, SIZEOF nMusicSize
mov edi,eax
rep movsb ; (movs [EDI],[ESI]), поки EСХ != 0
pop esi
invoke mfmPlay, pMusic
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0 к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
12
DlgProc proc
hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
мov eax,uMsg
.if eax==WM_INITDIALOG
.elseif eax==WM_COMMAND
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич, [email protected]
-
13
Ресурсы интернетаhttp://modarchive.org
https://ru.wikipedia.org/wiki/%D2%F0%E5%EA%E5%F0%ED%E0%
FF_%EC%F3%E7%FB%EA%E0
Трекерная музыкаhttps://ru.wikipedia.org/wiki/%D2%F0%E5%EA%E5%F0%ED%E0%
FF_%EC%F3%E7%FB%EA%E0
-
14
Задание:
1. Найти известную короткую нотную часть муз.
произведения и его запрограммировать
!!!!!!!!!!!!!!
2. Написать программу с использованием
функций mciSendString и mciExecute
!!!!!!!!!!!!!!!!!!!!!!!!!!
-
272727272727
«Системное программирование»
к.т.н., проф. НТУ ХПИ Рысованый Александр Николаевич,
[email protected], [email protected]
личный сайт: http://blogs.kpi.kharkov.ua/v2/asm/
НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
“Харьковский политехнический институт”
Кафедра “Вычислительная техника и программирование”
Специальность 123 – «Компьютерная инженерия»;
специализации:
123-01 «Компьютерные системы и сети»;
123-02 «Системное программирование»;
123-03 «Программирование компьютерных игр и мобильных приложений»;
Специальность 125 – «Кибербезопасность»