276

(20 replies, posted in Sinclair)

Good writeup, introspec. I'll add that in addition to the pin pulse method, the Squeeker method also allows for some deviations in timing, and both of these methods still work (albeit with noticable degration of sound quality and of course frequency range) at fairly low update rates, as demonstrated by nanobeep.

That's odd, that File send option should be there even if the calc is not recognized.
Can you post a screenshot, perhaps?

The 1-Bit Instrument

Check out this excellent new article on 1-bit music, by Protodome. I'd say so far this is the best and most comprehensive one of a small but growing list of academic papers on 1-bit music.

And because theory is dry, we also have https://protodome.bandcamp.com/album/4000ad smile

279

(164 replies, posted in Sinclair)

A little feature request. Would it be possible to break long data lines in the asm output (such as the ones produced by wav import)? Some assemblers choke on these, including sjasmplus.

280

(135 replies, posted in Sinclair)

So as I was just about to fall asleep last night, it occurred to me that it's possible to implement a low-pass filter with variable cut-off, without using multiplication.

Assuming an engine that supports multiple volume levels per channel, the idea is as follows:

current_volume = 0
max_volume_delta = x

loop {
  new_volume = n  // use whatever standard method here
  if abs(current_volume - new_volume) > max_volume_delta {
    if new_volume > current_volume {
      new_volume = current_volume + max_volume_delta
    } else {
      new_volume = current_volume - max_volume_delta
    }
  }
  ... // output sound 
}

This could potentially be used to add filter envelope emulation to existing synthesis algorithms such as Phaser. The question though is how to efficiently implement that big fat nested conditional.

It's fairly easy for a saw wave generator, because we can assume that when (abs(current_volume - new_volume) > max_volume_delta) is true, then (new_volume < current_volume) is also true for a real-world implementation (in other words, max_volume_delta is never exceeded on the rising edge of the saw). So that's what the attached example demonstrates.

281

(12 replies, posted in General Discussion)

Just realized it cannot be 1tracker. The track is from 2016, but Tritone was only added to 1tracker in 2018.

Perhaps best to ask the author directly: https://demozoo.org/sceners/63068/

282

(12 replies, posted in General Discussion)

Old version of 1tracker maybe?

283

(35 replies, posted in Other Platforms)

Good read, thanks!

Qchan is pin pulse so in theory it should work. However, it may be too quiet to be properly audible, or maybe the pulses will be too short to actually switch the piezo. Could also be that the volume envelopes don't quite work as intended because some piezos have a pretty strong overshoot. Nevertheless, it's worth a try methinks. Same goes for the Octode family (except Octode PWM and Octode2k16, those are pulse interleaving), Stocker, Huby, and BuzzKick.

In-game beeper music is largely uncharted territory, because it's nearly impossible to pull off. This is because the process of generating 1-bit sound must be cycle-exact, and therefore pretty much all existing beeper engines block the CPU. As the old saying goes: "When beeper plays, scroller must stop".

It's not all hopeless, though. If the game in question doesn't require a lot of computation-heavy logic or screen updates, then it's possible to run the necessary game code on note updates ("between the rows"). Interrupt-based engines like SpecialFX and Savage are well suited for this. It's also been demonstrated with Tritone. In fact there's a version of Tritone in z88dk which facilitates this.

Engines using the pulse interleaving technique (Savage, Tritone, many others) most likely will not work on piezos. Pulse interleaving relies on inertia of the speaker cone, which is practically absent on piezos. So only engines using OR mixing (Squeeker, Squeeker Plus, PhaseSqueek, Squat) and maybe pin pulse engines will work.

That said, VZ also has tape out, right? I'd focus on using that for sound instead of the piezo.

Ha, the VZ gang is growing big_smile Your SDL port of VZEM might come in very handy wink
Anyway welcome, great to have you aboard.

288

(5 replies, posted in Sinclair)

Yay, congratulations on this achievement! And welcome to the rabbit hole of 1-bit engine making big_smile

Ehh, I wish I had Shiru's advice back in the day when I started to make my own engines. Could never wrap my head around it back in the day. Just like I couldn't figure out 16-bit dividers, lol. Speaking of which, I'd say try to figure those out next. Aside from having a greater note range, it actually makes things simpler wink

Of course, if you have any questions, ask away. More than happy to help.

1tracker definitely has the widest selection of beeper engines, including many modern ones.

I don't recommend Bintracker. It's buggy, and those bugs won't be fixed either. I'm working on a completely new version of it (see https://bintracker.org), but it's not ready yet.

1tracker can be a bit intimidating at first, but once you get used to its somewhat unusual workflow, you'll find that it's a very efficient and well thought-out tool. It doesn't use a sequence/order list, so you don't ever edit your sequence manually. Instead, you have one endless pattern that you can break into sections by hitting Space. You can navigate between sections with the Home and End keys. You'll be copy/pasting a lot so remember those keys as well: Shift + arrow keys or Home/End marks a selection, then Ctrl+C/X/V to copy/cut/paste WITHOUT shifting the following content, or Shift+X/V to cut/paste and shift the following content. Other important keys: Ctrl-+/- or Numpad +/- to increase/decrease the speed, Numpad *// to increase/decrease the base octave (or Shift+number to select octave), Ctrl+U/D/O/K to transpose selection up/down by a semitone/by an octave. On engines that have instruments, +/- cycles through instruments on the instrument screen (F4). Ctrl+F10 quits. F5 is play/stop, hold Enter to play from current row.

Hi Jumperror, welcome to the forum. Wow, you're doing a lot of cool stuff! Glad to have you aboard. Looking forward to hearing more 1-bit (and other) tracks from you. I'm curious what you could come up with on some of the newer beeper engines. If you have any questions feel free to ask anytime.

291

(2 replies, posted in Calculators & Pocket Computers)

That would be [ALPHA], [MODE].

292

(21 replies, posted in Sinclair)

Great little tune. A pity that CAFe didn't have a dedicated beeper compo though. Hmm maybe next year...

293

(135 replies, posted in Sinclair)

So if I understand correctly, the following code would be equivalent:

  add ix,bc
  ld a,ixh
  add a,l
  ld a,ixy
  adc a,h
  sbc a,a
  and #10
  out (#fe),a

294

(135 replies, posted in Sinclair)

Aye, it took a while for ye olde brain. I was fixated on the "volume control" part, but it's really all about the harmonics, right?

In that case, a word of caution: Emulators are often misleading in that respect, actual hardware can sound quite different. Generally 48k tends to be more noisy, and harmonics tend to be buried under the noise. Anyway, if you're going to explore further in this direction, I can help with some hw recordings.

The question remains where these harmonics come from in the first place. Is it because at these marginal pulse width threshold overflow errors from the frequency calculation become more significant?

When I worked on those multi-core engines with many volume levels, I also noticed another effect. If there are several consecutive frames with high total volume (mimicing a DC offset), some sort of volume ramping will occur, gradually turning rectangular waves into saws. Octode2k16 is perhaps the best example of this. I tried to control this effect but it was very unreliable. Still wonder though if it can be used somehow.

295

(135 replies, posted in Sinclair)

Hmmm, isn't this rather a (very fine-grained) duty sweep? Check what happens when you replace inc hl with inc h... I think for phase-shift controlled volume you'd need 2 outputs.

However, there are indeed some interesting harmonics going on here. No idea where they come from, but they do remind me of that time when I unsuccessfully tried to make a 15ch pwm engine: https://bitrotlabel.bandcamp.com/track/pad5
I really wonder where these harmonics come from.

Hi Dave,

In general you should be able to get away with LD ($6800),A. The thing is that, because of some hardware quirks, on the Spectrum we try to align all writes to port $FE to a multiple of 8 t-states for cleaner sound. Chances are you don't have such a requirement on your machine, so you can get away with shifting the timings a bit.

There is another problem here though. The engines that use this type of "output-and-rotate" approach heavily rely on the fact that the Speccy only looks at bit 4 for the output* and ignores the other bits. So writing the value of A directly to ($6800) probably won't work. You'd need to check bit 4 of A each time and set the output accordingly, or perhaps you could look into changing the sample format so it better suits your needs. I think if you changed the sample values as follows:

$88 -> $11
$cc -> $99
$ee -> $77
$ff -> $ff

things might work out.

* that's a bit over-simplified. Bit 3 also has an impact but often that fact is simply ignored.

297

(5 replies, posted in Sinclair)

Finally got around to finishing the engine based on Kurt James Werner's Velvet Noise technique, specifically Crushed Additive Random Noise. To my knowledge this is the first PFM (pin-pulse) ZX beeper engine that mixes tones and noise. In addition to the noise channel, there are 3 tone channels, all with volume envelopes. Added the synth kick from my new set of reusable click drums for good measure.

source

298

(6 replies, posted in Sinclair)

Thanks mate smile Good idea about the track listing. Gotta find my yt password first, though yikes

299

(4 replies, posted in Sinclair)

Yes, of course this will be in Bintracker eventually.

Yeah, I'm having too much fun with writing z80 asm again. Got two more engines almost ready, and I've got several ideas for more. But I definately need to focus on Bintracker. All those new engines will be pretty much useless without tracker support.

300

(4 replies, posted in Sinclair)

May I present to you the latest abomination from Utz Beeper Engine Constructions. Archie is sort of the spiritual successor to Pytha (hence the name), but then again it isn't, really.

From the readme:

Archie is an experimental 1-bit sound engine for the ZX Spectrum Beeper. It
draws inspiration from other modern beeper engines such as Pytha, povver, and
Tritone Digi.

Archie uses the pulse interleaving technique to create 5 tone channels with
asynchronous volume. The first 4 channels are intended to be used in pairs with
controllable phase offset. This simple setup is useful for producing a range of
different, sometimes surprising effects. The 5th channel is a regular pulse wave
channel with duty cycle control and duty cycle sweep.

Channels 1a and 2a are playing at roughly 1/3rd of the volume of channel 1 and
2, respectively. The 5th channel plays at about 2/3rds of the volume of channel
1/2.

In addition to the tone channels, Archie features an interrupting click drum
channel with 3-bit volume control. Click drums are arbitrary PWM samples played
at 31250 Hz. The core synthesis runs at 15625 Hz (standard 224 cycle loop).

source

There's no XM converter, for obvious reasons. Short demo track is attached below. Couldn't be bothered to to make it any longer because composing for this thing in asm is a major p.i.t.a.