So, a decade later I finally got another TI calculator, the USB-equipped TI-84+ this time, and it works. So I was able to see the HT2 running on the hardware for first time (not to hear yet, the 2.5 jack is a tricky one there).

On the installation instructions. TiLP gave me a lot of headache and did not work at all in the end, lots of issues on each step, with GTK+, with drivers etc, so I was not able to connect to the calc. The Ti-Connect worked out of box just fine, though, it was just a drag and drop.

152

(21 replies, posted in Sinclair)

I'll give them a test tomorrow. If it works, I think I'll add them to the 1tracker engine as a selectable option (like the Octode XL), so the user could choose whether he needs the classic one, +3 compatibility, or unbalanced volume.

153

(21 replies, posted in Sinclair)

Got some ideas for Phaser continuation, too, although nothing too special. Hooking up the new sampled drums code from the Ear Shaver EX is the obvious one.

154

(21 replies, posted in Sinclair)

As I was playing with it in the recent years, I came to conclusion that wtbeep is one of the finest engines available at the moment, at least in regards to the sound diversity combined with the ease of use. The two downsides are is that it is not compatible with +3 (not a big deal), and the carrier hiss that is a bit too audible at times.

So I thinking about possibilities to improve the latter issue. A couple ideas:

- Maybe do 3 sound loops, one is single channel, another is two channel, and the last one is the current three channel one. Tracker can adjust the pitch and set appropriate core per row. This will add a bit clarity, although maybe the hiss will get more noticeable, because it will be turning on and off all the time.

- Maybe make unorthogonal channels. Two with selectable waveforms, and one either a simple square tone (good enough for bass), or variable duty cycle tone. Should probably speed up the sound loop a little bit and make hiss less audible.

Another neat feature to have would be an unequal volume balance, maybe switchable on a per row basis, or two loud channels and one a bit quieter - would be good for echoing stuff. Not too sure if it can be done with the current design, though.

155

(6 replies, posted in Sinclair)

I don't think I can catch up the utz's latest mindblowing developments, but the way I think I can still contribute to development of the 1-bit music scene is to streamline the old ideas. So I was playing around with the Ear Shaver engine that I made a few years back. It never got enough love, and I was unsure on what it can provide beyond its EarthShaker roots. Lately I was making various sketches with it, and felt it actually hides a ton of potential, it just takes time to master. So I got ideas on how to improve it here and there, then the sample drums improvement idea come to the mind, and here is the outcome.

I'm kinda hyped up with the result, so I'd call it something like Earth Shaker Ultra or Ultimate, or Uberengine, but in its core it is still the same code and framework as in the original Ear Shaver. So let's it be EX, as it is still well suited to shave your ears (capable of many bizzare sounds), and we should save Uber for later, as I believe there is lot more to be achieved.

So, what's so special here? We have 4 engines in 7 flavors all in one, with capability to switch between these every row. Not that we weren't trying to do it before, but prior developments were difficult to match to the tracker concept to utilize their potential. This one managed to have very streamlined controls, basically nothing but the drum section changed from the original Ear Shaver - just two note channels with detune and waveform columns.

The engines are:

1: EarthShaker-alike, works exactly as in the Ear Shaver, with W column
   used to control the phase precisely (helps to separate repeating notes
   and to get specific sound harmonics);

2: Tritone-alike, with two channels of uneven volume. The W column controls
   duty cycle here. T2 channel is louder than T1 channel;

3: The same as 2, but with equal volumes on both channels;

4: The same as 2, but T1 plays quiet periodic noise instead of tone, the
   color of the noise depends on the note played. T1 plays loud tone;

5: The same as 4, but noise played on T2 instead, making it louder than
   tone that is played on the T1 channel;

6: Phaser1-alike. It is a single channel mode, both channels providing
   frequencies for each of the oscillators. The W column controls phase,
   allowing to get the whole spectrum of Phaser1 sounds;

7: Squeeker-alike. Provides two channels with the Squeeker-specific timbre,
   both channels allow to use the W column to control duty cycle.


The drums got support for 4 volume levels, 9 pseudo pitch levels (not a real pitch shift), and 9 sample offsets. So you can create pretty diverse percussion soundscape using just a few samples.

The engine is very fresh, I just got the parts together, and hurry to share it with the world. So probably some issues are there (drum timing compensation perhaps?). Will be testing it more extensively sometime later.

For now here is the script and a rough test.

156

(135 replies, posted in Sinclair)

Got an idea for the next gen engines that I hope to demonstrate soon in a pretty rad new (-ish) engine I'm giving finishing touches to at the moment.

We've got the sampled drums in many engines already, sometimes even non-interrupting ones. Even with the interrupting ones, why not get it one step further and allow to manipulate the sample sound on the fly, through a set of parameters like we do for our synthesized drums?

I tested three ideas and got pretty cool results in a separate test:

- The least impressive one is just a sample offset. Start each drum for specified sample offset instead of 0. A good old technique that comes from MOD trackers (I used it often in the past to imitate opening/closing filter on the reso bass).

- Volume. It is possible to get 4 levels of volume within a 120-t sample loop (~30 kHz samples). This is achieved by out'ing a value 4 times per each bit, and self-modifying nop/xor a between the outs. Much like the tone channel volume balance in Tritone and some other engines.

- Pitch. It may be tricky to implement it in a way that would not affect the drum duration in an unpredictable way (to compensate the tempo properly). And here comes a fun find. I was thinking of the modern slice-based methods of the pitch adjustment that does not affect the pitch (like YouTube's 0.5x..1.5x etc), and thought it technically could boil down to just not playing some of bits within a byte. And it actually works! At least it gives an illusion of the reduced pitch on some samples, and I assume it'll give at least some sound character changes in other cases.

157

(5 replies, posted in Sinclair)

No, I kinda forgot about that one. I do have a real hardware now (although it is Evo, not the original ZX), so maybe I'll give it another go - to make sure how it really sounds without the resampling/aliasing in emulators.

158

(5 replies, posted in Sinclair)

Was messing around with this engine recently, and has found a really good use for the W in the ES mode indeed. I hooked it up to the phase control. When the W column is empty, the phase is free running, so it sounds just like it was (full backwards compatibility). The values of 1..8 now set a specific phase for the channel at start of a note, and not only it helps to separate sequences of the same notes, which previously were sounding like one continuous note (this was a problem I was intending to solve), but also gives a fine control over the timbre of an interval that is varies pretty well.

The updated version is attached, will be included into the future releases.

I don't have an authentic Speccy, it does not make much sense to make recordings of the Speccy versions on my end - it would be a basic recording from an emulator. I do have a ZX Evo, but it is not too far from an emulator.

As for making the ZX engine available. Well, it is a kinda tricky thing. The music authoring system is based on 1tracker, and I released the corresponding plug-in and 6502 code. However, it sounds not exactly the same as the actual PET player, or the player from ZX Faulty Robots album. To make ZX port of the album, I did a converter that takes the data in the original 6502 format (a pattern based module), plays it virtually (with a C version of the player), and records down the resulting pitch/waveform stream, putting all the pattern parsing calculations offline. I guess I just need to turn this converter into another 1tracker plugin, so the resulting sound would be most authentic, and the music data would not require any processing before putting it into a ZX program. In short, it isn't directly available yet, but I'll think on how to make it properly.

Making of Faulty Robots article is finally available in English.

161

(2 replies, posted in Sinclair)

Yes, it has a custom engine. Nothing fancy there, it basically replicates the 6522 capabilities - the only channel that plays a looped bit pattern, just to make the music match the PET counterpart closely. The ZX port of the game is bundled with a music demo Faulty Robots, a port of the PET one, with all 8 tracks. It just happens to be a commercial game, so I thought it pointless to announce the bundled music demo separately, when the PET original one is freely available.

162

(135 replies, posted in Sinclair)

I forgot if we're used it somewhere, but a phasing effect with a couple of 16-bit adders:

add hl,bc
add ix,de
ld a,h
xor ixh
cp 128
sbc a,a

Actually I was experimenting with the Phaser idea applied to a 4-bit DAC (i.e. AY) with a quirk: instead of toggling the sole bit on and off with the overflow of each of the generators, why not XOR a couple of possible 4-bit values. Like, in the regular operation mode both XOR the output with 15, and we're getting the regular Phaser sound. However, if one of generators XORs a lesser value, the phasing effect kinda gets reduced. So we can control the amount of the effect in the channel, which gives it another dimension. The test is attached (press any key).

163

(16 replies, posted in Sinclair)

Thanks, I'll consider to use it in the future projects.

164

(16 replies, posted in Sinclair)

That's nice, 150 bytes here and there would make an extra K. How long does it take to decompress?

165

(16 replies, posted in Sinclair)

Well, Freezing Point data is certainly not 94K large. You're packing the source text file for some reason.

The binary data is 16714 bytes large, 2768 bytes after packing with the apultra. You can try ZX5 on this data (attached).

166

(16 replies, posted in Sinclair)

Yes, that was Shrinkler, a few versions in fact. No, haven't tried ZX0, because there is a large test table for all Z80 packers, and ZX0 shows worse results for all test datasets there than apultra.

167

(16 replies, posted in Sinclair)

I used apultra to pack everything, including players. Players and music data were packed separately, so players get reused. I also tested some even better packers, but they would take like half a minute to decompress in the worst case, which is unacceptable.

Even with the best packing, I needed a large buffer for the largest unpacked song, it was nearly 19K. At this point it couldn't fit at all.

I had to:

- Place my code as low as #5b00, disabling the BASIC interrupt handler completely
- Overwrite the screen drawing code with the song buffer
- Decrease the two largest songs

In order to decrease the largest songs size, which happened to be Freezing Point and Geostorm, I first made a function that optimizes out the empty rows by reducing the speed of a row before (recursively, as long as row speeds allows). This optimization can be applied to any song in 1tracker now. This helped a bit, but still wasn't enough. So I also had to modify wtbeep and SquatM formats.

In the wtbeep, I now omit the 0 byte for rows without a drum (it is now triggered by the bit 6 of the control word). Saves a bit of room.

In the SquatM, I reworked the way how the dividers stored. Instead of the normal LSB/MSB order that is easy to read with POP I stored them in the MSB/LSB order, and used bit 7 of the MSB as the note rest flag. The LSB is omited for note rests. This of course made the song data parser very suboptimal, but the Sqeeker-like design does not suffer from row transition noise much, and I gained the remaining bits of the RAM.

The largest songs remained the same, but I saved a couple K this way. Freezing point is 16714 now, and Geostorm is 15809 (2768 and 2500 packed).

168

(16 replies, posted in Sinclair)

A small behind the scenes post about this release.

169

(16 replies, posted in Sinclair)

Thanks, guys!

Interestingly, both Geostorm and High Orbit started as NES tracks, they were half finished sketches (half length of the finished versions) written for a game that never happened, lying around since 2017 I think. I thought they won't translate into 1-bit well, because the NES of course used volumes, duty cycle, slow attacks, samples, and so on. But it turned out to be the case when moving a song sketch that is just stalled in one format into another format made it shine.

Nothing special, just thought to share. Got all my Spectrum 1-bit stuff that has been made since 2016 and released as a compilation, in audio format and as a ZX Spectrum 48K program. No new songs here, everything has been released previously, it just got packed into a nice package.

Bandcamp
ZX Spectrum program
Youtube

171

(37 replies, posted in Other Platforms)

Sure, you can upload it. WTFPL/CC0 it is.

172

(5 replies, posted in Sinclair)

The engine support has been added to 1tracker. Time to push the boundaries a bit further!

173

(166 replies, posted in Sinclair)

v0.32 is out, with many improvements. Relatively major changes in the front-end code here and there. wtbeep and Squat family support got updates. Most importantly, Velvet engine has been added.

174

(37 replies, posted in Other Platforms)

Sorry, I don't use Github, so unless some uploaded it there, it isn't there. And I doubt anyone did that.

175

(135 replies, posted in Sinclair)

The full results are up, here are the beeper ones:

ZX Spectrum Beeper Music

1.   7.51   Freezing Point by Shiru
2.   7.11   Geostorm by Shiru
3.   7.03   March Of The BioMech by Tufty ^ 1bit Forum
4.   5.97   drum'n'halt by utz ^ irrlicht project
5.   5.76   Rekcart by AER
6.   5.61   babka_dance by AER