Програма для анімації музичних творів

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ЛЬВІВСЬКИЙ ДЕРЖАВНИЙ ІНСТИТУТ НОВІТНІХ ТЕХНОЛОГІЙ ТА УПРАВЛІННЯ ІМ. В. ЧОРНОВОЛА

Факультет

інформаційних

технологій

















Курсовий проект на тему:

“Програма для анімації музичних творів”

з дисципліни

“Системне програмне забезпечення ”







Виконав

Студент групи КІ-31

Митюк Я.











ЛЬВІВ 2009


Вступ



В даному курсовому проекті розглядається програма, яка призначена для анімації заданого музичного твору за допомогою об’єкта ActiveX - Microsoft Agent. Цей компонент був створений для підтримки дружнього інтерфейсу з користувачем і виглядає як казковий персонаж, що керується певними командами. Персонажі можуть виглядати по-різному, але всі вони підтримують один стандартний набір команд.

Огляд літературних джерел

В даному курсовому проекті я користувався такою літературою:

“Assembler для Windows” автором якої є В. Ю. Пирогов. 

Ця книга містить тільки працюючі програми з докладним розбором програм і коментарями. В книзі розглядаються способи й засоби аналізу й виправлення коду програм. В книзі також показані переваги мови асемблера над мовами високого рівня.

“Assembler для DOS, Windows и UNIX” автор Зубков С.В.

В книжці висвітлюються всі аспекти сучасного програмування на асемблері для DOS, Windows 95/NT и UNIX (Solaris, Linux и FreeBSD), включаючи створення резидентних програм і драйверів, пряме програмування периферійних пристроїв, керування захищеним режимом, і багато іншого. Детально розглядається архітектура процесорів Intel. В книжці є багато прикладів працюючих програм. Видання орієнтовано як на професіоналів, так і на початківців, без навиків програмування.

“Ассемблер. Разработка и оптимизация Windows-приложений” автор Юрій Магда. 

В книжці розглядається один з ефективних методів оптимізації програм – використання мови асемблера, описана методика розробки окремих модулів на ньому для використання в програмах на мовах високого рівня, показано, як з допомогою асемблера можна розробити повнофункціональну Windows-програму. Особливу увагу відведено оптимізації програм, написаних на мовах високого рівня, з допомогою асемблера.




Основна частина



1. Теоретичні положення



Ідея технології ActiveX полягає в тому, щоб зв’язати WEB-технологію з компонентами, які встановлені на комп’ютері у користувача. Таким чином, компонент може бути активізований і керуватися через WEB-сторінки, якщо в них є посилання на ці об’єкти. Другий варіант ActiveX – це можливість керування компонентом з віддаленого WEB-сервера, або робота компонента під управлінням цього сервера.

Технологія ActiveX побудована на методах OLE і використовує стандартні функції реєстрації та створення COM-об’єктів. Для роботи з COM-об’єктом необхідно створити екземпляр його інтерфейсу за допомогою API функції CoCreateInstance. Після створення екземпляру об’єкту (інтерфейсу) його необхідно відповідним чином ініціалізувати. Уникнути ініціалізації можна, якщо створювати екземпляр інтерфейсу більш спеціалізованими функціями, наприклад, функцією OleLoadPicture для інтерфейсу IPicture.

Microsoft Agent був створений для підтримки дружнього інтерфейсу з користувачем і виглядає як казковий персонаж, що керується певними командами. Компоненти Microsoft Agent входять в склад операційних систем Windows, починаючи з версії 2000. На інші системи ці компоненти можна інсталювати з сервера фірми Microsoft (http://www.microsoft.com/msagent). Персонажі можуть виглядати по-різному, але всі вони підтримують один стандартний набір команд.

Технологія ActiveX не залежить ні від мови програмування, ні від платформи; тому її можна віднести до одної з технологій системного програмування. 

До активізованого об’єкта “Microsoft agent” можна застосовувати наступні методи MoveTo, Play, Speak.

На низькому рівні методи організовані як таблиця з адресами підпрограм, які їх реалізовують. У таблиці подані символічні назви методів, їх адреси, кількість параметрів.



Адреса 

Назва методу

Параметри

Зміст параметрів

0h

04h

08h

0Ch

10h

14h

18h

1Ch

20h

24h

28h

2Ch

30h

34h

38h

3Ch

40h

44h

48h

4Ch

50h

54h

58hl

5Ch

60h

64h

68h

6Ch

70h

74h

78h

7Ch

80h

84h

88h

8Ch

90h

94h

98h

9Ch

0A0h

0A4h

0A8h

0ACh

0B0h

0B4h

0B8h

0BCh

0C0h

0C4h

0C8h

0CCh

0D0h

0D4h

0D8h

0DCh

0E0h

0E4h

0E8h

0Ech

0F0h

QueryInterface

AddRef

Release

GetTypeInfoCount

GetTypeInfo

GetIDsOfNames

Invoke

GetVisible 

SetPosition 

GetPosition

SetSize

GetSize

GetName

GetDescription

GetTTSSpeed

GetTTSPitch

Activate

SetIdleOn

GetIdleOn

Prepare

Play

Stop

StopAll

Wait

Interrupt

Show

Hide

Speak

MoveTo

GestureAt

GetMoveCause

GetVisibilityCause

HasOtherClients

SetSoundEffectsOn

GetSoundEffectsOn

SetName

SetDescription

GetExtraData

ShowPopupMenu

SetAutoPopupMenu

GetAutoPopupMenu

GetHelpFileName

SetHelpFileName

SetHelpModeOn

GetHelpModeOn

SetHelpContextID

GetHelpContextID

GetActive

Listen

SetLanguageID

GetLanguageID

GetTTSModeID

SetTTSModeID

GetSRModeID

SetSRModeID

GetGUID

GetOriginalSize

Think

GetVersion

GetAnimationNames

GetSRStatus

in, out

-

-

out

in, in, out

in, in, in, in, out

in,in,in,in,i/o,out

out

in, in

out, out

in, in

out, out

out

out

out

out

in

in

out

in, in, in, out

in, out

in

in

in, out

in, out

in, out

in, out

in, in, out

in, in, in, out

in, in, out

out

out

out

in

out

in

in

out

in, in

in

out

out

in

in

out

in

out

out

in

in

out

out

in

out

in

out

out, out

in, out

out, out

out

out

Адр. ідентиф., Адр.хендлу

-

-

Адр. буферу

Тип, ID, Адр. буферу

IID, Size, Name, ID, Адр. буф.

ID,IID,ID,Flg,Адр.буф,Адр.буф

Адреса ідентифікатора

Координати X,Y

Адреса координат X,Y

Ширина, висота 

Адреса ширини, висоти

Адреса буферу

Адреса буферу

Адреса змінної

Адреса змінної

Значення початкового стану

Значення-прапорець

Адреса змінної

Тип, Ім’я, Черга, Адр. ідентиф.

Адреса буферу, Адр.ідентифік.

Ідентифікатор

Тип дії

Ідентифікатор, Адр. ідентифік.

Ідентифікатор, Адр. ідентифік.

Швидкість, Адр. ідентифік.

Швидкість, Адр. ідентифік.

Адр.тексту,Адр.файлу,Адр.ID.

X, Y, Швидкість, Адр.ідентиф.

X, Y, Адр. ідентифік.

Адреса буферу

Адреса буферу

Адреса змінної

Значення-прапорець

Адреса змінної

Адреса буферу

Адреса буферу

Адреса буферу

X, Y

Прапорець

Адреса прапорця

Адреса імені

Адреса імені

Прапорець

Адреса прапорця

Адреса IID

Адреса рядка

Адреса прапорця

Прапорець

Ідентифікатор

Адр. Ідентифікатора

Адреса рядка

Адр. Ідентифікатора

Адреса рядка

Адреса рядка

Адреса рядка

Адреса X, Адреса Y

Адр. рядка, Адр. ідентиф.

Адр. ідентиф., Адр. ідентиф.

Адреса буферу

Адреса прапорця



Кожна таблиця методів містить на початку стандартні спеціалізовані методи QueryInterface, AddRef, Release.

Для виклику довільного методу використовується три команди асемблера:

mov edx, хендл інтерфейсу об’єкта

mov edx, [edx]

call [edx+ адреса метода в таблиці], хендл інтерфейсу об’єкта, параметри

Для деяких методів (наприклад, Speak) необхідно виділяти системну область пам’яті. Пам’ять з програми користувача для них не підходить. Для цього існує функція SysAllocString, яка резервує фрагмент системної пам’яті і одразу ж копіює в нього рядок з пам’яті користувача, який закінчується двома нулями. Після використання цей фрагмент знищується за допомогою функції SysFreeString, параметром якої є адреса цього фрагменту.

Всі керуючі дії для об’єктів ActiveX необхідно передавати в юнікодах. Для перетворення рядка в юнікод в програмі використана функція MultiByteToWideChar.



Постановка задачі



Нашою метою є скласти програму для анімації музичних творів на мові асемблер за допомогою об’єкта ActiveX - Microsoft Agent. Завантажити його можна з сайту Microsoft (безкоштовно): http://activex.microsoft.com/activex/controls/agent2/MSagent.exe 

Для анімації мною було обрано стандартний персонаж “Чарівник”.















Для того, щоб наш персонаж міг розмовляти треба встановити Microsoft Text-To-Speech http://activex.microsoft.com/activex/controls/sapi/spchapi.exe

Щоб він міг розмовляти російською необхідно завантажити голосовий драйвер Lernout&Hauspie TTS3000: http://activex.microsoft.com/activex/controls/agent2/lhttsrur.exe

Офіційно на сайті Microsoft можна завантажити такі персонажі:




Чарівник:Джин:Папугай:Робот:



Але в мережі існують сотні персонажів, наприклад на сайті http://characters.narod.ru можна завантажити такі персонажі:







Звуковий файл, який будемо використовувати для анімації помістимо в папку з програмою і назвемо наприклад arash.mp3, в програмі визначимо назву музичного файлу

MUZIKA	db "play arash.mp3",0

та запустимо

call mciSendStringA,offset MUZIKA,0,0,0

Під музику персонаж буде виконувати задану послідовність дій. Список можливих дій персонажу наведено нижче: 'Acknowledge','Alert','Announce','Blink','Confused','Congratulate','Congratulate_2','Decline','DoMagic1','DoMagic2','DontRecognize','Explain','GestureDown','GestureLeft','GestureRight','GestureUp','GetAttention','GetAttentionContinued','GetAttentionReturn','Greet','Hearing_1','Hearing_2','Hearing_3','Hearing_4','Idle1_1','Idle1_2','Idle1_3','Idle1_4','Idle1_5','Idle1_6','Idle2_1','Idle2_2','Idle2_3','Idle3_1','Idle3_2','LookDown','LookDownBlink','LookDownReturn','LookLeft','LookLeftBlink','LookLeftReturn','LookRight','LookRightBlink','LookRightReturn','LookUp','LookUpBlink','LookUpReturn','LookUpLeft','LookUpLeftBlink','LookUpLeftReturn','LookUpRight','LookUpRightBlink','LookUpRightReturn','MoveDown','MoveLeft','MoveRight','MoveUp','Pleased','Process','Processing','Read','ReadContinued','ReadReturn','Reading','RestPose','Sad','Search','Searching','StartListening','StopListening','Suggest','Surprised','Think','Thinking','Uncertain','Wave','Write','WriteContinued','WriteReturn','Writing','Hide','Show'.




Висновок



В даному курсовому проекті було описано специфічний спосіб створення програми для анімації музичного твору. Для анімації було обрано казковий персонаж Microsoft Agent “Чарівник”.




Список літературних джерел



1. Приклади використання функцій (електронна база) ASM_EXAMPLES

2. Методичні вказівки з курсу “Сиcтемне програмування та операційні системи” ЗБІРНИК ЛАБОРАТОРНИХ РОБІТ

3. Довідка по АРІ функціях “Borland C++ v.6.0”

4. Методичні вказівки для виконання курсової роботи Kurs_IIT.doc

5. Пирогов В. Ю. Ассемблер для Windows. — М.: Издатель Молгачева С.В., 2002. —552 с.: ил.

6. Зубков С. В. Assembler для DOS, Windows и UNIX. - М: ДМК. Пресс, 2000. - 608 с.: ил.

7. Магда Ю. С. Ассемблер. Разработка и оптимизация Windows-приложений. - БХВ-Петербург, 2003. - 544 с.: ил.




Додаток



Код програми



486

model flat,stdcall

extrn ExitProcess:Proc, MessageBoxA:Proc, CoInitialize:Proc

extrn CoCreateInstance:Proc, MultiByteToWideChar:Proc 

extrn SysAllocString:Proc, SysFreeString:Proc, OpenFile:Proc

extrn _wsprintfA:Proc,MessageBoxW:proc

extrn Sleep:Proc, mciSendStringA:Proc

extrn GetCursorPos: Proc

VT_BSTR	equ 8

OF_EXIST equ 4000h

data

Coord:

XX dd 0

YY dd 0

MUZIKA	db "play arash.mp3",0

HKEY_CLASSES_ROOT\CLSID\{D45FD2FC-5C6E-11D1-9EC1-00C04FD7081F} [по умолчанию] = Microsoft Agent Server 2.0

CLSID_AgentServer	dd 0d45fd2fch	; Microsoft Agent Server 2.0

dw 5c6eh, 11d1h

db 9Eh,0C1h, 00h, 0C0h,4Fh,0D7h,08h,1Fh;

МЕТОДИ AgentServer:

Load = 1Ch

GetCharacterEx = 2Ch;

-------------------------------------------------------------------------------------------; HKEY_CLASSES_ROOT\Interface\{48D12BA0-5B77-11D1-9EC1-00C04FD7081F} [по умолчанию] = IAgentEx; HKEY_LOCAL_MACHINE\Software\CLASSES\Interface\{48D12BA0-5B77-11D1-9EC1-00C04FD7081F} [по умолчанию] = IAgentEx

IID_IAgentEx	dd 48d12ba0h	; IAgentEx 	dw 5b77h,11d1h

	db 9Eh,0C1h, 00h,0C0h,4Fh,0D7h,08h,1Fh;

МЕТОДИ IAgentEx:

SetLanguageID = 0C4h

SetSize = 28h

MoveTo = 70h

Show = 64h

Speak = 6Ch

GetAnimationNames = 0Ech

hide	= 68h;

--------------------------------------------------------------------------------------------

IID_IEnumVARIANT	dd 00020404h; IEnumVARIANT

dw 0000h,0000h

db 0C0h,00h, 00h,00h,00h,00h,00h,46h; 

МЕТОДИ IEnumVARIANT:

Reset	= 14h

Next	= 0ch;

--------------------------------------

TITLE1	db "Виконує дiю:",0

NUM1	dd 0

IUNKNOWN	dd 0

IVAR		dd 0;

------------------------------------------------------------------------------------------

hAgent		dd 0

hAgentObject	dd 0

IChrID		dd 0

IReqID		dd 0

 hAgentChar	dd 0

Var1		dd 0

ADR1		dd 0

TYPE_AGENT	dd 0; 

Вимовляння фрази:

BUF1	db "Танцюють всі!!!",0

ACS	db "robby.acs",0	; Варiант агента

FORMAT1	db "Кiлькiсть дiй: %ld",0

NAME1	db "Play",0.data?

OFSTRUCT db 8 dup(?)

FullName db 260 dup(?)

BUF2	dw 500 dup(?)

TEXT1	db 1000 dup(?)

_esp	dd ?

FETCHED	dd ?

MAS1	db 20000 dup(?);

--------------------------------------------------------------------------------------------

code

Start:

Call CoInitialize,0	; Initializes the COM library on the current thread 

Call CoCreateInstance, offset CLSID_AgentServer, 0, 5, offset IID_IAgentEx, offset hAgentObject

test eax, eax

js STOP

call OpenFile,offset ACS,offset OFSTRUCT,OF_EXIST

cmp eax,-1

jz NOT_ACS

call MessageBoxA,0,offset FullName,offset ACS,0

Call MultiByteToWideChar,0,0,offset FullName,-1,offset BUF2,500

Call SysAllocString,offset BUF2

mov ADR1,eax

mov TYPE_AGENT,VT_BSTR NOT_ACS:

;----------------------------------------------------------------

mov edx,hAgentObject

mov edx,[edx]		; Load Agent:

call [edx+Load],hAgentObject,TYPE_AGENT,0,ADR1,0,offset IChrID,offset IReqID

Call SysFreeString,ADR1

test eax, eax

js STOP

mov edx,hAgentObject

mov edx,[edx]

; 2ch = Get the Agent Character (GetCharacterEx)

call [edx+GetCharacterEx],hAgentObject,IChrID,offset hAgentChar ; Get the Agent Character

test eax, eax

js STOP

;====================================================

mov edx,hAgentChar

mov edx,[edx]

; 0c4h = SetLanguageID	; 409-English,	419-Russian,	422-Ukrain

call [edx+SetLanguageID],hAgentChar,409h	;	Set Language

test eax, eax

js STOP

;------------------------------

mov edx,hAgentChar

mov edx,[edx]

call [edx+SetSize],hAgentChar,250, 270 ; Розмір персонажу

;--------------------------------

mov edx, hAgentChar

mov edx,[edx]

call [edx+MoveTo],hAgentChar,100,200,1,offset Var1	; MoveTo X,Y,Speed,Id

;--------------------------------

mov edx, hAgentChar

mov edx,[edx]

call [edx+show],hAgentChar,0,offset Var1		; show

;--------------------------------

Call MultiByteToWideChar,0,0,offset BUF1,-1,offset BUF2,500

Call SysAllocString,offset BUF2

mov ADR1,eax

mov edx,hAgentChar

mov edx,[edx]

call [edx+speak],hAgentChar,eax,0,offset Var1	; speak

Call SysFreeString,ADR1

;--------------------------------

mov edx,hAgentChar

mov edx,[edx]

call [edx+GetAnimationNames],hAgentChar,offset IUNKNOWN	; GetAnimationNames

test eax, eax

js STOP

mov edx,IUNKNOWN

mov edx,[edx]

call [edx+0],IUNKNOWN,offset IID_IEnumVARIANT,offset IVAR ; QueryInterface

mov edx,IVAR

mov edx,[edx]

call [edx+Reset],IVAR	; Reset

test eax, eax

js STOP

mov edx,IVAR

mov edx,[edx]

call [edx+Next],IVAR,200,offset MAS1,offset FETCHED	; Next

test eax, eax

js STOP

mov eax,FETCHED

call _wsprintfA,offset TEXT1,offset FORMAT1,eax

add esp,12

;call MessageBoxA,0,offset TEXT1,offset TEXT1,0

call Sleep, 7000

call mciSendStringA,offset MUZIKA,0,0,0

call dija,13 

call dija,14 

call dija,13 

call dija,22 

call dija,14 

call dija,13 

call dija,29 

call dija,30 

call dija,14 

call dija,13 

call dija,14 

call dija,13 

call dija,30 

call dija,11 

call dija,11 

call dija,11 

call dija,32 

call dija,11 

call dija,11 

call dija,11 

call dija,54 

call dija,25 

call dija,25 

call dija,25 

call dija,54 

call dija,23 

call dija,23 

call dija,23 

call dija,11 

call dija,23 

call dija,23 

call dija,23 

call dija,11 

call dija,11 

call dija,11 

call dija,32 

call dija,11 

call dija,11 

call dija,11 

call dija,54 

call dija,30 

call dija,36 

call dija,37 

call dija,14 

call dija,13 

call dija,22 

call dija,36 

call dija,37 

call dija,14 

call dija,13 

call dija,22 

call dija,36 

call dija,11 

call dija,11 

call dija,11 

call dija,32 

call dija,11 

call dija,11 

call dija,11 

call dija,12 

call dija,14 

call dija,13 

call dija,14 

call dija,13 

call dija,14 

call dija,13 

call dija,22 

call dija,27 

call ExitProcess,0

;----------------------------------

mov edx,IVAR

mov edx,[edx]

call [edx+8],IVAR	; Release

test eax, eax

js STOP

;--------------------------------

mov edx,hAgentChar

mov edx,[edx]

call [edx+hide],hAgentChar,0,offset Var1; hide

call MessageBoxA,0,offset BUF1,offset BUF1,0

STOP: call ExitProcess,0

;===============================================

Do_Gesture:	; eax = address

;-----------------------------------------------------------

push eax

mov edx,hAgentChar

mov edx,[edx]

call [edx+58h],hAgentChar,1; Stop play

Call SysAllocString; eax

mov ADR1,eax

mov edx,hAgentChar

mov edx,[edx]

call [edx+50h],hAgentChar,eax,offset Var1	; gesture

Call SysFreeString,ADR1

ERR1: ret

;----------------------------------

dija Proc p1:dword

call GetCursorPos, offset Coord

mov edx, hAgentChar

mov edx, [edx]

call [edx+MoveTo], hAgentChar, XX, YY, 1, offset IVAR 

mov esi,offset MAS1+8

mov ecx,p1

LL1:	push ecx

mov eax,[esi]

add esi,16

pop ecx

loop LL1

push eax

call Do_Gesture; eax - address

pop eax

; call MessageBoxW,0,eax,eax,0h

call Sleep,2500

ret

endp

end Start