Звук альта. Дублицирование

  В статье "Моделирование звука альта" обсуждался способ получения звука альта с  ревербератором, создающим эхо.
  Исходным звуком для получения эха был совсем простой звук - короткие пички со значительным пустым пространством между ними.
 
  Для создания эха использовался метод, который можно назвать методом дальнего заброса эха - амплитуда звука, пришедшего в ревербератор, записывалась наперёд на значительные расстояния, соответствующие возвращению отражённого звука от стен зала размером 25 метров с задержкой до 0.15 сек. А уже пришедшее после задержки эхо из ревербератора считывалось и прибавлялось к  сиюсекундному звучанию, вырабатываемому функцией создания звука на текущий момент времени.
  В результате пустой период между отдельными пичками простого звука наполняется пичками эха, и получался красивый полноценный звук, похожий на звук реального альта.
  Всё это происходило внутри функции FNS1, имеющей присоединённый к ней ревербератор FNR1. Собственно задержка звука, доступного для ревербератора определяется размером массива, используемого им.
  В ревербераторе FNR1 массив имеет размер 5000, отсюда и указанная задержка - 0.15=5000/VEL, где VEL=32000 семплов в секунду - скорость раздачи звука в VAW файле.

  Вместе с тем, ревербератор FNR1 (назовём его большим ревербератором) имеет ещё один метод наполнения звуком интервала между пичками - звук непосредственно записывается в ближайший для считывания период по заданным координатам, и считывается почти сразу же, без существенной задержки. Эхо зала в этом методе не ощущается, однако можно говорить об эхе инструмента, поскольку размеры резонатора корпуса альта как раз сопоставимы с длиной периода звука, издаваемого им. Поэтому один или несколько ближайших периодов колебания, с забросам на них амплитуды, очень интересны с точки зрения возможностей синтеза звука.
  Как говорилось в статье, посвящённой ревербератору, техника (или алгоритм) заброса ближнего эха отличается по мнемонике от техники заброса дальнего эха.
  Подобный алгоритм был назван дублицированием.
  Под этот алгоритм был создан FNRS2 - малый вариант большого ревербератора с массивом RS2 размером 1600. Текст малого ревербератора FNRS2, а также текст вспомогательной функции FNRE(AM,K) приведён в конце статьи.


   МНЕМОНИКА И ТЕХНИКА ДУБЛИЦИРОВАНИЯ

   Представьте себе период звукового колебания с некоторым продолжением после него, как линейку, на которой один период укладывается в 60 делений, а максимально доступной является координата 99 -

 00----05----10----15--...--60---....--99.....

   Представим также, что эта линейка наложена на бумагу с клеточками ещё более мелкими, чем расстояния между делениями линейки, и в каждой маленькой клеточке записана амплитуда звука эха.
   В ходе работы мы будем считывать амплитуду эха из клеточки под начальной точкой шкалы линейки, обозначенной как 00, затем продвигать линейку на следующую маленькую клеточку вправо, и затем в клеточки, находящиеся под некоторыми делениями линейки, записывать звук. И затем вновь повторять и повторять этот процесс. 
   Линейка вначале пуста, никакого звука на ней нет. Но в ходе работы мы будем заполнять её по некоторым указанным координатам, амплитудами, дублирующими амплитуду звука на входе в резонатор, и ослабленными в указанное число раз.
   Мнемоническое указание на заполнение периода даётся в виде строки REV21$, например, такой, состоящей из маленьких указаний (порядок их следования неважен), разделённых пробелами -

  REV21$="00+99 05+30 07+30 10+60 14+30 15+30 20+80 21+30 25+30"
   
 указание 10+30 запишет (а, точнее, - добавит) 30% входной амплитуды на координату нашей линейки 10,
 указание 20+80 добавит 80% входной амплитуды на координату 20,
 указание 00+99 добавит практически всю входную амплитуду в самое начало, откуда эти 99% и будут в следующем цикле считаны как эхо.

Небольшое отступление.
  Это указание 00+99 для ревербератора FNRS2 нужно делать, если мы хотим, чтобы было слышно не только эхо, но и был слышан пичок основного звука. Малый ревербератор входит в программу строкой A=FNRS2(A,-2). В рабочем состоянии функция FNRS2 возвращает эхо, а в отключённом состоянии она возвращает параметр A

  Но этого указания не следует делать для большого ревербератора, поскольку он подключается в другой форме: A=A+FNR1(A,-1), учитывающей входную амплитуду в явном виде. И функция большого ревербератора устроена несколько по-другому – в рабочем состоянии FNR1(A,-1) возвращает эхо, в нерабочем состоянии возвращается ноль. Большой ревербератор может употребляться  не только для дублицирования, потому и такая разница.

Продолжим.
  Указание, например такое: 90-80 запишет 80% входной амплитуды с отрицательным значением на нашу линейку уже более отнеся звук наперёд, на координату 90, и если мы каждый период записываем что-то и на координату 30, то ровно через период произойдёт наложение (сложение) этих записей друг на друга.
  Результат нескольких циклов дублицирования будет такой - если за это время через вход ревербератора прошёл целиком короткий пичок на нулевом фоне, то после прохождения этого пичка весь период будет заполнен его ослабленными копиями, накладывающимися друг на друга.

  В принципе, используя короткий пичок и метод дублицирования можно создать любую форму звука внутри периода звукового колебания. Если Вы знаете математику, то вспомните про дельта функцию. Короткий пичок как раз такая функция и есть.
 
 
   ОСУЩЕСТВЛЕНИЕ ИДЕИ ДУБЛИЦИРОВАНИЯ.

   На идею дублицирования навела форма колебаний натурального альта (см. рисунок снизу). Узкий начальный пичок кажется продублированным на остальную часть периода в некоторые его места и с различным ослаблением. Расширение узкого пучка также может быть сделано путём близкого дублирования.   
   Какой физический процесс привёл к такой форме? Обертоны? Эхо? Но мы видим его результат.
   И вот я попросту подобрал строку REV21$ таким образом, чтобы воспроизвести форму реального звука альта. Это удалось сделать, звук при использовании ревербератора с дублицированием получился похожим, хотя и монотонным.

   Из прошлых наших рассуждений, нам понятно, как бороться с монотонностью звука. Нужно не только наполнить период пичками, но и как-то варьировать это наполнение.
   И опять же, идея очень проста - возьмём не одну, а например, три различных строки REV22$, REV23$ и REV24$, согласуем каждую с формой реального звука, взятой из разных его частей, и будем менять эти строки.
   Но как менять? Нельзя менять тембр резко. Резкое и частое изменение чего либо в звуке воспринимается или так треск, или как рычание.
   Для плавной замены одной строки на другую была использована функция FNRE(AM,K), текст которой приведён ниже.


   ФУНКЦИЯ ВАРЬИРОВАНИЯ СТРОКИ FNRE(AM,K)
   
   Первый параметр функции FNRE(AM,K) - AM это некая амплитуда, или абсцисса, блуждающая между -1 и 1, но в основном, придерживающаяся нуля. AM можно задать некой периодической функцией низкой частоты (2-15 Гц), например, треугольником. Функция создания треугольника FNTIM также есть в составе общей программы.

   В ходе варьирования, внутри функции FNRE глобальным строкам REV22$, REV23$ и REV24$ приписываются фиктивные абсциссы -1, 0 и 1, а число AM, задаваемое функции в качестве параметра, принимается за промежуточную абсциссу; соответственно ей, между содержимом строк проводится линейная интерполяция. 
  Результатом интерполяции является новая строка - REV21$, она-то и участвует в дублицировании. Вся эта процедура практически не замедляет общий процесс, поскольку она проходит редко – только в начале каждого периода, в момент корректировки параметров сценария.

   Что касается второго параметра функции FNRE(AM,K) - K, то он указывает на то, с какой именно тройкой строк будет поведена манипуляция. Предусмотрено 3 таких тройки, по числу одновременно работающих функций создания звука - будущая общая программа озвучивания будет рассчитана на трио, - озвучивание с одновременным звучанием трёх инструментов.


   ЭКСПЕРИМЕНТАЛЬНЫЙ СЦЕНАРИЙ, ЕГО ПАРАМЕТРЫ И УКАЗАНИЯ

   Итак, из трёх строк для целей дублицирования мы получаем одну, с вариативным "рельефом местности" между короткими пичками.
   Рассмотрим теперь сценарий получения звука альта -

  CASE 6 ' alt sound
      MU2=INT(32*F/220)+.1 : AU2=4 : DU2=160.998
      mod2=32 : Vi=.35
      MU5=-304 : AU5=1 : DU5=.998 :
      DK1=.94
      REV22$="00+99 05+30 07+00 10+30 14+00 15+30 20+30 21+00 25+30" 'C
      REV23$="00+99 05+30 07+30 10+60 14+30 15+30 20+80 21+30 25+30"
      REV24$="00+99 05+00 07+30 10+00 14+30 15+00 20+00 21+30 25+00"
      V=FNRE(0,2)
      V=FNRS2(F,2)
   CASE -6 : V=FNRE(FNTIM(4,T)*.5,2)
      IF NT=100 THEN MU2=MU2*2-.1
      Vo=.1*FNTIM(16/(1+T),T)

  Файл "Изменение тембра" - https://yadi.sk/d/J5xNmxmEq9v4i
сделан программой ZAW_S2 по этому сценарию. Можете его прослушать, но прочитайте пока пояснения.

  Первый параметр сценария MU2=INT(32*F/220)+.1 задаёт лёгкое амплитудное вибрато, период которого привязан к частоте 220 Гц и сохраняется таким же и на других частотах звука. Период этого вибрато для ухода от монотонности увеличивается в 2 раза в начале 100-го периода строкой IF NT=100 THEN MU2=MU2*2-.1
   
  Строка mod2=32 : Vi=.35 устанавливает режим виолы с относительно широким звучанием.
 
  Квазиобертон MU5=-304 заполняет невысокими острыми и частыми пичками весь период. Без таких пичков, как оказывается, характерный альтовый тембр не будет услышан, хотя только эти пички тембр альта не создают. Всё дело в том, что пички, задаваемые строками REV22$, REV23$, REV24$, варьируемые обращением V=FNRE(FNTIM(4,T)*.5,2) и двигаемые вправо-влево строкой  Vo=.1*FNTIM(16/(1+T),T) тоже сами по себе в тембр альта не очень попадают.
  Для создания альтового тембра нужна интерференция. Тембр альта можно уподобить узору муара появляющимся при совмещении разнопериодических структур. Это или интерференция движущихся пичков между собой в процессе заброса дальнего эха (процесс этот был описан в предыдущей статье), или вот - для интерференции приходится создавать некую неподвижную структуру, в виде квазиобертона.
  Параметр oKA=5 указывает на число периодов атаки - нарастания до полной силы обертонного звука.

Обращение к ревербератору V=FNRS2(F,2) указывает ревербератору рабочую частоту и включает его в работу.
 
  Задание параметра DK1=.94 определяет диссипативный фактор, постепенно приводящий среднюю линию колебаний к нулевой линии на осциллограмме. Ни на звук, ни на его тембр этот фактор практически не влияет.


  ЗАПОЛНЕНИЕ МАССИВА ЭХОМ ПО ЗАДАННОМУ СЦЕНАРИЮ 

  Взглянем на строку, которую мы в основном будем использовать для дублицирования по приведённому выше сценарию -

 REV23$="00+99 05+30 07+30 10+60 14+30 15+30 20+80 21+30 25+30"

  Задавая эту строку, я не привязывал её к реальному звуку альта, но использовал некоторые теоретические предположения, касающиеся обертонного состава звука. Тем более эти теоретические соображения кажутся мне очень интересными.

  В следующей, планируемой мной статье речь пойдёт о флажолетах. Расскажу я о них и сейчас, несколько опережая события.
  Флажолетом называется обертонный звук, возникающий на струне, которая возбуждается смычком, а на грифе не зажимается, а только ограничивается в своём движении лёгким касанием пальца. Точка касания пальцем струны называется точкой извлечения флажолета. Таких точек на струне множество, но на некоторых (речь идёт примерно о пяти точках) флажолет звучит более отчётливо.
  Флажолет имеет сложный обертонный состав. Наиболее слышны низкие обертоны флажолета.

  Идея состоит в том, что в качестве обертонов в звуке струнно смычковых инструментов звучат именно флажолеты.
  И в самом деле, смычок выполняет двойственную функцию - с одной стороны он своим движением возбуждает колебания струны, с другой - прижимаясь к струне, он гасит многие колебания, но оставляет те, которые имеют узел в месте касания смычком струны.
  То есть, оставляет в колебаниях струны именно те обертоны, которые составляют флажолет.

  Наиболее сильный обертон, наиболее явственно звучащего флажолета - это третий обертон с частотой F*3. Период его колебания в 3 раза меньше, чем период основного колебания. Но, как Вы помните, мы мнемонически соотнесли период основного колебания с числом 60. И, взгляните на строку REV23$, в ней среди всех мест для дублицирования указано место и амплитуда самого высокого пичка 20+80.
  Остальные пички, соответствующие другим обертонам указанного флажолета (9-му и 12-му) тоже располагаются на координатах 5, 7, и им кратным 10, 14, 15, 21, 20.

  Я отдал этим пичкам чуть больше трети периода, хотя можно было бы дотянуть до появления нового пичка. Но ведь возбуждённые смычком колебания могут и быстро затухнуть. Но могут и вернуться в виде гармоничного эха. Подобный прерывистый обертон, представляющий собой не сплошной ряд, а серию пичков с пропусками, можно назвать неполным.
  Строки для вариаций REV22$ и REV24$ я отдал 9-му и 12-му обертонам флажолета.

   
  ЗВУК АЛЬТА, ЭХО, ИЗМЕНЕНИЯ ТЕМБРА

  Давайте, наконец, прослушаем запись - "Изменение тембра" https://yadi.sk/d/J5xNmxmEq9v4i

  Первые 4 звука в ней сделаны точно по указанному сценарию. Звучит вполне достойно. И приятно даже, что звук получен не слепым копированием реальности, а по соображениям теории, с учётом обертонного состава флажолета.
  Как отмечалось, результат обеспечен 3-мя факторами - движением пичка, дублицированием с вариацией формы, и пичками квазиобертона. Ещё немного даёт амплитудное вибрато. Чего не чувствуется - разве что эха. И хоть у нас ревербератор и небольшой, но небольшое эхо мы попробуем в нём сделать.

  Но прежде, убрав вибрато и квазиобертон, посмотрим на форму полученного колебания. На рисунке, в среднем ряд слайдов, слева - чистые пички до наложения на них дублицирования, второй слева слайд - форма сценария о котором мы говорим. Действительно, видно, что дублицированием заполнена только начальная треть периода. Звук записали и тут же считали, ясно, что никакого эха мы не услышим.

   Но изменим чуть наш сценарий. Обратимся к ревербератору V=FNRS2(F/2,2), разделив частоту надвое.
   Что изменится? Координаты дублицирования увеличатся вдвое, и дублицирование займёт пичками почти всю свободную часть периода - см. третий слайд слева. Но изменится ли звук? Почти что нет - ведь частота появления пичка на входе в ревербератор осталась прежней. Неизменной осталась и координата его считывания 00 осталось 00. Обертонное наполнение спустилось на октаву ниже, но пички не стали шире.
   Обращение V=FNRS2(F/4,2) создаёт форму с "могучими" пичками в центре периода, напоминающую одну из форм реального звука - последний слайд в среднем ряду.

  Вернёмся к записи.
 
  Вторые звуки сделаны по сценарию 6 с обращением V=FNRS2(FS/8,2). Звук сохранил тембр, но наполнился чуть ощутимым эхом.

  Третьи звуки сделаны с тем же обращением, но с другими строками наполнения. Пички для строк дублицирования были взяты по обертонам слабого флажолета с точкой извлечения, расположенной ближе к подставке. Несмотря на эхо звук стал беднее. И в форме его те самые, "могучие", пики отсутствуют, осталась мелочь.
  Не правда ли, наш компьютерно-математический эксперимент хорошо объясняет известное изменение тембра при игре со смещением смычка ближе к подставке.

  При игре, ближе к подставке (так называемое понтичелло) и звук становится резче - оно и понятно, струна менее охотно тянется за смычком, срывается раньше, и пичок становится короче.
  Сократим пичок и мы. Для следующих четырёх звуков значение параметра Vi=.35 было заменёно на Vi=.18

  Для следующих четырёх звуков была увеличена вдвое частота квазиобертона - MU5=-308. Появился характерный для игры вблизи подставки свист.

  Таким образом, мы видим, что наши манипуляции с параметрами и строками наполнения хорошо и достаточно просто передают изменения тембра реального альта - так называемые штрихи, которые в своей игре использует исполнитель. 

  Звуки реального альта приведены в конце записи.
  Конечно, реальный звук отличается от синтезированного, и нюансами, вносимыми исполнителем, и тембром. Но и наш, синтезированный звук, я считаю не менее красивым и интересным.
  Если в Вашем распоряжении есть звуковой редактор Wave edit, то посмотрите на последний звук - на эхо выходящее из альта, после окончания звука в увеличенном временном масштабе.
  Сам последний звук реального альта, очень спокойный, низкий и глубокий, содержит тот самый внутрипериодный "могучий" пичок, который сохраняется и звучит дольше основного звука, создаваемого смычком и струной.
  Этот звук накоплен, видимо, внутри резонатора альта, и выходит долго, вначале сохраняя свою характерную "зазубристую" форму, а затем, теряя высокие обертоны, он обращается в гладкую синусоиду. Это ли не демонстрация того, насколько эхо важно в формировании звука альта?


   ЕЩЁ НЕСКОЛЬКО ЭКСПЕРИМЕНТОВ

   Этот самый последний, спокойный и глубокий звук я постарался тоже имитировать. Я убрал из сценария всякие резкости. В качестве основного звука использовал широкий пичок без выпада в отрицательную область после него. Строками для дублицирования создал "могучие пички" в зоне 3-го обертона. Вместо резкого квазиобертона присоединил обычный 3-й обертон - гладкую синусоиду небольшой интенсивности.
   Запись результата "Спокойный звук" можно прослушать тут - ,
https://yadi.sk/d/L7mwhSJKq9x4H   
  CASE 6
      AU2=2 : DU2=60.999      
      mod2=30 : Vi=.25 : Vh=1.2
      IF F<260.74 THEN Vi=.55 'вторые два звука
      MU5=3 : AU5=.5 : DU5=.998
      oKA=100 : DK1=.92
      REV22$="00+99 23+00 25+00 27+90 30+50"
      REV23$="00+99 23+00 25+90 27+00 30+50"
      REV24$="00+99 23+90 25+00 27+00 30+50"
      V=FNRE(0,2) : V=FNRS2(FS/8,2)
   CASE -6 : V=FNRE(FNTIM(5,T)*.5,2)
       IF NT=100 THEN MU2=MU2*2-.1
       Vo=.1*FNTIM(14/(1+T),T)
       IF NT=270 THEN DU2=.94 : V=FNRE(0,2)

   По сценарию первые два звука из четырёх идут с Vi=.25, а следующие два - с широким пичком Vi=.55. Эту смену тембра Вы можете слышать на звуке ноты До. Замыкает запись реальный звук альта.
   Слышно, что тембр звука синтезированного отличается от реального звука альта - в синтезированном звуке ощущается тембр трубы. Отличие вызвано гладкостью формы синтезированного звука. Внутри звука реального на осциллограмме кроме общих плавных форм наблюдаются местные отступления от них в виде небольших зазубрин, вносящих асимметрию в формы пичков.

   Но тем не менее звук похож, в том числе и выходящим из него эхом. Правда в синтезированном звуке эхо не настоящее - оно имитировано 3-м обертоном, тогда как основной звук искусственно обрывается на 270-м периоде звучания, это Вы можете видеть по сценарию. Интересно, что эхо, выходящее из реального звука тоже не имеет частоту основного колебания, оно также является обертоном, только вторым.
   Интересно также, что в обоих случаях наш слух этого не замечает.


   Следующий, и последний эксперимент, о котором я расскажу, был также сделан на пути создания "спокойного" звука. В сценарий с известными уже Вам строками для дублицирования были добавлены негромкие обертоны 3, 6 и 9, а также очень громкий квазиобертон MU5=-301 : AU5=5 с отрицательным значением диссипативного параметра DU5=-.998 приводящего, помимо ослабления, к смене знака квазиобертона на каждом периоде. В результате получается также квазиобертон, но создающий звук но октаву ниже. Получается сильный "басовитый" звук, оригинальный тембр которому создаёт весь остальной сценарий, звучащий на более высоких частотах.

файл "Басовитый звук" сделан программой ZAW_S2 по сценарию
  CASE 6 ' alt sound
      MU2=INT(32*F/220)+.1 : AU2=2 : DU2=160.998
      mod2=30 : Vi=.45 : Vh=1.2
      MU5=-301 : AU5=5 : DU5=-.998 : oKA=100
      MU7=5.99 : AU7=.4 : DU7=.998
      MU6=3.01 : AU6=.5 : DU6=.998
      MU9=9 : AU6=-.5 : DU6=.998
      DK1=.92

      REV22$="00+99 23+00 25+00 27+90"
      REV23$="00+99 23+00 25+90 27+00"
      REV24$="00+99 23+90 25+00 27+00"
      V=FNRE(0,2)
      V=FNR2(FS,2)
   CASE -6 : V=FNRE(FNTIM(5,T)*.5,2)
       IF NT=100 THEN MU2=MU2*2-.1
       Vo=.2*FNTIM(14/(1+T),T)

   Четыре звука, сделанные по этому сценарию, Вы можете прослушать здесь -
"Басовитый звук" https://yadi.sk/d/sriCEubCq9xDx

вслед за басовитыми звуками идут те же звуки без придающего басовитость квазиобертона MU5, усиленные в 2 раза,
   Тембр полученных звуков мне показался интересным.

   РЕЗЮМЕ

   В общем, программа создания звука с малым ревербератором показала себя продуктивной для проведения разных экспериментов по созданию звука. Интересующийся читатель может сам проделывать подобные эксперименты. По адресу - https://yadi.sk/d/Ca2WYIkeq9w48 
находится папку с Турбо Бейсиком и программами ZAV_S1.bas и ZAV_S2.bas, содержащими всё необходимое для создания звуковых файлов с использованием большого (первая программа) и малого (вторая программа) ревербераторов. Турбо Бейсик безо всяких проблем работает в Виндос-ХР.
   По адресу – http://samlib.ru/m/muratow_s_w/bowing.shtml
в интернете находится описание множества штрихов, используемых при игре на скрипке, и попробовать в синтетическом звуке реализовать то, что там написано было бы очень интересно.
   Интересно и с познавательной точки зрения, и с практической – в дальнейшем, при озвучивании мелодии, указания на штрихи можно было бы располагать в партитуре, и передавать их делающей звук функции не путём смены сценариев, а через внешние глобальные параметры, а саму функцию сделать «умной» - пусть она читает штрихи, указанные в глобальных параметрах и подстраивает свои внутренние параметры под них. Да и сценарии она могла бы менять хоть и ориентируясь на партитуру, но по своему усмотрению.
   Подобно исполнителю, читающему «легато» и орудующему своим смычком так, чтобы это легато было исполнено наилучшим образом.
   Наделить программу создания звука искусственным музыкальным интеллектом. Казалось бы – фантазия, но некоторые шаги в этом направлении можно сделать и опробовать уже сейчас.

   ДОПОЛНЕНИЕ. ТЕКСТЫ ПОДПРОГРАММ ВАРИАЦИИ СТРОКИ, И МАЛОГО РЕВЕРБЕРАТОРА

'=============================
DEF FNRE(AM,K) 'make REV1$ variation
LOCAL R1$,R2$,R3$,R4$,S$,M$,A
 A=AM : R1$=""
 SELECT CASE K
  CASE 0 : R2$=REV2$ : R3$=REV3$ : R4$=REV4$
  CASE 1 : R2$=REV12$ : R3$=REV13$ : R4$=REV14$
  CASE 2 : R2$=REV22$ : R3$=REV23$ : R4$=REV24$
  CASE 3 : R2$=REV32$ : R3$=REV33$ : R4$=REV34$
 END SELECT
  DO WHILE LEN(R3$)>4
  S$=LEFT$(R3$,2)
  DR2=VAL(MID$(R2$,3,3)) : DR3=VAL(MID$(R3$,3,3)) : DR4=VAL(MID$(R4$,3,3))
  IF A<-1 THEN A=-1
  IF A>1 THEN A=1
  IF A>0 THEN DR=DR4*A+DR3*(1-A) ELSE DR=-DR2*A+DR3*(1+A)
  M$=STR$(CEIL(DR)) : IF LEN(M$)=2 THEN M$=LEFT$(M$,1)+"0"+MID$(M$,2)
  R1$=R1$+S$+M$+" "
  R2$=MID$(R2$,7) : R3$=MID$(R3$,7) : R4$=MID$(R4$,7) : LOOP
 SELECT CASE K
  CASE 0:REV1$=R1$: CASE 1:REV11$=R1$: CASE 2:REV21$=R1$: CASE 3:REV31$=R1$
 END SELECT : FNRE=A
END DEF
'======

DIM RS2(1600)
DEF FNRS2(A,N) 'dubl make only
STATIC P,P1,A1,A2,N1,N3,SW%
LOCAL I,REV$,D
  N1=1600
  IF N>=0 THEN
      P1=1 :  SW%=CINT(N) : FOR I=0 TO N1 : RS2(I)=0 : NEXT I
      N3=60 : IF A>=20 THEN  N3=VEL/A
      FNRS2=N3 : EXIT DEF
  END IF
     'work
      IF SW%+CINT(N)<>0 THEN FNRS2=A : EXIT DEF
     A2=A : RS2(P1)=A1/100 : P1=P1+1 : IF P1>N1 THEN P1=1
     REV$=REV21$ 'dubl make
     DO WHILE LEN(REV$)>4
          P=VAL(LEFT$(REV$,2))*N3/60 : D=VAL(MID$(REV$,3,3))/100
          P=INT(P)+P1 : IF P>N1 THEN P=P-N1
          IF P<=N1 THEN RS2(P)=RS2(P)+A2*D
          REV$=MID$(REV$,7) : LOOP
     FNRS2=RS2(P1)
END DEF
'================
   


Рецензии