Озвучивание мелодий Пианолы

   Ранее созданная программа "Пианола"  - пианино на клавишах компьютера
http://www.proza.ru/2015/04/02/1593 не была приспособлена для записи звука непосредственно в звуковой файл. Запись приходилось делать через микрофон. Кроме того, звучание оператора SOUND не является таким уж мелодичным, да и вариации звучания с использованием различных тембров оператор SOUND не делает, а они представляются очень интересными.

   Поэтому программа "Пианола" усовершенствована. Помимо мнемонической записи нот в текстовый файл, она теперь позволяет документировать частоты и длительности звучания нот и пауз. Эти данные помещаются в виде списка опять же в текстовый файл, который при желании можно просмотреть и исправить. Файл делается очень быстро, прямо в процессе проигрывания, что нисколько само проигрывание не замедляет.
  Посмотрим на такой файл (файл длинный, многоточия означают пропуски):

 1 ================= TF.TXT   VEL= 32000
 R=8
F= 309.026123046875  T1= 13419  T2= 273
F= 347.6543884277344  T1= 13419  T2= 273
...
F= 293.3333435058594  T1= 13419  T2= 273
F= 309.026123046875  T1= 26838  T2= 547
 L= 13693
F= 293.3333435058594  T1= 13419  T2= 273
F= 309.026123046875  T1= 13419  T2= 273
...
F= 347.6543884277344  T1= 3354  T2= 68
F= 309.026123046875  T1= 26838  T2= 547
 2 ============ 595655  595655  18.614220703125
F= 293.3333435058594  T1= 13419  T2= 273
F= 260.7407836914062  T1= 13419  T2= 273
...
F= 790.0444946289062  T1= 2995  T2= 427
F= 782.2222900390625  T1= 3423  T2= 0
 11 ============ 342325  3839230  119.9759375
,,,
три запятые маркируют окончание файла
  Файл разделён полосочками, соответственно разделению нотной записи на строки.
  В его начале указано первоначальное название файла - TF.TXT (если нужно другое, то файл нужно переименовать) и VEL= 32000 сэмплов/сек - скорость раздачи, которая планировалась в момент создания файла. Далее указываются частоты F (Гц), T1- длительность звучания ноты в сэмплах  и T2- длительность промежутка до начала звучания следующей ноты.
  Паузы указываются так:  L= 13693 - число сэмплов без звука
  Строкой можно вставить указание на громкость звучания: H=5 (5 - средняя громкость).
  Можно вставить строку  R=8 - указание на звуковое исполнение в соответствии с номером CASE таблицы параметров в функции создания звука (по умолчанию - 0 синусоида).
О функции создания звука подробно см. тут http://www.proza.ru/2015/04/18/1425

Давайте этот файл переименуем в TF2.TXT и используем в качестве входного в программе ZAW43Z, записывающей WAV файлы.
Программа эта использует функцию FNSS2( F,K), "делающую звук" так же, как это описано вот здесь - http://www.proza.ru/2015/04/11/1943
  Приводимая по ссылке программа была модернизована, с добавлением опции "z". Кроме того и сама функция "делающая звук" в ней была заменена на более сложную, описанную здесь - http://www.proza.ru/2015/04/18/1425
Вот начало того, что получилось:

'программа ZAW43Z \\\\\\\\\
10 INPUT A$
   SELECT CASE MID$(A$,1,1)
    CASE "e"
      STOP
    CASE "o"
      A1$=A$ : IF LEN(A1$)=2 THEN A1$=MID$(A1$,2)+".wav"
      OPEN "B",#1,A1$ : GOTO 10
    CASE "c"
      CLOSE #1 : GOTO 10
    CASE "l"
      PRINT LOF(1),LOC(1) : GOTO 10
    CASE "s"
      SEEK #1,VAL(MID$(A$,2)) : GOTO 10
    CASE "p"
      PUT$ #1,MID$(A$,2) : GOTO 10
    CASE "g"
      GET$ #1,VAL(MID$(A$,2)),S$
      PRINT S$,"loc=";LOC(1) : GOTO 10
    CASE "h" 'put the head of wav file
      GOSUB 1000 : GOTO 10

    CASE "w" 'make wav sound
SEEK #1,44
      VEL=32000 : A=FNSS2(0,0) : FF=1 : FF2=1 : II=1
 FOR I=1 TO 2000  : M%=0 : PUT$ #1,MKI$(M%) : NEXT I
 FOR I=1 TO 22000*II  : M%=INT(4000*FNSS2(FF*412,8)) : PUT$ #1,MKI$(M%) : NEXT I
 FOR I=1 TO 15000  : M%=INT(4000*FNSS2(FF*FF2*412,0)) : PUT$ #1,MKI$(M%) : NEXT I
      GOTO 10

    CASE "z" 'make wav record - oZvuchivanie
SEEK #1,44
VEL=32000 : FEF=0 : REF=0 : COF=1 'open files and begin work
12 CALL MUZ2("TF2")  ' : CALL MUZ3("TF3") : CALL MUZ4("")
     IF REF=0 THEN GOTO 10
     M%=INT(FEF*1000) : PUT$ #1,MKI$(M%) : COF=2 'continue work
     S$=INKEY$ : IF S$=" " THEN COF=3 'end of work
     FEF=0 : REF=0
       GOTO 12
   END SELECT : GOTO 10

 SUB MUZ2(S2$)
STATIC OP,F,T1,T3,TE,H,L$,KMU
SHARED FEF,REF,COF
  IF COF=1 AND LEN(S2$)>0 THEN
 OP=1 : H=5 : TeMBR=0 : F=0 : T1=0 : T2=0 : OPEN S2$+".TXT" FOR INPUT AS #2
  END IF
    IF OP=0 THEN EXIT SUB
    IF COF=3 THEN CLOSE #2 : EXIT SUB
MU21:
       IF T1=0 AND T2=0 THEN
MU22:
       LINE INPUT #2,L$ : IF LEFT$(L$,3)=",,," THEN OP=0 : CLOSE #2 : EXIT SUB
        IF MID$(L$,6,3)="===" THEN PRINT "2 "+L$ : GOTO MU22
        K=INSTR(L$,"H") : IF K>0 THEN H=VAL(MID$(L$,K+2)) : GOTO MU22
        K=INSTR(L$,"L") : IF K>0 THEN T2=VAL(MID$(L$,K+2)) : F=0 : T1=0
K=INSTR(L$,"F") : IF K>0 THEN F=VAL(MID$(L$,K+3)) : AO=FNSS2( 0,0) :print F
        K=INSTR(L$,"T1") : IF K>0 THEN T1=VAL(MID$(L$,K+3))
        K=INSTR(L$,"T2") : IF K>0 THEN T2=VAL(MID$(L$,K+3))
        K=INSTR(L$,"R=") : IF K>0 THEN TeMBR=VAL(MID$(L$,K+2))
               END IF :  IF T1=0 AND T2=0 THEN GOTO MU21 ' input line
    REF=1 : IF T1=0 THEN T2=T2-1 : EXIT SUB ' pause
    AO=FNSS2(F,TeMBR)*H : T1=T1-1 : IF T1<20 THEN AO=AO*T1/20
    FEF=FEF+AO
 END SUB

'====================
DEF  FNSS2( F,K) ...

видно, что движение по списку  файла TF2.TXT осуществляет функция SUB MUZ2(S2$), которая в свою очередь добавляет амплитуду от инструмента, представленного функцией  FNSS2( F,K) к общей амплитуде. Если инструмент один, то и функция используется одна. Несколько инструментов J могут быть объединены в одно звучание, если использовать несколько наборов TFJ.TXT, MUZJ(S2$), FNSSJ( F,K). Ничто этому не препятствует.
  После запуска программы ZAW43Z
следует ввести "or" - указав на название файла результата "r.wav"
ввести "z" - запустить процесс озвучивания и ждать. Время ожидания зависит от того, в каком режиме работает Бейсик. В Виндос ХР Турбо Бейсик может быть запущен напрямую, и время ожидания сопоставимо со временем звучания, и даже менее того. Если же Бейсик работает через эмулятор, каким является Дос-ящик, то время ожидания растягивается существенно (минут до 40).
   Дос-ящик предназначен для реанимации старых игр. Без замедления, все движения в старых играх происходят слишком быстро. Но для Бейсика это не лучший вариант, хотя вот программа Пианола работает хорошо именно в ящике (звук слышен через колонки, а без ящика - через маленький динамик внутри системного блока).

   Пока мы ждём, я расскажу, что делает программа.
   Прежде всего, установив указатель записи на начало поля - SEEK #1,44
она  указывает  скорость раздачи, устанавливает в ноль амплитуду FEF и сообщение о конце процесса REF -
  VEL=32000 : FEF=0 : REF=0
Если ни одна из вызываемых подпрограмм не укажет, что процесс продолжается (установив  REF=1), то счёт будет окончен и программа вернётся в самое начало, остановится  и напечатает знак вопроса.
COF=1 – команда всем подключённым подпрограммам начинать работу.
COF=2 – команда продолжать работу,  COF=3 – команда срочно заканчивать работу,  это происходит, если нам не нужен дальнейший счёт, мы решили его прервать и нажали для этого клавишу «Пробел».
  В 12-й строке подключается подпрограмма -  CALL MUZ2("TF2")  с указанием того файла, который она будет читать, преобразуя его строки в мелодию. Как видно, ничто не мешает подключить вторую аналогичную подпрограмму со своим файлом - CALL MUZ3("TF3") и, разумеется, со своим инструментом создания звука - FNSS3(F,KMU) например.
   Каждая подпрограмма вносит свою лепту  - амплитуду, прибавляя её к суммарной амплитуде FEF. Таким образом можно добиться одновременного общего звучания нескольких инструментов, представленных каждый своей подпрограммой.
    Общая амплитуда умножается на 1000 и записывается в качестве семпла в звуковой файл. Боитесь, что амплитуда будет слишком большая и хотите всё целиком сделать потише – укажите меньший множитель.
  Всё это продолжается до тех пор, пока процесс дойдёт до своего естественного конца и все файлы будут прочитаны, или процесс будет прерван нажатием клавиши «Пробел».

   Давайте теперь обратимся к тексту подпрограммы MUZ2(S2$) и посмотрим, что делает она.
   При первом обращении она устанавливает флаг открытия в единицу - OP=1 и открывает указанный файл для чтения. Она также устанавливает по умолчанию H=5 : TeMBR=0 : F=0 : T1=0 : T2=0 приготовляясь к дальнейшим действиям ( из текста видно, что TeMBR и R о котором говорилось выше, это одно и тоже – номер таблицы, по параметрам которой будет создаваться звук. Тембр инструмента. )
   Всё остальное очевидно. Чтобы можно было следить за продвижением работы, в процессе счёта на экране печатаются частоты и разделители нотных строк.
   Хочу остановиться на операторах - IF T1<20 THEN AO=AO*T1/20
-они организуют постепенный, за 20 сэмплов спад громкости звука по окончании звучания ноты. Если вы всё же слышите хлопок на высоких частотах и он вам мешает, то увеличиваете число 20, или пишите так –
IF T1<20*F/260  THEN AO=AO*T1/(20*F/260) связывая скорость спада звука с частотой, или что-нибудь в этом роде (сократите на 20).

  Но вот процесс окончен, и у вас на экране появился знак вопроса. 
После окончания процесса нужно последовательно ввести "h" - запись шапки "r.wav" файла, ввести "c" - закрыть файл, и ввести "e" – чтобы выйти из программы  ZAW43Z
  И можно проверять результат. Вычисления делаются в фоновом режиме, во время них можете развлекаться как хотите, ходите по сети, слушайте другие записи и проч.
Вот записи озвученные указанным образом -
https://yadi.sk/d/fpnQEbVNgskEA
https://yadi.sk/d/KnxmpTjNgskqt - можете прослушать прямо на Яндекс диске.

Все программы для работы с Пианолой и программу озвучивания Вы можете скачать тут - https://yadi.sk/d/_r3RuW3HgXFfi одним разом, заодно с подробными пояснениями и с Турбо Бейсиком.

Кто заинтересовался, обращайтесь за советами.
===========
P.S.
Интересные вещи можно делать. Прослушайте сперва первую часть мелодию и догадайтесь, откуда она взялась? Очень мелодично, но ничего нового, это реверс  второй части мелодии, которую Вы сразу же узнаете:
https://yadi.sk/d/1g2qF95ogtHyT - двухголосие, сделано программами Пианола и ZAW43
===
С тех пор, как я написал эту статью прошло немало времени, процесс озвучивания стал более совершенным. Хотите знать подробности - читайте свежие статьи.


Рецензии