РефератыИнформатика, программированиеПрПрограма для анімації музичних творів

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

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


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


Факультет


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


технологій


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


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

з дисципліни


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

Виконав


Студент групи КІ-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/ms
agent). Персонажі можуть виглядати по-різному, але всі вони підтримують один стандартний набір команд.


Технологія 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_ROOTCLSID{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_ROOTInterface{48D12BA0-5B77-11D1-9EC1-00C04FD7081F} [по умолчанию] = IAgentEx; HKEY_LOCAL_MACHINESoftwareCLASSESInterface{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

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:2081
Символов:24767
Размер:48.37 Кб.