Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт дек 13, 2018 07:25

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Музыкальная программа
Автор Сообщение
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
Hishnik писал(а):
У меня одного состояние "что это было"?

1+
Сообщение Добавлено: Вт дек 26, 2017 12:18
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
У меня одного состояние "что это было"?
Сообщение Добавлено: Вт дек 26, 2017 11:57
  Заголовок сообщения:  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
Сообщение Добавлено: Пн дек 25, 2017 07:50
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
Hishnik писал(а):
Другое дело, что присланная программа, мягко говоря, не блещет
С одной стороны, да. Можно видеть, что для четырех явных обращений к одному и тому же WIN-API используются, по крайней мере три разных способа: BEEP вызывается напрямую, КЕY и "точка" идут через "окно по умолчанию" (консоль), BYE связывается с "концом программы"... Это плохо для BASIC-примеров и, особенно, для больших программ. Да еще этот идиотский отказ от FORTH-интерактивности, путем создания exe...

С другой стороны, ругать SPF глупо. Он не просто хорош, он почти идеален! Ведь, FORTH пишется под одну задачу. И свою задачу - создание имиджа суперполулярных FORTH-демиургов - авторы SPF решили блестяще. То, что кто-то после этого пытается еще и что-то на SPF писать - это просто ошибка природы...
Сообщение Добавлено: Вс дек 24, 2017 23:42
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
KPG писал(а):
И всё записывать в MIDI формат
Да и клавиатуру лучше поменять (подключить) с клавишами в ряд (пианинного типа)

Возможно, это уже некоторый выход за пределы исходной задачи. Если говорить о демонстрации Форта на чем-то простом, то пищание по нажатию в целом может быть названо "демонстрация". Другое дело, что присланная программа, мягко говоря, не блещет :D
Сообщение Добавлено: Вс дек 24, 2017 21:08
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
Hishnik писал(а):
Если еще корректнее, то надо использовать не код клавиши, а скан-код. Иначе при русском и английской раскладках пищание будет разное. Ну и от скан-кода перейти уже к таблице с нотами. А напоследок - анализировать скан-коды нажатия и отпускания, а не брать 100 мс.

И всё записывать в MIDI формат :)
Да и клавиатуру лучше поменять (подключить) с клавишами в ряд (пианинного типа)
Сообщение Добавлено: Вс дек 24, 2017 20:44
  Заголовок сообщения:  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
Сообщение Добавлено: Вс дек 24, 2017 20:31
  Заголовок сообщения:  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 мс.
Сообщение Добавлено: Вс дек 24, 2017 20:21
  Заголовок сообщения:  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 ( выходим из режима редактирования и компиляция, т.е. все бай-бай )
\ текст программы окончен.
Сообщение Добавлено: Вс дек 24, 2017 19:56
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
shabronov писал(а):
1:0 в пользу Форта за меньшее количество текста? согласны?

1. В бейсиках проще.
2. Не забывайте, что Ваше "меньшее количество" - это SPF + геморрой с созданием .exe
3. Хотя, на FOBOS это выглядит чуть приличнее (добавление BEEP к примеру #6), все равно, бейсики тут вне конкуренции.
Сообщение Добавлено: Вс дек 24, 2017 19:50
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
1:0 в пользу Форта за меньшее количество текста? согласны?
Сообщение Добавлено: Вс дек 24, 2017 19:46
  Заголовок сообщения:  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, но это не правильно.
; Имена меток могут быть с любыми названиями, главное соблюдать
;   правильный порядок их расположения.
Сообщение Добавлено: Сб дек 23, 2017 22:49
  Заголовок сообщения:  Re: Музыкальная программа  Ответить с цитатой
на всякий случай напомню rosetta code хотя не уверен, что там есть такая задача 8)
Сообщение Добавлено: Сб дек 23, 2017 21:15
  Заголовок сообщения:  Музыкальная программа  Ответить с цитатой
\ Все привет. Агитка по форту на языке форта
\ Пример 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
Полемики может бытьи и отвечать есть смысл, если кто-либо приведет аналогичную программу и текст на другом языке программирования.
В этом случае возможно сравнить достоинства и недостатки решения задачи "музыкального нажатия клавиш" на разных языках.
Сообщение Добавлено: Сб дек 23, 2017 18:10

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


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