Advertisement
Guest User

Untitled

a guest
Aug 4th, 2018
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.79 KB | None | 0 0
  1.  Новости
  2.  by Alone Coder
  3.  
  4. На работе у нас пертурбации, дома веселье, ещё я утонул в
  5. ремонте, поэтому я не попал ни на одно пати, а этот номер газеты
  6. задержался. Думаю, следующий задержится тоже, потому что дела
  7. ещё далеко не закончились. Зато в этом году, спустя уже не знаю
  8. сколько, удалось несколько раз выбраться на карьер, даже с
  9. Louis'ойи детишками - поочерёдно. Пешком. С коляской.
  10.  
  11. ВиделАлексея Бугрова(который мне помогал с компьютером на
  12. презентацииFont Editor'ав1996году). Сейчас у него своя фирма
  13. по разработке железяк, по этому поводу и встречались. Выглядит
  14. очень усталым. Показывал ему демы, его заинтересовали
  15. мультиколоры и бордерныйKOT:).
  16.  
  17. ЗвонилT(c)S'у.Он живёт всё там же, где мы тусовались в
  18. 2000-2002годах, и работает в своей фирме по ремонту сотовых
  19. телефонов. Очень занят. Хотел переманить его к нам на завод в
  20. качестве программиста микроконтроллеров, но не смог убедить. В
  21. Рязани очень трудно найти таких специалистов.
  22.  
  23. CyberDaemonпериодически пишет, присылает новости из игрового
  24. мира (например, чтоSTEPделают новую игру во вселенной
  25. Звёздного Наследия,но не дляSpeccy...).
  26.  
  27. Arwaldвсё ещё ведёт занятия по 2D анимации на киностудии, но я
  28. ни разу не смог его застать.
  29.  
  30. Wandererнаписал (спустя22года!) новую игру -CELL 3326:
  31. https://zxwanderer.github.io/cell3326/Это квест на новом движке
  32. типаLaser Squad.Хоть я и не игрок, но я его прошёл полностью и
  33. подкорректировал пару переводов.Wanderer'ая тоже пытался
  34. переманить, но из меня плохой head hunter :)
  35.  
  36. Hippimanвыпустил игруDizzy and the Mystical Letterна
  37. универсальномDizzyAGE-подобном движке, который он написал на
  38. языкеNedoLang.На настоящий момент игра существует на русском,
  39. английском и португальском языках. Неужели спектрумовские игры
  40. проDizzyне выходили так давно? Какие мы старые... Сейчас
  41. Hippimanвносит последние штрихи в движок и собирается релизить
  42. его отдельно. Уровни редактируются прямо в редактореDizzyAGE.
  43. Теперь каждый сможет сделать свою сериюDizzy:)
  44.  
  45. Karboопять исчез, поэтому его трек не попал в игру. Насколько
  46. мне известно, он сейчас в деревне, а дел там летом много.
  47.  
  48. John Silverзанимается написанием партитур для оркестра и
  49. пропадает в командировках. Последний раз уехал на целый месяц.
  50.  
  51. Зато один композитор изШотландиинаписал, что решил освоитьPro
  52. Tracker 3,обещал поделиться результатами, когда получится :)
  53.  
  54. DimkaMнаписал инструкцию, как работать с расширенной памятью в
  55. компилятореIAR(нажмите кнопку"2"). Пока таких возможностей
  56. нет вNedoLang(Hippimanв своём движкеDizzyразмещал
  57. процедуры и данные по памяти вручную). Может, со временем
  58. получится придумать круче? :)
  59.  
  60. В эмулятореUnreal Speccy Portableпоявилась поддержка
  61. расширенных экрановATM2(Fyrexхотел с удобством читатьACNews
  62. и добился этого :)). Но память пока работает только в верхнем
  63. окне, причём, кажется, порты#7ffdи#fff7устанавливают один и
  64. тот же регистр.
  65.  
  66. Utz/irrlicht projectорганизует конкурс графики под64цвета на
  67. точку (как вEye Ache 2) наInternational Symposium on Bits and
  68. Beverages.
  69. Картинки надо рисовать в тулзеStellarPaint:
  70. http://irrlichtproject.de/stellarpaint/
  71. Или просто сделатьPNGкартинку64x48с этой палитрой:
  72. http://
  73. irrlichtproject.de/stellarpaint/stellarmode_gimp_tools.zip
  74. И прислать по адресу1bitforum@posteo.netдо18 сентября 2018
  75. года. Не больше двух работ от автора, никаких конверсий или
  76. ограничений на свободное распространение!
  77.  
  78. ЕщёUtzнаписал по поводу своего языка программирования для
  79. музыки (разговор завязался благодаря проекту языкаListh,
  80. опубликованному в прошлом номере):
  81.  
  82. Utz>
  83. Сейчас я переделываюMDAL(https://utz82.github.io/MDAL/).
  84. На сайте сейчас не совсем понятно, но в общем там 3 вещи:
  85. -MDMOD- абстрактный универсальный язык разметки;
  86. -MDCONF- стандарт передачи данных, основанный на XML, который
  87. описывает, как из универсальногоMDMODна входе получить
  88. специфический для данного звукового устройства ассемблерный
  89. результат;
  90. -libmdal- библиотека, реализующаяMDMODиMDCONFдля
  91. использования (в будущем) в качестве бэк-энда для PC-шных
  92. трекеров.
  93. Ещё имеетсяbintracker(https://utz82.github.io/bintracker/) -
  94. собственно, тестовая реализация.
  95.  
  96. В последнее время я написал проект спецификации новой версии
  97. MDCONF(поскольку первая версия оказалась слишком ограниченной
  98. по возможностям).
  99. Теперь я переписываю реализациюlibmdalв соответствии с этой
  100. новой спецификацией (с нуля, так что я могу написать код
  101. получше, благодаря всему, чему я научился за последний год).
  102.  
  103. Alone>
  104. У меня была идея по поводу рекурсивного музыкального языка (и
  105. трекерного интерфейса), с которым можно реализовать ранее
  106. недостижимые музыкальные фишки.
  107.  
  108. Допустим, у нас AY музон, состоящий из паттернов, а те состоят
  109. из треков на каждый канал. Каждый трек может содержать множество
  110. инструментов (звуковых эффектов), которые играют одновременно, а
  111. слышно только самый громкий на текущий момент. Нота в треке с
  112. номером инструментаNможет означать одно из двух:
  113. -перезапускзвукового эффектаNв этом канале(стаккато);
  114. -изменение частоты тонав звуковом эффектеNв этом канале
  115. (легато).
  116. По умолчанию используетсястаккато,алегатонадо чем-то
  117. помечать в нотном тексте. Или наоборот.
  118. Или, как вариант,легатобудет использоваться, если не указан
  119. номер инструмента - будет использоваться предыдущий указанный
  120. номер.
  121.  
  122. В AY музыке инструменты состоят из "сэмпла" (список точных
  123. смещений тона, смещений громкости и масок тона-шума-огибающей на
  124. каждый фрейм времени) и "орнамента" (список смещений тона в
  125. полутонах на каждый фрейм времени).
  126. Если в "орнамент" добавить громкости, он будет выглядеть как
  127. трек в паттерне, с легато на всех нотах. Это первое
  128. использование рекурсии.
  129. Следующее использование - можно писать короткие музыкальные
  130. фразы (риффы) и использовать их как ноты.
  131. (Музыкальный модуль вызывает треки, треки вызывают риффы, риффы
  132. вызывают орнаменты - всё единым механизмом.
  133. Высота ноты уровнем выше задаёт транспозицию для используемого
  134. риффа.)
  135. Рифф содержит колонку"времени"для каждой ноты - сколько
  136. фреймов её играть. Можно указатьвремя=0,чтобы запустить две
  137. ноты одновременно: так можно, например, использовать рифф
  138. перкуссии одновременно с риффом фонового арпеджио.
  139. К сожалению, "сэмплы" уже играются другим механизмом, как
  140. звуковой эффект.
  141. Звуковые эффекты создаются нотами с флагом"стаккато"и
  142. удаляются, когда закончатся, или по ноте"R".
  143.  
  144. Utz>
  145. Я тоже думал над таким рекурсивным подходом. Звуковой движок
  146. PhaseSqueek
  147. https://github.com/utz82/ZX-Spectrum-1-Bit-Routines/tree/master/
  148. phasesqueek
  149. частично использует эту идею. Формат данных"fx table"там почти
  150. такой же, как формат данных"pattern".Правда, там не совсем
  151. рекурсия, потому что вfx tableесть команда"position jump",
  152. которой нет в паттернах, но вfx tableтот же элемент данных,
  153. что и там. Если они будут обрабатываться одинаковой логикой, то
  154. получится настоящая рекурсия. Ордер тоже можно сделать так же.
  155.  
  156. Вот примерMDMOD(старой версии) для движкаPhaseSqueek:
  157. https://github.com/utz82/MDAL/blob/master/examples/
  158. phasesqueek-demo.mdal
  159.  
  160. Это текстовый формат, как и вVTили1tracker,но он хранит
  161. только текущие изменения, перед которыми пишетсяCOMMAND=(кроме
  162. ордера, где команда по умолчанию). Там есть одна фича, которой в
  163. новом стандарте не будет, потому что мне её сложно поддерживать:
  164. вMDALv1тип блока определяется автоматически, например, из
  165. такого текста вMDMOD:
  166.  
  167. :SEQUENCE
  168.  intro
  169.  ...
  170. :intro
  171.  FX=arp
  172.  ...
  173. :arp
  174.  CMD=...
  175.  
  176. компиляторmdalможет определить, чтоintro- это паттерн, аarp
  177. - этоfx table.
  178. В новой версии форматаMDMODпользователь сам будет указывать
  179. тип блока и его уникальный номер. В новом формате ещё будут
  180. использоваться квадратные скобки для обрамления блоков.
  181.  
  182. :BLOCKTYPE:$01[:name] {
  183.  COMMAND=value, CMD2=othervalue...
  184. }
  185.  
  186. Ордер в новом стандарте тоже будет более многословный, но ради
  187. гибкости и типобезопасности можно потерпеть.
  188.  
  189. Делать форматMDMODпростым - не главная задача. Главное, чтобы
  190. его можно было редактировать вручную (но не в том смысле, чтобы
  191. печатать директивыdb) и при этом нормально обрабатывать
  192. трекером или другим GUI.
  193.  
  194. Что могу сразу сказать, новый стандартMDCONFуже будет
  195. полностью поддерживать вышеописанную рекурсивность.
  196. Имеется 4 базовых типа данных:command, ifield, iblockиigroup,
  197. гдеcommandопределяет один входной параметр (такой как "note",
  198. "volume", "name"...). Типifieldрасширяет типcommand,тип
  199. iblockсодержит плавающее число полейifield,а типigroup
  200. содержит элементы типаifield, iblockили опять-такиigroup.
  201. Им соответствуют выходные типы данных, которые могут
  202. соответствовать или не соответствовать входной рекурсивной
  203. структуре.
  204.  
  205. На самом деле входная структура в новом стандартеMDAL
  206. совершенно виртуальная, то есть не имеет отношения к выходной
  207. структуре. Это позволяет мудрить с входным форматом вплоть до
  208. поддержки совершенно разных видов ордера:
  209. - "таблица", как вBeep Tracker;
  210. - "список", как вBeepolaили в текущей версииbintracker;
  211. - "автоматический", то есть без ордера, как в1tracker.
  212. Причём независимо от звукового движка. С таким подходом
  213. низкоуровневую реализацию будет легко оптимизировать.
  214.  
  215. Что я пока не продумал - как избежать выделения ордера в
  216. отдельный тип данных, а вывести его из обычных типов(i/o)block.
  217. Теоретически это должно работать, ведь мы можем определить
  218. структуру ордера по тем же правилам, как и паттерны или любые
  219. списки. Проблема в том, что это не будет работать, если выходной
  220. формат использует список элементов (например, список сэмплов,
  221. используемых в модуле, чтобы адресовать их по табличке или ещё
  222. как). Для этого есть отдельный тип выходных данных(otype)под
  223. названиемolist.Мне кажется, если я включу osequence внутрь
  224. oblock,то смогу избавиться отolist.Также есть специальный
  225. двоичный тип выходных данных -obitfield.Может быть, и
  226. получится вывести все выходные типы данных изobitfield,но это
  227. пока в голове не вырисовывается.
  228.  
  229. Alone>
  230. А как ты отлаживаешь музыку в текстовом формате? Когда я писал
  231. трек для игры"Sewerage"на ассемблере, мне приходилось слушать
  232. его сначала после каждого изменения...
  233.  
  234. Utz>
  235. Так же получается и с текущейlibmdal(разве что можно поставить
  236. блочные комментарии, чтобы пропускать куски ордера и т.п.).
  237. Новая версияlibmdal,скорее всего, будет работать в реальном
  238. времени, так что любое изменение вMDMODможет автоматически
  239. обновлять выходную структуру (а она может выдавать бинарник и
  240. ассемблер для всевозможных случаев - играть паттерн/текущую
  241. позицию/сонг сначала и т.д.). Кроме того, новаяlibmdalдолжна
  242. включать своеобразный скриптовый язык, для взаимодействия и
  243. реконфигурации на лету. Пока это не прорабатывал, но поглядываю
  244. на языкScheme.
  245.  
  246. Alone>
  247. Я ещё раз подумал и придумал, как сделать рекурсивный формат без
  248. сэмплов :) Ну, кроме нескольких стандартных звуков в поле номера
  249. риффа (пример далее для AY).
  250. Это всё возможно потому, что конкретный орнамент обычно
  251. используется с одним конкретным инструментом.
  252. Иерархия такая:ордер->треки(можно несколько в одном канале,
  253. с независимыми громкостями) ->риффы->инструменты(орнаменты)
  254. ->сэмплы->стандартные звуки.Всё это будем называть риффами.
  255.  
  256. - нота с риффом"T"включает тон и устанавливает частоту тона
  257. (относительно частоты текущего риффа) - в текущем подканале
  258. - нота с риффом"t"включает тон и устанавливает частоту тона
  259. (абсолютную) - в текущем подканале
  260. - нота с риффом"N"включает шум и устанавливает частоту шума -
  261. в текущем подканале
  262. - нота с риффом"n"устанавливает глобальное смещение шума
  263. - нота с риффом"E","C","1"перезапускает огибающую указанного
  264. типа - в текущем подканале
  265. - нота с пользовательским риффом (мне понравилась твоя идея с
  266. именованными треками) создаёт и запускает подканал с заданным
  267. риффом (удаляется, когда заканчивается).
  268. - нота с громкостью выключает огибающую и устанавливает
  269. громкость (относительно громкости текущего риффа) в текущем
  270. подканале.
  271.  
  272. По умолчанию в текущем фрейме текущего подканала (связанного с
  273. текущим риффом) звук выключен, только громкость/огибающая
  274. остаётся с прошлого фрейма (в первом фрейме риффа - нулевая).
  275. Так мы можем накладыватьT+N+Eв любой комбинации, используя
  276. нулевую скорость.
  277.  
  278. Подканалы рендерятся плейером в один канал в соответствии с их
  279. громкостями (слышно самый громкий на данный момент).
  280.  
  281. Utz>
  282. С точки зрения формата данных самый важный выбор - использовать
  283. абстрактный базовый формат (соответствующий формату данных
  284. плейера, как в PC-шных трекерах) или же подход "прямо в памяти",
  285. как в большинстве нативных трекеров. Думаю, абстрактный для
  286. этого подойдёт больше, потому что он может решить тут многие
  287. проблемы. Так что надо исследовать этот вариант, если мы хотим
  288. нативный трекер. С другой стороны, с подходом "прямо в памяти"
  289. можно организовать очень интересные экспериментальные
  290. интерфейсы. Я к тому, что концепции трекера уже 30 лет, но за
  291. это время в трекерах появилось не так уж много новых идей. Было
  292. бы интересно порвать с традиционными концепциями и построить всё
  293. с новой точки зрения, без стереотипов. Как я понимаю,
  294. defMONнаC64до какой-то степени пошёл по этому пути, но пока
  295. точно оценить не могу. Стоит посмотреть.
  296.  
  297. Например, можно поспорить с идеей, чтоTNEдолжны бать привязаны
  298. к ноте. Почему бы их не разделить? Конечно, это несколько дико в
  299. контексте AY, потому что делители разные. Но все делители шума и
  300. огибающей приемлемы (а иногда и юзабельны) в качестве делителей
  301. тона, так что можно и дать пользователю шанс прострелить себе
  302. ногу. Полагаю,nqможет с этим развлечься :D
  303. Или можно поставить три колонки делителей - тон, огибающая, шум,
  304. а плейер будет брать те, которые ему надо. С абстрактным базовым
  305. форматом этот выбор можно сделать во время компиляции, плейер
  306. будет не очень перегружен. То же можно сказать про
  307. многоканальные риффы и зацикленные сэмплы. Абстрактный базовый
  308. формат с агрессивной оптимизацией в компиляторе может решить
  309. многие такие проблемы. Вопрос только, юзабельный ли будет
  310. результат - в смысле объёма скомпилированных данных. Здравый
  311. смысл подсказывает, что объём получится большой даже с сильными
  312. оптимизациями, но это надо исследовать и попробовать, прежде чем
  313. отбросить :)
  314.  
  315. Alone>
  316. Как описывать многоканальные риффы/сэмплы? Мы не можем иметь
  317. много стандартных звуков!
  318.  
  319. Utz>
  320. По идее лучше вообще без стандартных звуков. Их можно
  321. реализовать в виде "патчей" или "макросов", загружаемых с диска.
  322.  
  323. Многоканальные риффы в абстрактном базовом формате можно
  324. реализовать как "виртуальные" ордеры, которые разгребает
  325. компилятор.
  326.  
  327. Alone>
  328. А как зацикливать сэмплы (особенно без шанса на бесконечное
  329. размножение их, если забудем их заглушить)?
  330.  
  331. Utz>
  332. В общем-то, зацикленные сэмплы должны обрабатываться как циклы в
  333. ордере. ВMDAL v2было сделано две команды: команда типа
  334. "label",для указания именованных локаций внутри элемента
  335. (ордер/паттерн/сэмпл/что-то ещё) и команда типа"reference",
  336. которая ссылается наlabel(или другой элемент). Ордеры
  337. реализованы как обычные блоки, состоящие из таких команд ;)
  338.  
  339. Alone>
  340. А как отображать и редактировать такую древовидную структуру?
  341.  
  342. Utz>
  343. Главное, чтоMDAL(и в соответствии с нимbintracker) будет
  344. поддерживать такую структуру. Если он не сможет, то мне придётся
  345. повозиться, но сделать это. Чего мне пока не хватает - эмуляции
  346. AY вbintracker.Эмуляторы вbintrackerимеют специфические
  347. требования, а именно:1)они должны быть действительно
  348. свободными (то есть никакихGPL) и2)они должны поддерживать
  349. набор коллбэков в определённых точках, так что эмуляторы типа
  350. Game Music Emuне подходят. Пока я не прорабатывал программный
  351. интерфейс, так что это потом.
  352.  
  353. В любом случае,MDALстарается поддерживать подход "не напрягать
  354. пользователя деталями реализации". Пользовательский интерфейс
  355. может использовать обычную символику, не показывая внутреннюю
  356. рекурсивность.
  357.  
  358. В конце концов, ответ на этот вопрос опять сильно зависит от
  359. вида редактора. Если он кроссплатформенный, то я бы спрятал все
  360. детали, абстрагировал интерфейс от реализации, но сделал бы
  361. агрессивную оптимизацию в бэк-энде. Если же разговор про
  362. нативный редактор для ZX, то лучше наоборот показать так, как
  363. есть, чтобы пользователи могли оптимизировать модуль по размеру
  364. и т.п. и экспериментировать с рекурсивной структурой.
  365.  
  366. С практической точки зрения на PC нет проблем, потому что экран
  367. достаточно большой, чтобы показать дерево прямо в виде вложенных
  368. элементов. Для нативного трекера можно использовать трюк,
  369. который уже есть вbintracker'е:нажатиеEnterна поле, которое
  370. указывает на какой-то элемент, переходит к этому элементу. Можно
  371. ещё отдельно вывести список текущих экземпляров этого элемента,
  372. но это не обязательно - в частности, обращение к несуществующему
  373. экземпляру может создать новый, пустой, а неиспользуемые
  374. экземпляры могут быть выброшены оптимизатором.
  375.  
  376. Можно ещё подумать насчёт гибридного приложения, т.е. нативного
  377. трекера, использующего мощную периферию. Но здесь практическая
  378. проблема: на Западе такие устройства обычно базируются на
  379. ESXDOS,а на Востоке, как я понимаю, - наTR-DOS.ВESXDOSесть
  380. какая-то эмуляцияTR-DOS,но неполная. Например, я могу
  381. запуститьBeep Tracker,но не могуALASM.
  382.  
  383. Я выпустил предварительные спецификацииMDAL v2:
  384.  
  385. https://github.com/utz82/MDAL/wiki/
  386. MDCONF-Standard-Version-2-Specification-Draft
  387.  
  388. https://github.com/utz82/MDAL/wiki/
  389. MDMOD-Standard-Version-2-Specification-Draft
  390.  
  391. Полагаю, спецификацияMDMODуже достаточно проработана, аMDCONF
  392. будет ещё корректироваться.
  393.  
  394. ...
  395.  
  396. Свежие новости поlibmdal:дело идёт медленнее, чем
  397. планировалось. Явно недооценил сложность.
  398. Но библиотека уже умеет парсить текстMDMODво внутреннее
  399. представление модуля (в соответствии со спецификациейMDCONF) и
  400. выдавать правильный результат в форматеMDMODобратно. Далее
  401. надо будет сгенерировать ассемблерный текст. Пока не полностью
  402. вижу решение, но по идее нужен некий внутренний промежуточный
  403. формат, из которого можно быстро сгенерировать этот ассемблер и
  404. бинарник. Посмотрим, как получится.
  405.  
  406.  * * *
  407.  
  408. По результатам этой беседы я решил довести языкListhдо
  409. запускаемого состояния (нажмите кнопку"4"). Может быть, со
  410. временем что-то из него и вырастет :)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement