Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 10:36

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Музыкальная программа
СообщениеДобавлено: Сб дек 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
Полемики может бытьи и отвечать есть смысл, если кто-либо приведет аналогичную программу и текст на другом языке программирования.
В этом случае возможно сравнить достоинства и недостатки решения задачи "музыкального нажатия клавиш" на разных языках.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Сб дек 23, 2017 21:15 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
на всякий случай напомню rosetta code хотя не уверен, что там есть такая задача 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Сб дек 23, 2017 22:49 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Ну, если вспомнить Колибри, то там такое как пример (только я убрал пару переносов):
Код:
;   Простой пример программы для 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, но это не правильно.
; Имена меток могут быть с любыми названиями, главное соблюдать
;   правильный порядок их расположения.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 19:46 
1:0 в пользу Форта за меньшее количество текста? согласны?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 19:50 
shabronov писал(а):
1:0 в пользу Форта за меньшее количество текста? согласны?

1. В бейсиках проще.
2. Не забывайте, что Ваше "меньшее количество" - это SPF + геморрой с созданием .exe
3. Хотя, на FOBOS это выглядит чуть приличнее (добавление BEEP к примеру #6), все равно, бейсики тут вне конкуренции.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 19:56 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
_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 ( выходим из режима редактирования и компиляция, т.е. все бай-бай )
\ текст программы окончен.


Последний раз редактировалось KPG Вс дек 24, 2017 20:26, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 20:21 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
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 мс.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 20:31 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
Чуть корректнее[

Код:
BEGIN
  KEY  DUP 0x20 > IF
    100 SWAP 0x10 * ZWUK
  THEN
0x20 = UNTIL


Или :)
Код:
BEGIN
   KEY DUP BL <>   
WHILE
   100 SWAP 0x10 * ZWUK
REPEAT
DROP


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 20:44 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
Если еще корректнее, то надо использовать не код клавиши, а скан-код. Иначе при русском и английской раскладках пищание будет разное. Ну и от скан-кода перейти уже к таблице с нотами. А напоследок - анализировать скан-коды нажатия и отпускания, а не брать 100 мс.

И всё записывать в MIDI формат :)
Да и клавиатуру лучше поменять (подключить) с клавишами в ряд (пианинного типа)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 21:08 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
И всё записывать в MIDI формат
Да и клавиатуру лучше поменять (подключить) с клавишами в ряд (пианинного типа)

Возможно, это уже некоторый выход за пределы исходной задачи. Если говорить о демонстрации Форта на чем-то простом, то пищание по нажатию в целом может быть названо "демонстрация". Другое дело, что присланная программа, мягко говоря, не блещет :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вс дек 24, 2017 23:42 
Hishnik писал(а):
Другое дело, что присланная программа, мягко говоря, не блещет
С одной стороны, да. Можно видеть, что для четырех явных обращений к одному и тому же WIN-API используются, по крайней мере три разных способа: BEEP вызывается напрямую, КЕY и "точка" идут через "окно по умолчанию" (консоль), BYE связывается с "концом программы"... Это плохо для BASIC-примеров и, особенно, для больших программ. Да еще этот идиотский отказ от FORTH-интерактивности, путем создания exe...

С другой стороны, ругать SPF глупо. Он не просто хорош, он почти идеален! Ведь, FORTH пишется под одну задачу. И свою задачу - создание имиджа суперполулярных FORTH-демиургов - авторы SPF решили блестяще. То, что кто-то после этого пытается еще и что-то на SPF писать - это просто ошибка природы...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Пн дек 25, 2017 07:50 
Вопрос вернулся своему хозяину.
Музыкальное нажатие клавиш на форте плавно перешло в
музыкальный автомат например на 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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вт дек 26, 2017 11:57 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
У меня одного состояние "что это было"?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Музыкальная программа
СообщениеДобавлено: Вт дек 26, 2017 12:18 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Hishnik писал(а):
У меня одного состояние "что это было"?

1+

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB