151

(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.

152

(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.

153

(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.

154

(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.

157

(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.

158

(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).

159

(16 replies, posted in Sinclair)

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

160

(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?

161

(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).

162

(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.

163

(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).

164

(16 replies, posted in Sinclair)

A small behind the scenes post about this release.

165

(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

167

(37 replies, posted in Other Platforms)

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

168

(5 replies, posted in Sinclair)

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

169

(164 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.

170

(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.

171

(130 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

172

(130 replies, posted in Sinclair)

Just seen the results in the stream. 1st and 2nd are mine, Freezing Point and Geostorm. 3rd is Tufty's March Of The BioMech. Congrats, Tufty!

Should say I was expecting the utz's drum'n'halt to get the 1st, it was so fresh. Wish I would make something like this. And I was expecting to get 3rd with one on mine's, as Tufty's stuff is great and strong as usual - it sounds very powerful and not so beeper'y at a good volume.

Regardless of the results, great job as usual, guys! Beeper is the real winner again!

I was thinking to get it working on the 2600, too, using a trick to get a reasonably well tuned notes, but left it out for possible future updates, otherwise it could stay in the unreleased limbo for even longer.

Released the whole source code for PeskyTone, the music player with VIC-20, C64, and NES support. I also have a half-working Plus/4 support, but there is another mysterious issue that I couldn't figure out yet, so it is omitted for now.

I think it is just fine, it has everything that is needed and the schematics can contain just a battery, chip, and piezo speaker. It has just a half of the ATtiny10 power, but for much lower price. The only problem is that 150 has OTP memory, i.e. it is can be programmed only once. There is 154 that features Flash memory instead, the price is tad higher.

I'm still trying to figure out the actual LFSR implementation to get proper pitches.