Forth http://fforum.winglion.ru/ |
|
Музыкальная программа http://fforum.winglion.ru/viewtopic.php?f=2&t=3150 |
Страница 1 из 1 |
Автор: | shabronov [ Сб дек 23, 2017 18:10 ] |
Заголовок сообщения: | Музыкальная программа |
\ Все привет. Агитка по форту на языке форта \ Пример 5 выполнение музыкального нажатия клавиш. начало текста \ Выполнение музыкального нажатия клавиш \ подключение функций системы для формирования звуковых колебаний, т.е. генерации сигналов. WINAPI: MessageBeep USER32.DLL ( пищание системного динамика ) WINAPI: Beep KERNEL32.DLL ( ФУНКЦИЯ т-МС F-ГЦ -- ) : ZWUK ( Т-мс F-гц --- ) Beep DROP ; DECIMAL : MAIN ( основное слово выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре ) CR S" Для выхода из программы нажать клавишу ПРОБЕЛЛ, для продолжения любую другую " ANSI>OEM TYPE 1 ( K -- ) BEGIN 0x10 * 100 SWAP 2DUP . . ZWUK KEY DUP 0x20 = UNTIL ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ ) ; \ подготавливаем переменные и текст программы записываем в исполняемый файл. 0 TO SPF-INIT? ( в переменную записываем код 0 – означает что инициализация выполняется ) ' NOOP MAINX ! ( в переменную записываем адрес выхода ) ' MAIN TO <MAIN> ( в переменную записываем старт программы со слова MAIN ) S" test2.exe" SAVE ( сохраняем файл исполнения с именем test2.exe ) BYE ( выходим из режима редактирования и компиляция, т.е. все бай-бай ) \ текст программы окончен. Написано на версии форта http://www.enet.ru/win/cherezov/index.html Полемики может бытьи и отвечать есть смысл, если кто-либо приведет аналогичную программу и текст на другом языке программирования. В этом случае возможно сравнить достоинства и недостатки решения задачи "музыкального нажатия клавиш" на разных языках. |
Автор: | mOleg [ Сб дек 23, 2017 21:15 ] |
Заголовок сообщения: | Re: Музыкальная программа |
на всякий случай напомню rosetta code хотя не уверен, что там есть такая задача 8) |
Автор: | _KROL [ Сб дек 23, 2017 22:49 ] |
Заголовок сообщения: | Re: Музыкальная программа |
Ну, если вспомнить Колибри, то там такое как пример (только я убрал пару переносов): Код: ; Простой пример программы для KolibriOS
; озвучивает код нажатой клавиши ; ; Компилировать FASM'ом ; Можно открыть example.asm через программу FASM (её ярлык есть ; на рабочем столе) ; А можно просто нажать F9 в Tinypad'е. Лог компиляции ; отображается на доске отладки (программа BOARD) ; ; Что важно знать при программировании под Колибри: ; Номер функции помещается в регистр eax. ; Вызов системной функции осуществляется командой "int 0x40". ; Все регистры, кроме явно указанных в возвращаемом значении, ; включая регистр флагов eflags, сохраняются. ; ; Пример: ; mov eax, 1 ;Функция 1 - поставить точку в окне ; ;список сисфункций см. в DOCPACK - sysfuncr.txt ; mov ebx, 10 ; координата x=10 ; mov ecx, 20 ; координата y=10 ; mov edx, 0xFFFfff ;цвет точки ; int 0x40 ;вызвать функцию ; ; Тоже самое с использованием макроса: ; mcall 1, 10, 20, 0xFFFfff ;--------------------------------------------------------------------- use32 ; включить 32-битный режим ассемблера org 0 ; адресация с нуля db 'MENUET01' ; 8-байтный идентификатор MenuetOS dd 1 ; версия заголовка (всегда 1) dd START ; адрес первой команды dd I_END ; размер программы dd MEM ; количество памяти dd STACKTOP ; адрес вершины стэка dd 0 ; адрес буфера для параметров dd 0 ; зарезервировано include "macros.inc" ; макросы облегчают жизнь ассемблерщиков! ;--------------------------------------------------------------------- ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- START: red: ; перерисовать окно call draw_window ; вызываем процедуру отрисовки окна ;--------------------------------------------------------------------- ;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- ;--------------------------------------------------------------------- still: mcall 10 ; функция 10 - ждать события cmp eax,1 ; перерисовать окно ? je red ; если да - на метку red cmp eax,2 ; нажата клавиша ? je key ; если да - на key cmp eax,3 ; нажата кнопка ? je button ; если да - на button jmp still ; если другое событие - в начало цикла ;--------------------------------------------------------------------- key: ; нажата клавиша на клавиатуре mcall 2 ; функция 2 - считать код символа (в ah) mov [Music+1], ah ; записать код символа как код ноты ; функция 55-55: системный динамик ("PlayNote") ; esi - адрес мелодии ; mov eax,55 ; mov ebx,eax ; mov esi,Music ; int 0x40 ; или коротко: mcall 55, eax, , , Music jmp still ; вернуться к началу цикла ;--------------------------------------------------------------------- button: mcall 17 ; 17 - получить идентификатор нажатой кнопки cmp ah, 1 ; если НЕ нажата кнопка с номером 1, jne still ; вернуться .exit: mcall -1 ; иначе конец программы ;--------------------------------------------------------------------- ;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- ;--------------------------------------------------------------------- draw_window: mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки mcall 48, 3, sc,sizeof.system_colors ; далее: сначала длинный вариант (закомментированный) ; затем короткий аналог с использованием макросов ; mov eax,0 ; функция 0: определить окно ; mov ebx,200*65536+300 ; [x старт] *65536 + [x размер] ; mov ecx,200*65536+150 ; [y старт] *65536 + [y размер] ; mov edx, [sc.work] ; цвет фона ; or edx, 0x33000000 ; и тип окна 3 ; mov edi,header ; ЗАГОЛОВОК ОКНА ; int 0x40 mov edx, [sc.work] ; цвет фона or edx, 0x33000000 ; и тип окна 3 mcall 0, <200,300>, <200,150>, , ,title ; вывод текстовой строки mov ecx, [sc.work_text] ; цвет фона or ecx, 0x90000000 ; и тип строки mcall 4, <10, 20>, , message mcall 12, 2 ; функция 12.2, закончили рисовать ret ; выходим из процедуры ;--------------------------------------------------------------------- ;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- ; Вот такая вот короткая "мелодия". ; Второй байт изменяется нажатием клавишы Music: db 0x90, 0x30, 0 sc system_colors message db 'Нажмите любую клавишу...',0 title db 'Пример программы',0 ;--------------------------------------------------------------------- I_END: ; метка конца программы rb 4096 ; память для стека align 16 STACKTOP: ; метка вершины стека (при заполнении стек ; растет в сторону уменьшения адресов, потому ; память для него в коде программы встречается ; раньше чем его вершина) MEM: ; метка указывающая на конец программы плюс ; размер используемой ею оперативной памяти ; Адрес метки MEM всегда должен быть больше чем адрес метки I_END. ; Метка STACKTOP должна располагается после метки I_END и перед меткой ; MEM. STACKTOP может находится и перед I_END, но это не правильно. ; Имена меток могут быть с любыми названиями, главное соблюдать ; правильный порядок их расположения. |
Автор: | shabronov [ Вс дек 24, 2017 19:46 ] |
Заголовок сообщения: | Re: Музыкальная программа |
1:0 в пользу Форта за меньшее количество текста? согласны? |
Автор: | gudleifr [ Вс дек 24, 2017 19:50 ] |
Заголовок сообщения: | Re: Музыкальная программа |
shabronov писал(а): 1:0 в пользу Форта за меньшее количество текста? согласны? 1. В бейсиках проще. 2. Не забывайте, что Ваше "меньшее количество" - это SPF + геморрой с созданием .exe 3. Хотя, на FOBOS это выглядит чуть приличнее (добавление BEEP к примеру #6), все равно, бейсики тут вне конкуренции. |
Автор: | KPG [ Вс дек 24, 2017 19:56 ] |
Заголовок сообщения: | Re: Музыкальная программа |
_KROL писал(а): Ну, если вспомнить Колибри, то там такое как пример (только я убрал пару переносов): На SPF4 и в Колибри ОС можно на Форт делать программы P.S. Функционал представленной программы - это по нажатию любой клавиши (кроме пробела) увеличивать частоту, генерируемого 100мс сигнала, умножением на 16 от кода клавиши, печвтать два значения частоты и длительности воспроизводимого сигнала и проверять вводимые (нахатия клавиш) символы на BL (0x20) для завершения программы. Почему проверка на 1 (в комментариях) ( т.е первое 1 до Begin это для компенсации "первичной потери" числа, пока вводимые клавишы не станут задавать тон звука.) Код: WINAPI: MessageBeep USER32.DLL ( пищание системного динамика )
WINAPI: Beep KERNEL32.DLL ( ФУНКЦИЯ т-МС F-ГЦ -- ) : ZWUK ( Т-мс F-гц --- ) Beep DROP ; DECIMAL : MAIN ( основное слово выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре ) CR S" Для выхода из программы нажать клавишу ПРОБЕЛЛ, для продолжения любую другую " ANSI>OEM TYPE KEY ( -- K) BEGIN 0x10 * 100 SWAP 2DUP . . ZWUK KEY DUP BL = UNTIL ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ Пробел, ЕСЛИ НАЖАЛИ ТО КОД СОВПАЛ И ВЫХОДИМ ) ; \ подготавливаем переменные и текст программы записываем в исполняемый файл. 0 TO SPF-INIT? ( в переменную записываем код 0 – означает что инициализация выполняется ) ' NOOP MAINX ! ( в переменную записываем адрес выхода ) ' MAIN TO <MAIN> ( в переменную записываем старт программы со слова MAIN ) S" test2.exe" SAVE ( сохраняем файл исполнения с именем test2.exe ) BYE ( выходим из режима редактирования и компиляция, т.е. все бай-бай ) \ текст программы окончен. |
Автор: | Hishnik [ Вс дек 24, 2017 20:21 ] |
Заголовок сообщения: | Re: Музыкальная программа |
KPG писал(а): Функционал представленной программы - это по нажатию любой клавиши (кроме пробела) увеличивать частоту генерируемого 100мс сигнала на 20 и коду клавиши, Там еще SWAP. Поэтому 100 подкладывается под KEY*0x10 и становится значением периода. Поэтому программа начнет пищать разными негармоничными тонами. KPG писал(а): Почему проверка на 1 (в комментариях) Потому что там структура проверки не вполне продумана. При входе в BEGIN программа пропищит сразу, с частотой 1*16, а потом упрется в KEY и будет ждать нажатия. DUP нужен для того, чтобы отправить это число на новую итерацию в BEGIN. Ну и соответственно, единица перед BEGIN затыкает дыру с отсутствием кода клавиши при первом исполнении этого цикла. В примере выше KEY BEGIN корректнее. Чуть корректнее Код: BEGIN KEY DUP 0x20 > IF 100 SWAP 0x10 * ZWUK THEN 0x20 = UNTIL Если еще корректнее, то надо использовать не код клавиши, а скан-код. Иначе при русском и английской раскладках пищание будет разное. Ну и от скан-кода перейти уже к таблице с нотами. А напоследок - анализировать скан-коды нажатия и отпускания, а не брать 100 мс. |
Автор: | KPG [ Вс дек 24, 2017 20:31 ] |
Заголовок сообщения: | Re: Музыкальная программа |
Hishnik писал(а): Чуть корректнее[ Код: BEGIN KEY DUP 0x20 > IF 100 SWAP 0x10 * ZWUK THEN 0x20 = UNTIL Или Код: BEGIN
KEY DUP BL <> WHILE 100 SWAP 0x10 * ZWUK REPEAT DROP |
Автор: | KPG [ Вс дек 24, 2017 20:44 ] |
Заголовок сообщения: | Re: Музыкальная программа |
Hishnik писал(а): Если еще корректнее, то надо использовать не код клавиши, а скан-код. Иначе при русском и английской раскладках пищание будет разное. Ну и от скан-кода перейти уже к таблице с нотами. А напоследок - анализировать скан-коды нажатия и отпускания, а не брать 100 мс. И всё записывать в MIDI формат Да и клавиатуру лучше поменять (подключить) с клавишами в ряд (пианинного типа) |
Автор: | Hishnik [ Вс дек 24, 2017 21:08 ] |
Заголовок сообщения: | Re: Музыкальная программа |
KPG писал(а): И всё записывать в MIDI формат Да и клавиатуру лучше поменять (подключить) с клавишами в ряд (пианинного типа) Возможно, это уже некоторый выход за пределы исходной задачи. Если говорить о демонстрации Форта на чем-то простом, то пищание по нажатию в целом может быть названо "демонстрация". Другое дело, что присланная программа, мягко говоря, не блещет |
Автор: | gudleifr [ Вс дек 24, 2017 23:42 ] |
Заголовок сообщения: | Re: Музыкальная программа |
Hishnik писал(а): Другое дело, что присланная программа, мягко говоря, не блещет С одной стороны, да. Можно видеть, что для четырех явных обращений к одному и тому же WIN-API используются, по крайней мере три разных способа: BEEP вызывается напрямую, КЕY и "точка" идут через "окно по умолчанию" (консоль), BYE связывается с "концом программы"... Это плохо для BASIC-примеров и, особенно, для больших программ. Да еще этот идиотский отказ от FORTH-интерактивности, путем создания exe... С другой стороны, ругать SPF глупо. Он не просто хорош, он почти идеален! Ведь, FORTH пишется под одну задачу. И свою задачу - создание имиджа суперполулярных FORTH-демиургов - авторы SPF решили блестяще. То, что кто-то после этого пытается еще и что-то на SPF писать - это просто ошибка природы... |
Автор: | shabronov [ Пн дек 25, 2017 07:50 ] |
Заголовок сообщения: | Re: Музыкальная программа |
Вопрос вернулся своему хозяину. Музыкальное нажатие клавиш на форте плавно перешло в музыкальный автомат например на 5 мелодий. тут сложил все для диспута http://shabronov_s2.dyn-dns.ru/temp/forth_shkola/bibl/ компилятор fortha 100_spf4.zip программа 5mel.f программа исполнения 5mel.exe Вот ее текст \ начало текста \ При нажатии клавиш перейти - открыть заданные web страницы и включить mp3 WINAPI: ShellExecuteA shell32.dll ( подключаем библиотеку для работы оболочкой выполнения ) : START_link_clik_V2 ( An n - PZout - выход да или нет ) \ на входе адрес выполнения сайта или музыки DROP ( убрали количество знаков ) 5 ( константа SW_SHOW из библиотеки виндовс ) 0 0 ( An K1 K2 K3 -- ) 3 ROLL ( K1 K2 K3 An -- ) S" open" DROP 0 ShellExecuteA ( pz- --- остался признак выполнили или нет ) ; : START_S ( An n - ) START_link_clik_V2 ( An n - PZout - выход да или нет ) DROP ( просто удалили нафиг а можно и контролировать ) ; : ST1 S" https://www.yandex.ru/" START_S ( An n - ) ; : ST2 S" http://www.rambler.ru/" START_S ( An n - ) ; : ST3 S" http://te.sibsutis.ru/" START_S ( An n - ) ; : MAIN ( основное слово выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре ) CR S" Для выхода из программы нажать клавишу ESC, для продолжения выбрать цифровую клавишу " ANSI>OEM TYPE CR S" клавиша 1 - перейти на yandex " ANSI>OEM TYPE CR S" клавиша 2 - перейти на rambler " ANSI>OEM TYPE CR S" клавиша 3 - перейти сайт кафедры ТЭ СибГУТИ " ANSI>OEM TYPE CR S" клавиши 4...8 - мелодии формата mp3 из сайта Шабронова А.А. " ANSI>OEM TYPE CR S" клавиши 9 - фильм про ТРИЗ " ANSI>OEM TYPE CR 0 BEGIN DUP [CHAR] 1 = IF ST1 THEN DUP [CHAR] 2 = IF ST2 THEN DUP [CHAR] 3 = IF ST3 THEN \ тут музыка и размещаем адреса тутоже DUP [CHAR] 4 = IF S" http://shabronov_s2.dyn-dns.ru/temp/muk ... ela_v1.mp3" START_S THEN DUP [CHAR] 5 = IF S" http://shabronov_s2.dyn-dns.ru/temp/70l ... l_orel.mp3" START_S THEN DUP [CHAR] 6 = IF S" http://shabronov_s2.dyn-dns.ru/temp/muk2_sh/93 vjacheslav_mjasnikov_-_poezd.mp3" START_S THEN DUP [CHAR] 7 = IF S" http://shabronov_s2.dyn-dns.ru/temp/muk2_sh/94 vjacheslav_mjasnikov_-_semki.mp3" START_S THEN DUP [CHAR] 8 = IF S" http://shabronov_s2.dyn-dns.ru/temp/kaf ... _primer/01 Autumn Leaves.mp3" START_S THEN \ тут файл видео по ТРИЗ DUP [CHAR] 9 = IF S" https://yadi.sk/i/CsdHC-f1gwthu" START_S THEN DROP KEY DUP 0x1B = UNTIL ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ ) ; \ подготавливаем переменные и текст программы записываем в исполняемый файл. 0 TO SPF-INIT? ( в переменную записываем код 0 – означает что инициализация выполняется ) ' NOOP MAINX ! ( в переменную записываем адрес выхода ) ' MAIN TO <MAIN> ( в переменную записываем старт программы со слова MAIN ) S" 5mel.exe" SAVE ( сохраняем файл исполнения с именем 5mel.exe ) BYE ( выходим из режима редактирования и компиляция, т.е. все бай-бай ) \ текст программы окончен. Краткие выводы по теме преимущества форта 1. Можно сделать все, но нужно ли делать все? 2. Нет ТЗ и конкретной задачи можно делать и делать. В теме музыкального нажатия по клавишам цели нет. Это только примеры. И развивать нажатие с музыкой можно очень долго. 3. Язык форт не поможет, если нет цели. Он только лишь язык, формализатор. Имеет свои преимущества и недостатки. С уважением ко всем внимающим. И выхожу из данной темы "что лучше форт или не форт". 10:47 25.12.2017 |
Автор: | Hishnik [ Вт дек 26, 2017 11:57 ] |
Заголовок сообщения: | Re: Музыкальная программа |
У меня одного состояние "что это было"? |
Автор: | Victor__v [ Вт дек 26, 2017 12:18 ] |
Заголовок сообщения: | Re: Музыкальная программа |
Hishnik писал(а): У меня одного состояние "что это было"? 1+ |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |