Специальность 123 –«Компьютерная инженерия»; 01...

15
1 Лекция № 11-1 Добавление музыки в программу на Асемблере Учебные вопросы: 1. Функции WIN 32 API MessageBeep и Beep 2. Функция WIN 32 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 – «Кибербезопасность»

Upload: others

Post on 19-Oct-2020

0 views

Category:

Documents


0 download

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 – «Кибербезопасность»