Honestly, I personally don't really know, never examined these in depth. From what I can see I can say that Squeeker uses a stack-based set of 16-bit counters instead of the usual register-based counters. This approach also has been used in B'TMAN, generally it allows to have more channels than the number of register pairs allows, keeping most of registers free for other uses. It seems that these engines still use PFM, although I'm not sure how the channels are mixed. Probably the pulse widths either added or OR'ed, but the widths itself are greater than in 'pin pulse' engines, with chances to nearly reach a wave period when many channels produce a 'pin' at once, this creates the distinctive distortions.

I thought it is worth to add a simple visual explaination why exactly PFM (Pin Pulse, Narrow PWM) engines has weak low frequencies, why pulse interleaving does not have this issue, and how PFM is used to imitate volume levels.


http://shiru.untergrund.net/temp1/square_high.png

Here is a graph of normal square wave of some duration. It has output high one half of the time and low the other half of the time. Let's count the 'cells' when the output is high, marked by orange. It is the output 'energy', or 'power', that is also percepted as 'volume'. 8 of 16 cells is 'active' here, this is max energy level possible for a wave.


http://shiru.untergrund.net/temp1/square_low.png

Now let's take a square wave of  lower frequency and the same duration, and count the 'acitve' cells again. It is the same number, 8 of 16 - despite the different frequency, square wave maintains the same energy level.


http://shiru.untergrund.net/temp1/pin_high.png

Now let's take a 'pin pulse' wave of the same frequency as in the first example. See, there is just 4 cells 'active' - just a half of the energy that a square wave of this frequency would have.


http://shiru.untergrund.net/temp1/pin_low.png

And now let's see a 'pin pulse' wave of lower frequency, the same as in the second example. Just 2 cells 'active' - less than the higher frequency pin pulse wave has, and way lesser than square wave would have.


These examples shows that a pulse wave with duty cycle less than 50% yields less energy in lower frequencies, and this difference grows up as the duty cycle gets lower. 'Pin pulse' engines has very low duty cycles, like 1%, so it is very noticeable.

How to overcome this? One solution is to play a few desynced pin pulse waves on lower frequencies. This will give 'phasing' effect, but also will add more energy to the low end. Another solution is to make pulse width dependent from the frequency, increasing the width for lower frequencies. It is somewhat difficult to implement in Z80 sound engines, but a rough version of this is seen in the Special FX/Fuzz Click engine, which has one channel louder than another - that's because it just has wider pulses, and it makes it more suitable to play bass notes.

Is the point of launching a contest shortly is to bring more members on the forum? Because at the moment there is clearly not enough people even for one category.

479

(10 replies, posted in Sinclair)

To begin with, it has been developed in ~1998 for Amiga, way before accuracy in emulators became important and even possible.

The main flaw of the format, though, is that it does not actually consider ZX Spectrum enviroment, i.e. there is no BASIC ROM in the emulated memory space by default, and most of beeper music players rely on having it in place. If you don't take it into account while ripping/converting music, it may easily get the drum sounds changed, or lost them althogether. Or, in worst case, all timings will be screwed up (Special FX/Fuzz Click engine has this issue), or code won't work at all (ROMBeep is an example). To make it work correctly, you need to include portions of the ROM into AY file, so you need to determine which portions actually used, which is not so easy, as to do this you need to understand how an engine works. Alternatively, to save your time, you can include whole ROM (in fact, if I remember correctly, it is not even possible, first two bytes will be missing anyway), and basically redistribute a copy of it with every AY file.

All this could easily be avoided would the format specs were explictly saying that memory space should have ROM pre-loaded (distrubuted with players, not with music).

There are other things that could be improved and cleaned up as well.

Another fun addition to the bundle, a 'drum' synth that generates 'loading noise' (ZX Spectrum kind). Inspired by the quite unforgettable psb's Tap Music.

481

(1 replies, posted in Sinclair)

Yes, the HW only allows to set it to 0 or 1, so all sound code rely on this. Toggling, if needed in a particular code, is always done in software.

482

(10 replies, posted in Sinclair)

One thing I should say about using .ay files for collection purposes: it don't really suits for beeper music. I believe a new better format should be developed, at very least the old standard should be updated, before making a new music collection. Including copies (complete or partial) of the ROM into each file is really a major format design flaw. It also wouldn't hurt to add support for expanded memory and all extra sound devices ports (Covox, SD, etc), to store custom digital music and things like that.

483

(10 replies, posted in Sinclair)

Does not seem much different, the same number of actions:

- Load .bbsong into Beepola
- Export WAV
- Encode into MP3
- Upload MP3

- Load .bbsong into Beepola
- Export .bin
- Convert .bin with a tool into .ay
- Upload AY

Also, with simplistic approach these AY files wouldn't be suitable for publishing, as each one would have to contain copy of ZX48 ROM, so they would only be useful as intermediate container for MP3 conversion.

Another update. phasesynth's Detune range changed from +/- whole tone to 0..octave (with fractional numbers), this allows not just to detune it slightly, but to certain number of semitones, giving more flexibility. noisedrums added, these are simple noise-based drums with some PWM.

485

(7 replies, posted in Sinclair)

I thought why not to actually put the idea I explained above to the test, so here is proof-of-concept. I wouldn't say it sounds better, but it gives somewhat different timbres.

486

(7 replies, posted in Sinclair)

Interesting, so it is in fact one of the particular cases of what Phaser engine could do (duty control when phase reset is enabled).

More tricks the better, as they tend to sound different.

487

(7 replies, posted in Sinclair)

Haven't look into the code, but an idea for volume control I had and never tried to implement is an evolution of what has been used in Tritone: mix channels by interleaving them, but change amount of time each channel takes. Time the code in a way that it does few outputs of each channel per one loop (or maybe few copies of the loop), and force some of these outputs to zero to attenuate the channel. I.e. we have channels A and B:

ABABAB full volume
ABAB0B mid A volume
AB0B0B low A volume

and so on.

Judging by the carrier tone that is heard in the test50.sna, is it something similar to the idea?

The bundle is updated. Minor fixes, two synths optimized, two new synths added - one Earthshaker-like (I love that sound), another with customizeable 1-bit waveform. Download link is the same.

Here is a demo track written by theandroidvision. It only uses few plugins of the bundle, and does not have any extra instruments or processing: https://soundcloud.com/theandroidvision … o-vst-demo

It will be 32-bit floating point music right off the bat, even with a single plugin, because that's how VST standard works. Yes, this is certainly not a purist thing, it is more of the 'fakebit' kind.

Fresh stuff just in time for the new forum opening.

This is a bundle of VST plugins aimed for different kinds of 1-bit sound synthesis and processing. It includes six plugins, two of them for processing, two drum synths, and two tone generators, covering majority of the 1-bit sound types. Comes with source code.

http://shiru.untergrund.net/files/1bitstudio.zip

492

(7 replies, posted in Other Platforms)

To my knowledge, no, there is no access time limitations for sound registers. It is a common 'feature' (or rather an issue) of FM synth chips, but I can't remember any PSG type chip that would have this limitation.

493

(7 replies, posted in Other Platforms)

GB having Z80 is actually a common misconception. In fact it is Sharp's custom CPU that is a 8080 derivative (like Z80) and has a small fraction of Z80 extra features, but that's it. Porting Z80 code to GB CPU is about as complex as porting Z80 code to 8080 - difficult, ineffective, but has been done before.

The worst thing about GB CPU regarding 1-bit music is that is has just as many registers as 8080, i.e. it completely missing Z80's alternative register set and index registers - this will have impact on possible number of channels. Worse than that, it also missing 8080's EX DE,HL opcode that is very useful in beeper engines, and there is a major HW bug with all 16-bit increment/decrement opcodes that leads to sprite display corruption.

Still, it is certainly possible to do something, especially for CGB that has about twice more CPU horsepower, but in general the platform is not very suitable for this kind of things, so it won't perform as well as Z80-powered systems.