News - Support for extended ATM2 screens has appeared in the Unreal Speccy Portable emulator, Utz/irrlicht project is organizing a graphics competition, Utz also wrote about his programming language for music.

News
 by Alone Coder

We have disruptions at work, fun at home, and I also drowned in
renovation, so I didn’t get to a single party, but this issue of the newspaper
stayed late. I think the next one will be delayed too, because things are going on
are far from over yet. But this year, after that I don’t know anymore
how many, managed to get out to the quarry several times, even with
Louis and the kids - alternately. On foot. With a stroller. 

I saw Alexey Bugrov (who helped me with the computer on
Font Editor's presentation in1996). Now he has his own company
to develop a piece of hardware, we met about this. Looks like
very tired. I showed him the demos, he was interested
multicolors and border KOT :).

I called T(c)S. He still lives in the same place where we hung out in
2000-2002, and works in his own cell phone repair company
telephones. Very busy. I wanted to lure him to our plant in
as a microcontroller programmer, but could not convince. B
It is very difficult to find such specialists in Ryazan.

CyberDaemon periodically writes and sends news from the game 
world (for example, that STEP are making a new game in the universe
Star Heritage, but not for Speccy...). 

Arwald still teaches 2D animation classes at the film studio, but I 
I was never able to catch him.

Wanderer wrote (22 years later!) a new game - CELL 3326: 
https://zxwanderer.github.io/cellЗЗ26/ This is a quest on a new engine
Laser Squad type. Although I'm not a player, I completed it completely and
I corrected a couple of translations. I tried Wanderer too
lure, but I'm a bad head hunter :)

Hippiman released Dizzy and the Mystical Letter on 
universal DizzyAGE-like engine, which he wrote in
NedoLang language. At the moment the game exists in Russian,
English and Portuguese. Is it really Spectrum games?
aboutDizzy hasn't been released for so long? How old we are... Now
Hippiman is putting the finishing touches on the engine and is about to release 
him separately. Levels are edited directly in the DizzyAGE editor.
Now everyone can make their own seriesDizzy :)

Karbo disappeared again, so his track was not included in the game. How much 
I know he’s in the village now, and there’s a lot to do there in the summer.

John Silver writes scores for orchestra and 
disappears on business trips. The last time I left was for a whole month.

But one composer fromScotland wrote that he decided to master Pro
Tracker 3, promised to share the results when it works :) 

DimkaM wrote instructions on how to work with extended memory in 
IAR compiler (click button"2" ). While there are no such opportunities
not in NedoLang (Hippiman hosted Dizzy in his engine
procedures and data from memory manually). Maybe in time
Can you come up with something cooler? :)

The Unreal Speccy Portable emulator now supports
expanded ATM2 screens ( Fyrex wanted to read ACNews with ease
and achieved it :)). But the memory so far only works in the upper
window, and it seems that ports#7ffd and #fff7 are set to one and
same register.

Utz/irrlicht project organizes a graphics competition for64 colors 
dot (as in Eye Ache 2) at the International Symposium on Bits and
Beverages. 
Pictures must be drawn in the StellarPaint tool:
http://irrlichtproject.de/stellarpaint/
Or just makePNG picture64x48 with this palette:
http://
irrlichtproject.de/stellarpaint/stellarmode_gimp_tools.zip
And send to the address1bitforum@posteo.net beforeSeptember 18, 2018
year. No more than two works per author, no conversions or
restrictions on free distribution!

Utz also wrote about his programming language for
music (the conversation began thanks to the language projectListh,
published in the last issue):

Utz> 
Now I'm remaking MDAL(https://utz82.github.io/MDAL/). 
It’s not entirely clear on the site now, but in general there are 3 things:
- MDMOD- abstract universal markup language; 
- MDCONF- a data transfer standard based on XML, which 
describes how to get from the universal MDMODat the input 
assembly language specific to a given audio device
result;
- libmdal- library that implements MDMOD and MDCONF for 
use (infuture) as a back-end for PCs
trackers.
There is also bintracker(https://utz82.github.io/bintracker/) - 
actually, a test implementation.

Recently I wrote a draft specification for the new version
MDCONF(since the first version turned out to be too limited 
according to possibilities).
Now I am rewriting the libmdal implementationaccording to this 
new specification (from scratch, so I can write code
better, thanks to everything I've learned over the last year).

Alone> 
I had an idea about a recursive musical language (and
tracker interface), with which you can implement earlier
unattainable musical tricks.

Let's say we have AY music, consisting of patterns, and those consist
from tracks for each channel. Each track can contain many
instruments (sound effects) thatplay simultaneously and
Only the loudest one at the moment can be heard. Note in track with
tool numberN can mean one of two things:
-restart sound effect N in this channel (staccato);
-changes the tone frequency in sound effect N in this channel
(legato).
The default isstaccato, and legato needs something
mark in the musical text. Or vice versa.
Or alternativelylegato will be used if not specified
tool number - the previous one specified will be used
number.

In AY music, instruments consist of a "sample" (a list of exact
tone offsets, volume offsets and tone-noise-envelope masks on
each time frame) and "ornament" (a list of pitch offsets in
semitones per time frame).
If you add volume to the "ornament", it will look like
track in a pattern, with legato on all notes. This is the first
using recursion.
The next use is to write short musical
phrases (riffs) and use them as notes.
(Music module calls tracks, tracks call riffs, riffs
cause ornaments - all by a single mechanism.
Note pitch levelabove specifies the transposition for the used
riff.)
The riff contains a column of"time" for each note - how much
frames to play it. You can specifytime=0 to run two
notes simultaneously: this way, for example, you can use a riff
percussion simultaneously with the background arpeggio riff.
Unfortunately, the "samples" are already played by another mechanism, like
sound effect.
Sound effects are created by notes with flag"staccato" and
are deleted when they run out, or by note"R".

Utz> 
I was also thinking about this recursive approach. Sound engine
PhaseSqueek 
https://github.com/utz82/ZX-Spectrum-1-Bit-Routines/tree/master/
phasesqueek
partially uses this idea. Data format"fx table"there is almost 
same as the data format"pattern".True, there is not quite 
recursion, becausefx tablethere is a command"position jump",
which is not in the patterns, but infx tablethe same data element, 
as there. If they are processed by the same logic, then
you get real recursion. An order can also be made in the same way.

Here is an example of MDMOD(old version) for the PhaseSqueek engine: 
https://github.com/utz82/MDAL/blob/master/examples/
phasesqueek-demo.mdal

This is a text format, like VTor 1tracker, but it stores 
only current changes, preceded byCOMMAND=(except 
orders, where the default command). There is one feature, which
there will not be a new standard, because it is difficult for me to support:
in MDALv1the block type is determined automatically, for example, from 
such text in MDMOD:

:SEQUENCE
 intro
 ...
:intro
 FX=arp
 ...
:arp
 CMD=...

компилятор mdalможет определить, чтоintro- это паттерн, аarp
- этоfx table.
В новой версии формата MDMODпользователь сам будет указывать 
тип блока и его уникальный номер. В новом формате ещё будут
использоваться квадратные скобки для обрамления блоков.

:BLOCKTYPE:$01[:name] {
       COMMAND=value, CMD2=othervalue...
}
The order in the new standard will also be more verbose, but for the sake of
Flexibility and type safety can be tolerated.

Making the MDMODformat simple is not the main goal. The main thing is that 
it could be edited manually (but not in the sense that
print directivesdb) and still process normally 
tracker or other GUI.

What can I say right away, the new standard MDCONFwill already be 
fully support the above recursiveness.
There are 4 basic data types:command, ifield, iblockandigroup,
wherecommanddefines a single input parameter (such as "note", 
"volume", "name"...). Typeifieldextends typecommand,type 
iblockcontains a floating number of fieldsifield,a typeigroup 
contains elements of typeifield, iblockor againigroup.
They correspond to output data types that can
match or not match the input recursive
structure.

In fact, the input structure in the new MDAL standard
completely virtual, that is, not related to the weekend
structure. This allows you to be clever with the input format up to
supports completely different types of orders:
- "table", as in Beep Tracker;
- "list", as in Beepolaor in the current version of bintracker; 
- "automatic", that is, without a warrant,as in 1tracker.
And regardless of the sound engine. With this approach
low-level implementation will be easy to optimize.

What I haven’t thought through yet is how to avoid highlighting an order in
a separate data type, and derive it from ordinary types(i/o)block.
Theoretically, this should work, because we can determine
order structure according to the same rules as patterns or any
lists. The problem is that this won't work if it's a holiday
format uses a list of elements (for example, a list of samples,
used in the module to address them on a plate or else
how). For this, there is a separate type of output data(otype)under 
nameolist.It seems to me that if I include osequence inside 
oblock,then I can get rid ofolist.There is also a special one
binary output data type -obitfield.Maybe 
it will be possible to derive all output data types fromobitfield,but this 
until it emerges in your head.

Alone> 
How do you debug music in text format? When I wrote
track for the game "Sewerage" in assembler, I had to listen to
it first after every change...

Utz> 
The same thing happens with the current libmdal(unless you can put 
block comments to skip parts of the order, etc.).
The new version of libmdalmost likely will work in real 
time, so that any change in MDMODcan automatically 
update the output structure (and it can produce a binary and
assembler for all kinds of cases - playpattern/current
position/song first, etc.). In addition, the new libmdalshould 
include a kind of scripting language for interaction and
on-the-fly reconfiguration. I haven’t worked this out yet, but I’m taking a look
per languageScheme.

Alone> 
I thought again and figured out how to make a recursive format without
samples :) Well, except for a few standard sounds in the number field
riff (example below for AY).
This is all possible because a specific ornament is usually
used with one specific instrument.
The hierarchy is as follows:order -> tracks (several can be in one channel,
with independent volumes) ->riffs -> instruments (ornaments)
->samples -> standard sounds. We'll call all this riffs.

- note with riff"T" turns on the tone and sets the frequency of the tone
(relative to the frequency of the current riff) - in the current subchannel
- a note with a riff"t" includes the tone andsets the tone frequency
(absolute) - in the current subchannel
- a note with a riff"N" turns on the noise and sets the frequency of the noise -
in the current subchannel
- note with riff"n" sets the global noise offset
- note with riff"E","C","1" restarts the envelope of the specified
type - in the current subchannel
- note with custom riff (I liked your idea with
named tracks) creates and launches a subchannel with a given
riff (removed when finished).
- a note with volume turns off the envelope and sets
volume (relative to the volume of the current riff) in the current
subchannel.

By default, in the current frame of the current subchannel (associated with
current riff) sound off, volume/envelope only
remains from the last frame (in the first frame of the riff - zero).
So we can applyT+N+E in any combination using
zero speed.

Subchannels are rendered by the player into one channel in accordance with their
volumes (the loudest at the moment can be heard).

Utz> 
From a data format point of view, the most important choice is to use
abstract base format (corresponding to the data format
player, as in PC trackers) or the “directly in memory” approach
as in most native trackers. I think abstract for
this is more suitable, because it can solve many problems here
problems. So we need to explore this option if we want
native tracker. On the other hand, with the "directly in memory" approach
you can organize very interesting experimental ones
interfaces. What I mean is that the tracker concept is already 30 years old, but for
this time, not many new ideas appeared in trackers. It was
it would be interesting to break with traditional concepts and build everything
from a new point of view, without stereotypes. As I understand it
defMONonC64to some extent I followed this path, but for now 
I can’t accurately estimate. Costslook.

For example, one can argue with the idea thatTNEshould be tied 
to the note. Why not separate them? Of course, this is somewhat wild in
AY context, because the divisors are different. But all noise dividers and
envelopes are acceptable (and sometimes usable) as dividers
tones, so you can give the user a chance to shoot himself
leg. I guess nqcan have fun with this :D 
Or you can put three columns of dividers - tone, envelope, noise,
and the player will take the ones it needs. With abstract base
this choice can be made during compilation, player
will not be very overloaded. The same can be said about
multi-channel riffs and looped samples. Abstract basic
format with aggressive optimization inthe compiler can solve
there are many such problems. The only question is whether it will be usable
result - in terms of the volume of compiled data. Hello
the meaning suggests that the volume will be large even with strong ones
optimizations, but this needs to be researched and tried before
discard :)

Alone> 
How to describe multi-channel riffs/samples? We can't have
Lots of standard sounds!

Utz> 
In theory, it’s better to have no standard sounds at all. You can
implemented in the form of "patches" or "macros" loaded from disk.

Multi-channel riffs in an abstract basic format can
implement as "virtual" orders, which are raked
compiler.

Alone> 
How to loop samples (especially without the chance of infinite
their reproduction if we forget to drown them out)?

Utz> 
Basically, looped samplesshould be treated as loops in
order. In MDAL v2two commands were made: a command like 
"label",to indicate named locations within the element
(order/pattern/sample/whatever) and a command like"reference",
which refers tolabel(or other element). Orders 
implemented as regular blocks consisting of such commands ;)

Alone> 
How to display and edit such a tree structure?

Utz> 
The main thing is that MDAL(and according to it bintracker ) will 
support such a structure. If he can't, then I'll have to
tinker, but do it. What I'm still missing is emulation
AY in bintracker.Emulators in bintracker have specific 
requirements, namely:1)they must really be 
free (that is, noGPL) and2)they must support 
a set of callbacks at certain points, so emulators like
Game Music Emudo not fit. Until I worked on the software 
interface, so that comes later.

In any case, MDALtries to maintain a "don't bother" approach 
user implementation details". User interface
can use regular symbology without showing internal
recursiveness.

In the end, the answer to this question again depends heavily on
editor view. If it is cross-platform, then I would hide everything
details, abstracted the interface from the implementation, but would
aggressive optimization in the back-end. If we are talking about
native editor for ZX, then it’s better to show it the way it is
is so that users can optimize the module for size
etc. and experiment with recursive structure.

From a practical point of view, there are no problems on a PC, because the screen
large enough to show the tree directly as nested
elements. For a native tracker, you can use the trick
which is already in bintracker:clickingEnteron the field that 
points to some element, goes to this element. You can
also separately display a list of current instances of this element
but this is not necessary - in particular, referring to a non-existent
an instance can be created new, empty, and unused
instances may be discarded by the optimizer.

You can also think about a hybrid application, i.e. native
a tracker that uses powerful peripherals. But here it is practical
problem: in the West such devices are usually based on
ESXDOS,and in the East, as I understand it, on TR-DOS. ESXDOS has 
some kind of TR-DOS emulation,but incomplete. For example, I can 
launch Beep Trackerbut I can’t ALASM. 

I have released preliminary MDAL v2 specifications:

https://github.com/utz82/MDAL/wiki/
MDCONF-Standard-Version-2-Specification-Draft

https://github.com/utz82/MDAL/wiki/
MDMOD-Standard-Version-2-Specification-Draft

I believe that the MDMOD specificationhas already been sufficiently developed, and MDCONF 
will still be adjusted.

...

Latest news on libmdal:things are going slower than 
planned. Clearly underestimated the complexity.
But the library already knows how to parse MDMOD textinternal 
module representation (according to the MDCONF specification) and 
produce the correct result in MDMOD formatback. Next 
it will be necessary to generate assembly text. Not completely yet
I see a solution, but in theory we need some kind of internal intermediate
format from which this assembler can be quickly generated and
binary. Let's see how it turns out.

                             * * *

As a result of this conversation, I decided to bring the Listh language to
triggered state (click the button"4" ). Maybe with
something will grow out of it over time :)

Share your thoughts about the article