(51 replies, posted in Sinclair)

'ere we go: https://github.com/utz82/bintracker/releases/latest
Just a bunch of bugfixes for now. I might do another bugfix release shortly but I'm afraid I won't get around to implementing any major new features before the end of the year, unfortunately.


(51 replies, posted in Sinclair)

Oh, I sure like the sound of that... seems you're indeed having fun with that engine! <3
I've discovered a few new bugs while testing yesterday. I'm gonna have those fixed asap (hopefully tomorrow) and then I'll upload a new Windows build, ok?


(51 replies, posted in Sinclair)

Ok guys, per popular demand™ I've swapped Ctrl+V/Ctrl+P in trunk wink
gtap, are you on Linux or do you need a Windows build with this change?


(51 replies, posted in Sinclair)

Well, originally I had Ctrl-V doing a "paste and overwrite", and the current Ctrl-V "insert" behaviour was on Ctrl-Ins. However, it appears that some newer laptop keyboards don't have an Ins key anymore (whoever came up with that bs?), so those users would have to press some akward combo involving the Fn key. Anyway, that's how the current situation came about.

I have to say that to me, the current behaviour seems more logical. If you press Ctrl-V in a text editor, the stuff after the cursor will be shifted. So that's what "paste" means to me. And of course in a music editing context, the term comes from tape reel editing. And in that context, paste means inserting a piece of tape, as opposed to "paste over". So in my opinion, having Ctrl-V paste over is wrong. However, I just checked the docs of various trackers and it seems the majority indeed does a paste-over on Ctrl-V. Guess that's what you get when 99% of tracker authors are non-native English speakers... So I suppose I should indeed adapt *sigh* wink


(51 replies, posted in Sinclair)

Cheers gtap, glad you enjoy the ride so far wink

gotoandplay wrote:

Thx also for the examples, as I wasn't sure how to use the fxtables until I looked at those.

Yeah, unfortunately the fxtables are not very convenient/user friendly at the moment. My plan is to improve the situation with the next MDAL standard. The idea is that there'll be seperate tables for notes, dutys, etc. on the front end, and libmdal will generate the actual data tables from those input tables. Still got quite some work left on that, though.

gotoandplay wrote:

suggestions so far would be

-a way to know which current block is being played back.

This is on the to-do list, not just for the current block but even for the current row. However, it's not so easy to implement. For "normal" chip editors it's fairly easy because you can determine the current playback position simply by counting the vblank interrupts that have occured. However, for 1-bit this isn't possible because in most engines, there are no interrupts.

gotoandplay wrote:

-shortcut to play a block from a selected frame rather than the very start of a block.

Good one, haven't thought of that before.

gotoandplay wrote:

-i miss ctrl-v being ctrl-v ;( but ctrl-p is just as good i guess tongue

Do you think ctrl-v and ctrl-p should be swapped? I thought that having ctrl-v insert and shift the stuff after the cursor would be more intuitive. But I'm open to suggestions here, in any case.

gotoandplay wrote:

-a way to select, copy and paste note modifiers on their own (independent of the notes)

This would be quite difficult to implement as such, because internally, modifiers don't exist as a seperate entity. However, I see your point and I'll try to find a solution/workaround. Need to dig into the code for the modifiers anyway because there's this problem that heoretically you should be able to enter modifiers without an associated note value, but it doesn't work yikes

Ha, totally forgot to reply to this. I've actually experienced this kind of road before, think it was in Norway. Imo the result is not that impressive... but yeah, I guess it's mostly about the spaces between the gaps, so it's a kind of pulse frequency modulation wink So indeed, some 1-bit trickery could work.

In it's most basic form, this technique is actually getting quite common nowadays on highways, to alert drivers when they are going over the side line.

Not sure I understand the question, but have you filled all 4 positions on the current row of the sequence? If you have gaps in the sequence, like this:

00 01 -- --
02 -- -- --

there will be random notes and effects.


(77 replies, posted in Sinclair)

More progress on this. Seperated the code that generates the attack transient, so it's now possible to use arbitrary source material. Attached example uses 50:50 square. 2 channels @ 7812.5 Hz. Some parasite noise remains, I'm afraid it'll be difficult to reduce it further.


(77 replies, posted in Sinclair)

Yes, that's the idea - except it's not a sample, it's generated in realtime!

Anyway, getting closer to a two-channel implementation. Still need to get rid of some 20 t's of overhead, though.
Ultimately it'd be great to come up with a more efficient way of implementing this, because even just some simple additonal modifications of the delay line can go a long way with this algorithm. Also, using a non-random source (for example a square wave) can produce some great result as well, but again takes too much time with my current implementation.

Edit: Probably the way to go forward is to render at a lower rate. Did some tests with rendering at 7812.5 Hz, it sounds not too bad (and will give more flexibility I hope) - see test2.tap.

Awesome! I think I'll be needing one of those as well...
What's the tune from 0:30 onwards, don't recall hearing that before?


(77 replies, posted in Sinclair)

After seeing this, I was curious if this type of physical modelling could be made to work on beeper.
Well... I guess it can. Voilà, a real-time synthesized string instrument on beeper big_smile
This is only a single channel implementation, but there are 79 cycles wasted, so hopefully 2 channels of this will be doable. Another problem is that right now this works only with 8-bit dividers. It would theoretically be possible to go up to 9 or 10 bits, but this would cost a lot of cycles.


(51 replies, posted in Sinclair)

Thanks! No need to run it on your other machines actually, it was just to rule out that there's an OpenGL-related problem at hand with this issue.


(51 replies, posted in Sinclair)

garvalf wrote:

I have also an other bug, even from the beginning, sometimes the screen is mixed up when I start bintracker:


when I pass the mouse over a mixed up icon, it displays just below the menu, it's just shifted. It happens at random.

Need your help again wink Could you run

glxinfo | grep OpenGL

on the machine that has this problem, and post the output?


(51 replies, posted in Sinclair)

I think the "don't save" option is pretty bad, so I definately want to solve it for MDAL2 wink Should be doable considering the whole thing is gonna be rewritten from scratch anyway.

Regarding "labelled" blocks, I have to see about it. I like your idea, but on the other hand I want to avoid "special" cases as much as possible, to keep the parser fast and light-weight. So from a technical point of view, it would be better to do this:

   NAME="my super catchy intro"

where NAME is a block constant, that is a command that can only be set once per block, and doesn't count towards the block length. Theoretically those exist even in the current MDAL standard, but aren't handled by libmdal. Which is another blocking issue towards adding support for various engines...


(51 replies, posted in Sinclair)

garvalf wrote:

The manual also says "Any patterns not used in the sequence will not be saved in your module file, and will be lost when you exit Bintracker or load another track.".

I find this very dangerous! Deflemask is doing the same and I've already lost some patterns because of this. Is there a reason you can't keep it in the mdal file? It wouldn't cost much space in the source file. I would find this more secure. Yet, when I've loaded my mdal file, all my cloned patterns, which are not used in the sequence, were still present in the file.

I realize now that this is a much more significant problem than I thought. The problem is this: When you save a song in bintracker, it will iterate over the existing blocks (patterns/tables/etc) and save all of them to the file, whether they are used or not. However, when you load that file back into bintracker, MDAL does the parsing, and MDAL determines the block type from the usage context, which means for blocks that aren't referenced either in the sequence or by a command, the block type cannot be determined. So consequently those non-referenced blocks will be ignored, and will be lost the next time you save your song.

This is something that needs to be addressed in the upcoming new MDAL version 2 standard, but I haven't found a good solution to the problem yet. Actually in MDAL2 things will be worse, since there will be a new abstraction layer between user input and data output. Eg. right now, an input block is directly converted into an output block, but in MDAL2 this will be different. There will be abstract "input blocks" which are then converted into "output blocks" in multiple ways. Take for example PhaseSqueek: Right now, writing FxTables is very inconvenient, because the entire set of commands is affected. With the new abstraction layer, you will be able to write seperate tables for each channel or maybe even each command, and MDAL will take care of merging them into the actual FxTable blocks. tl;dr, we'll see a lot more different blocktypes in MDAL2.

So, as I said, I'm still looking for a solution for this problem, and I'd very much appreciate some input on this issue. Right now I'm leaning towards
requiring MDAL block names to be prefixed with the input blocktype name, eg. instead of ":pattern1", you'd write something like "PATTERNS:pattern1". Probably even go further and ditch pattern names (can you imagine writing a sequence for ZX-16 using pattern names?), so the new syntax would be something like "PATTERNS:01". (Actual pattern names would be implemented as a command, in this case.) However, this could get rather messy and unintuitive for users, considering that there might be a large number of input block types, and implementations will vary quite a bit depending on the engine. Eg. in ZX-16, there should be one single input blocktype (called eg. PATTERNS, containing one NOTE command and one SLIDE command), which can be used for each of the 16 channels. In engines with channels that have different capabilities (think Phaser1 for example), there could be different input blocktypes for each channel. So then we'd have "PATTERNS_CH1:xx", "PATTERNS_CH2:xx", and so forth - not exactly user-friendly imo. On the other hand, it'd be easier to avoid namespace clashes that way, which is actually a thing in MDAL1: It's perfectly legal to give the same name to a pattern and an non-pattern block, and theoretically the parser should magically figure out which is which, which doesn't happen of course.

Another solution would be to generate a list of unused blocks for each blocktype when saving a module. However, as mentioned before, I believe named patterns should probably go, because there are several problems with them.


(51 replies, posted in Sinclair)

Your changes don't seem to break anything, so I've pulled them in. Thanks! smile The main difference is that .swap() is faster, but I don't think it'll be that significant.

Regarding the makefile, stdlib=libc++ is a clang-specifc flag (linking against clang's stdlib rather than the GCC one). Things should work with g++ if you remove the flag from both LDFLAGS and CXXFLAGS. That said, I build with code::blocks myself, so the makefile probably doesn't get the love it deserves. Sorry about that... ultimately I should probably start using autotools or CMake to sniff the environment. It might become necessary anyway when I re-implement WAV export, which will require pulling in another library (most likely SRC/libsamplerate).


(51 replies, posted in Sinclair)

Version 0.1.1 is ready, btw. Mostly bugfixes in this one. Also the aforementioned alternate method of selecting items from dropdown lists, and a feature to randomize a selection of a pattern/table (mostly useless I guess, but I needed an RNG in the tracker so why not use it for this as well).

Contacted Lyndon Sharp about this, and he's confirmed that he wrote that engine (and he most likely did the music conversion as well), based on WHAM. According to him, Codemasters wanted to avoid using WHAM because of license issues, so he sent them this one. It was only used once, as Codemasters still thought it too similar. So eventually Lyndon transformed it into what we now know as the LSengine'89.

Now waaaaait a minute. I see (hear) your point regarding the drums (and yes, it's a Codemasters title) - but there's no way this is LSengine, because the tones sound totally different. The characteristic whistle of the squares makes me almost certain that it's WHAM. So could it be that somebody hacked in the drums from LSengine into WHAM? Only one way to find out... Archive.org has a .z80, so let's take a look. Hmm, it's not the exact code from WHAM, but there are some pretty striking similarities... Exiting stuff, and well spotted introspec big_smile


(51 replies, posted in Sinclair)

If I had to set up a new system, I'd actually be tempted to give one of the *BSDs a try. It's getting increasingly difficult to keep Linux pulseaudio-free, and I don't trust this systemd stuff either...

Btw selecting from dropdown lists is now possible with arrow keys and enter wink

Hi Catmeows,

2) is indeed just monophonic arps.
3) is almost certainly Mark Alexander's driver (WHAM! The Music Box).
1) seems to be monophonic arps as well, but with a dedicated, pretty sophisticated driver. Not sure about this one, maybe others know more.


(51 replies, posted in Sinclair)

Ok, that's good to hear. So, seems I just gotta fix one more bug reported by Tufty before the 0.1.1 release.
Would be interesting to know why it fails on your other machine, though. I mean you can enter numbers in the actual pattern data, right? The pattern name editing thingy uses another keyhandler, but based on the same principle, so I'm really puzzled about what's going on here.

Great find, Tufty! I'm too stupid to play the game but... Walk like an Egyptionnnnnnn! big_smile


(51 replies, posted in Sinclair)

That's most likely a bug in liballegro, iirc they already acknowledged it on their bugtracker. I'll see though if I can do something to mitigate it.
Regarding the pattern renaming bug (should also affect the AUTHOR and TITLE commands on the General tab), I'm a bit at a loss right now. Well, we'll figure it out eventually... I might build the next release package without fixing it, though, if I can't find a fix tomorrow.


(51 replies, posted in Sinclair)

It should be "audioBuffer", with a camelcase wink