From what I remember of my experiments back in the day, there is no noticable benefit to distributing the 1s like this, except for many consecutive 1s - eg. 11101110 is sometimes a bit cleaner than 11111100. I'd say it's not worth spending extra CPU cylces on, though.

Part 10 is actually a bit outdated, in part 12 you will find a better synthesis method that can also be adapted to PCM playback. In a sense, the same caveat about consecutive 1s applies to that, though, e.g. having two 3-bit outputs will be cleaner than having one 4-bit output, but having one 4-bit output saves 24 cycles...

In any case there are some interesting effects that can be observed in this regard. This is because the expansion of a speaker diaphragm isn't linear, so at volumes >50% it will react differently than <50%. So far nobody has been able to really make use of that, though.

252

(13 replies, posted in Other Platforms)

Shiru wrote:

There is another mode where you can also output an arbitrary bit stream, getting an IRQ every time when shift register gets empty, thus getting some buffered playback. This mode is not emulated, unfortunately.

Damnit! So that's why that didn't work when I tried it. I guess MAME doesn't emulate that either, does it?
Also, do you have any more in-depth documentation about the PET? I'm mostly working with petmem.txt, pet-io-2.txt, The PET User Port Cookbook, and the Raeto West book. Somehow I don't find any of them particularly satisfying.

pet-io-2.txt mentions

Also (on my machine), when generating sound one must first set the shift
register in "free running" mode, and then load it with a value to shift.
The other way around does not seem to work.

Is that true? I have one player prototype that sets the Shift register to $ff and just toggles bit 4 in ACR, and that seems to work fine on my friend's 8032.

Fun story, I once owned a half-working 8096... for a couple of hours. It was given to me at a demoparty. Since I had no means of transporting it, I had to give it away. It's now in the computer museum in Katowice.

253

(13 replies, posted in Other Platforms)

@Shiru: Oh wow, that whole bit about Mr. Murray totally escaped my attention. Yeah, deffo uncool, but on the other hand it clearly says more about them than you guys.

Btw what's your approach for going below 245 Hz limit? Right now I'm toggling CB2 in direct mode via a Timer 1 interrupt, but I'm thinking there's got to be a better way. Also, the Raeto C West book mentions using the Timer 2 high-byte in conjunction with the Shift Register, but this doesn't appear to work. Am I missing something here?

@Tufty: Mr. Murray = The 8-bit Guy

254

(13 replies, posted in Other Platforms)

Pretty damn impressive. I think PET audio can be pushed further still, but this is quite an achievement.
Fun story, I was actually working on a multi-channel PET routine right when this got released. Grrrrr!

Aha! Then there's a good chance TI-Connect is actually corrupting the ht2.8xp file. Could you try installing it with TiLP instead?

Do you mean this error message in Doors occurs directly after installing HT2, even before running the tracker?

Just to clarify: Mark has been in touch with me about this for a while, but so far I'm pretty clueless as to what's going on here. I cannot reproduce the issue on my 83+, in any case. So I'd definitely appreciate some help.

Some additional pieces of information (please correct me if I got anything wrong, Mark):

- Tested it on 2 different TIs, so we can most likely rule out faulty Flash memory or other hardware issues.
- Ran full memory reset before installing, so we can rule out relocation failure because of VARS table size.
- The issue occurs with both the normal and the "small" version, so we can rule out problems with relocation.
- We have not been able to establish a specific pattern behind the crashes. They seem to occur at random times.
- There is at least one more recent report from a different person having issues with HT2 crashing on 83+: https://old.reddit.com/r/TI_Calculators … n_tracker2

Well. TI is 6 MHz, vs Spectrum's 3.5 MHz. So it's not possible to port this engine as such. On the other hand, the rra/out/rra/out... trick I'm using in many newer ZX engines is not possible on TI (because bits must be set in a specific way when writing to the "beeper" port - so before each OUT there must be an AND+OR). So Spectrum can do some funky tricks that TI can't.

Also welcome aboard @tuesockor, great to have you around and thanks again for the awesome video!

258

(5 replies, posted in General Discussion)

All of them, except PhaserX, are available in 1tracker. None of the new engines are really popular, people are simply too lazy to learn new tools.
If you want to pick one, I'd say go with Phaser3. There are at least a handful of tracks made with it.
https://battleofthebits.org/arena/Entry … act/20528/
https://battleofthebits.org/arena/Entry … ter/27065/
https://events.retroscene.org/dhl2020/beeper/2253
https://youtu.be/mQ3yPffJXM4
and several more by Tufty. I thought I also made a track with it, but can't find it now.

259

(5 replies, posted in General Discussion)

I think good candidates would be Phaser3, Squat, Pytha, SqueekerPlus, PhaserX, and probably SquatE (have not tried it, but sounds very promising). zbmod engine if you're *really* bored big_smile

mp3 seems incorrect, the notes of the lead melody should be continuous.

260

(5 replies, posted in General Discussion)

I think nobody ever used it. So the only example is the official demo track.
It's honestly not that good. I'd do things differently nowadays.

Ha, looks like you've got quite the collection of beeper engines on the VZ now.
I do listen to beeper in the car but I really wish it was as warm and sunny over here like in the first vid, haha.

262

(2 replies, posted in Sinclair)

Great stuff. Damn, really need to up my game if I want to beat you at DiHalt Lite big_smile

263

(130 replies, posted in Sinclair)

Next up: DiHalt Lite 2021! 7th-9th of January, so Jan 6th is the deadline I guess.
I assume BotB Winter Chip will have Beeper as well, so better start stashing up some tunes, hehe.

264

(164 replies, posted in Sinclair)

song_editor.h:979

if(key>=SDLK_KP_0&&key<=SDLK_KP_9)

That looks like a bug to me, because SDLK_KP_0 = 0x40000062 and SDLK_KP_9 = 0x40000061.

265

(164 replies, posted in Sinclair)

Looked into getting v0.3 running on my machine today.

First, a couple of changes to the makefile:

-I./libs/angelscript/angelscript_jit -> -I./libs/angelscript_jit
1tracker: libs/angelscript_jit/virtual_asm_x86.o -> 1tracker: libs/angelscript_jit/virtual_asm_x64.o
virtual_asm_x86.o: libs/angelscript_jit/virtual_asm_x86.cpp -> virtual_asm_x64.o: libs/angelscript_jit/virtual_asm_x64.cpp

I'm also building with clang instead of gcc. Anyway, building fails with a number of errors.

./gui.h:447:7: error: no matching function for call to 'draw_menu_item'
                x = draw_menu_item(x, (editStyle != EDIT_STYLE_CHOPPED)?"~F1~-Chop":"~F1~+Chop");
                    ^~~~~~~~~~~~~~
./gui.h:409:5: note: candidate function not viable: no known conversion from 'const char [10]' to 'char *' for 2nd argument
int draw_menu_item(int x, char *str)
    ^
./gui.h:449:7: error: no matching function for call to 'draw_menu_item'
                x = draw_menu_item(x, !quietMode ? "~F2~-Quiet" : "~F2~+Quiet");
                    ^~~~~~~~~~~~~~
./gui.h:409:5: note: candidate function not viable: no known conversion from 'const char [11]' to 'char *' for 2nd argument
int draw_menu_item(int x, char *str)
    ^

Easy fix, change gui.h:409 to

int draw_menu_item(int x, const char *str)
./select_engine.h:34:9: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
        if (dp = opendir(engineDirectory))
            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
./select_engine.h:34:9: note: place parentheses around the assignment to silence this warning
        if (dp = opendir(engineDirectory))
               ^
            (                            )
./select_engine.h:34:9: note: use '==' to turn this assignment into an equality comparison
        if (dp = opendir(engineDirectory))
               ^
               ==
./select_engine.h:120:11: error: use of undeclared identifier '_fileno'; did you mean 'fileno'?
                                fstat(_fileno(file), &fileStat);
                                      ^~~~~~~
                                      fileno

Ok, change select_engine.h:34 to

if ((dp = opendir(engineDirectory)))

and :120 to

fstat(fileno(file), &fileStat);

Not sure about the latter one. Anyway, now 1tracker builds (with a number of warnings, mostly from angelscript, nothing too serious as far as I can tell.

So I proceed to fire up 1tracker and start a new SquatE song. On entering the first note, this happens:

Z80Ass error: label already defined!
 281: .loop
[1]    6479 segmentation fault  ./1tracker

Whoops! Same thing happens on the old Squat, but not on wtbeep, for example.

266

(1 replies, posted in Sinclair)

Holy cow, that's fantastic news. Congrats Hikaru on pulling this off. Can't imagine how much of a hassle it must've been to work out the timings.
Now what we really need is the source code and documentation of the song format...

267

(8 replies, posted in Sinclair)

Haha, as usual. Giant scary looking math formula boils down to rather trivial real world solution big_smile
Ok, so this looks indeed like something that can be done on Spectrum. I'll look into this once I have some free time (end of the year, hopefully). Unless you want to try, of course! It'd be great to see a new engine from you!

268

(8 replies, posted in Sinclair)

Zilog wrote:

Do you know LPC fundamentals and this marvelous document? https://cnx.org/contents/swFM2W46@5.12: … troduction

Fantastic, just what I need! I briefly looked at LPC before, but was like "meh, too much maths". But in recent months I've been working on my math skills so I might be able to tackle this now.

Shiru wrote:

RLE

For if we'd want to go full PCM instead of PWM (3-bit should be possible and give quite decent speech quality), I recently read that dictionary based audio compression apparently works well for low res audio, and was used quite a bit in old Amiga demos. So, chop up the audio into blocks of, say, 8 samples, create a dictionary of those, (optionally) massage dictionary a bit to eliminate similar samples, replace audio stream with pointers to dictionary. Simple enough to decode imo.

Regarding microsamples, there is one issue with fixing the length to 256 samples. You essentially end up with 3 different use cases:
- vowels: arbitrary length, must be looped
- k, t, p etc: one-shot samples with fixed length
- s, th, kh: noise, arbitrary length.
The main thing here is the noise ones: If you use a 256 b looped sample for it, you cannot control pitch, because it won't sound like noise for anything but the lowest stepping speed.
So to me it seems like the best approach is to detect the "type" of sound beforehand, and just synthesize the noisy ones, and perhaps the plosives as well. That's how I ended up with "hey, if we can synthesize the vowels as well, then we don't actually need samples".

269

(8 replies, posted in Sinclair)

Been actually thinking about making an engine with a dedicated vocal/speech synth track for quite some time now. 256-byte wavetables is indeed well-suited for this. What I'd really want to do though is formant synthesis. Haven't been able to pull it off yet, though.

270

(5 replies, posted in Sinclair)

Oh, I like the sound of that. Will be a few days before I get around to trying it out, but I'm already drooling over the description, hehe. Percussion is still a problem area in beeper imo, so great to see advances in that field.

Ha, love the snail in the background. Is that your garden? Lovely song too, can't even decide if I like the original or the 1-bit version better.

Ha, neat. Good timing, too: Recently a new developer started contributing. He fixed the play icon (didn't even remember there was one lol) and, to my utter amazement, managed to squeeze some more bytes from the compressed font.

Ok, 2 wild guesses:

1. You are in Hold mode (can be toggled with [CLEAR])
2. Your speed is set to 0 for some reason. Do you have all columns filled in the sequence?

You need to qualifiy the path where tilp2 is installed, then. You can use the Tab key to auto-expand names. So, if your tilp installation is in C:\My Programs\tilp\, you do something like

My<Tab>\ti<Tab>\tilp ti84+ ...<Enter>

I think you have the very old version of TiLP from http://lpg.ticalc.org/prj_tilp/. (Unfortunately they haven't updated the site in like, a decade.)
Might be better to get a more recent one from https://github.com/debrouxl/tilp_and_gfm/releases. first uninstall the old version and the Gtk runtime. Second, you will probably need to install the required version 2.24 of Gtk manually. You can get the installer here. After installing the new TiLP, you may or may not need to run Zadig again, as described in https://github.com/debrouxl/tilp_and_gf … DME.win32.

Huh, no menu at all. Something's definitely borked here. Which version of TiLP are you using, and which version of the GTK2 runtime is installed?

Also, could you try this in a command prompt:

tilp ti84+ DirectLink path\to\DoorsCS7.8xk