576

(19 replies, posted in Sinclair)

Cheers guys! All that digi stuff aside, my favourite engine from this year is probably Squeeker Plus. I do hope the other engines will get some love, too, though wink

577

(1 replies, posted in Sinclair)

Ah, Jangler delivers as usual. Also nice to hear gotoandplay fiddeling with Phaser2 again. Hope to hear another full-length track made with it for the coming Winter Chip.

578

(3 replies, posted in Sinclair)

Aye, sounds intriguing indeed, garvalf! Can we haz teasor nao?

Also yay for 15 minute Space Beeps!

Well, y'all pretty much know what I'm up to - trying to find new 1-bit tricks of course big_smile Also been spending a lot of time on that MDAL thing the past weeks. In December, I'll be taking a break from 1-bit as usual, so you won't be seeing me around these parts so often. Will see what I can finish up till then. Perhaps I'm gonna work a bit more on HT2, and maybe make one more Speccy engine.

579

(43 replies, posted in Atari)

Thanks! "The Wild Walker" is pretty cool.

580

(19 replies, posted in Sinclair)

povver is an experimental 3-channel beeper engine for the ZX Spectrum. It 
features a simple volume control mechanism which is achieved through dual 
oscillators running with a phase offset. The results are perhaps not as
impressive as what can be achieved through digital multi-core synthesis, but
it consumes much less RAM.

Aside from volume control, povver also features

- simple volume envelopes
- noise mode for channel 1
- customizable click drums
- per step tempo control
- compact music data format

Source is on my github as usual.

Wrote this thing mainly to finally use the phase offset volume trick in an actual engine. I feel I still haven't quite mastered it, but this is as good as it gets for now. Aside from that, I'm also testing a new, more flexible click drum system here. The click kick has a variable starting pitch, and the noise has variable volume (and two pitch setting to chose from, though they don't sound that different after all).

I'll need to add some stuff in MDAL in order to support this engine (which I probably won't get around to this year anymore), so for the time being it's pretty much for study purposes only.

581

(135 replies, posted in Sinclair)

Cheers mate! This experiment eventually became the Phase Squeek engine. Have a look at MDAL, too, it makes composing for this engine slightly more convenient.

582

(135 replies, posted in Sinclair)

Discovered something today. It may seem trivial, but nevertheless it was a bit of a revelation to me.
So basically I answered my own question about getting rid of the second counter in a simplified phaser algo. What I came up with is this:

   add hl,de
   ld a,h
   add a,c            ;C holds "second counter" offset
   and h               ;xor|or|and
   out (#fe),a

Now isn't it interesting how, by just swapping two bytes, this can be transformed into a regular "threshold" implementation? And yet this piece of code was derived from a Phaser implementation.

583

(135 replies, posted in Sinclair)

Yes, but then again vibrato via table lookup sucks for two reasons: One, it burns a load of cycles. Two, fixed offsets are not so useful - for a good vibrato, the frequency shift should ideally be calculated as a fraction of the base frequency. A more elegant solution would be nice to have. Though I don't see how at the moment, I'm having enough trouble pulling off normal one-way slides already (finally managed a somewhat acceptable solution in Betaphase, which is similar to what you use for synth drum generation in Phaser2 I believe).

584

(135 replies, posted in Sinclair)

Hmm, in its current form it burns a lot of registers for the buck, I'd say. But generally speaking, anything that does pitch slides is always interesting. Do you think there's any chance to turn this into a vibrato effect somehow?

Meanwhile, I got permission from Rui, so find attached the source for his "WPDM16" player. A few notes:
- main.asm is the latest version. It does not attempt full PDM mixing, but rather a simplified version thereof.
- main_old.asm is an earlier version. Not sure if this one is working at all, so I include it mainly to illustrate how the player developed over time.
- Sample data should contain only signed offsets from -64 to +64. However, as I mentioned mixing is unreliable, so I created some samples that would mix with reliable results, but violate the specs.

585

(135 replies, posted in Sinclair)

Ok, here's another, rather wild idea: Could this be of any use? Rui Martins once showed me an almost-working implementation of it, which operated on signed, range-limited PDM wavetable data. I never fully understood how it actually worked, though. It had problems in any case, mixing was unreliable. I'll see if I can get Rui's permission to publish his code here.

586

(135 replies, posted in Sinclair)

Ok, gotcha. Interesting point indeed. Well, it can always be faked via digi method (as can any other waveform at a minor cost), but the real nice thing would be to exploit this via an actual algorithm. So in abstract terms, the question would be how to translate the amplitude levels in H into the time domain. Pity that it doesn't work with pin pulses, that would've been my first try, too. Hmm, what about phase inversion? As you may remember volume can be controlled like this:

add hl,de
ld a,h
cp #80
sbc a,a
out (#fe),a
exx
add hl,de
ld a,h
cp #80
sbc a,a
out (#fe),a

where the offset between HL and HL' will determine the volume (HL=0, HL'=#8000 is most quiet; perceived volume change is logarithmic). Perhaps it's possible to modulate HL' by H somehow (HL' += (256 - H) or something like that)?

587

(135 replies, posted in Sinclair)

Ok, understood. It's essentially the same method I'm using in my digi-core engines, except that my sound output and calculations are fully interlaced (eg. during a loop iteration, I calculate the volume level for the next iteration, then jump at the end of the loop). That way, you can squeeze some more levels out (in theory, 224/8=28 levels would be possible, but there are some issues with that, so ~20 levels is more realistic).

Shiru, is this what you were trying to get at? Or did you have something else in mind?

588

(135 replies, posted in Sinclair)

@Hikaru: I don't quite understand your sample code. Is the .lvNN part executed every time, and then it will jump to .lv00-.lvXY, from where it'll loop back to .lvNN? Is beeper turned off before executing .lvNN? Wouldn't that give an overall very low volume?

Another thing that I was wondering about. In BetaPhase, phase channels are calculated as

   add hl,bc
   ex de,hl
   add hl,bc
   ld a,h
   xor d            ;or|and|xor
   out (#fe),a

which saves at least one register pair compared to a full Phaser implementation. During testing, I realized that actually 8-bit frequency dividers are enough in conjunction with scalers. So the above could be rewritten as

   ld hl,0
loop:
   ld a,b
   add a,nn
   ld b,a
   sbc a,a
   add a,h
   ld h,a
   ld a,c
   add a,nn
   ld c,a
   sbc a,a
   add a,l
   ld l,a
   xor h
   ds 2             ;2x scaler (rrca/rlca)
   out (#fe),a

freeing up another register pair in the process.
So here's the question: Can't  we get rid of one of the counters somehow (H,L in the above example)? In other words, is it possible to generate similar bitstreams as above (or at least something that offers timbre variation), but with a combined upper counter byte for both of the operators?

589

(43 replies, posted in Atari)

Yes, I knew about this one, but it contains only 2/4 entries.

590

(135 replies, posted in Sinclair)

Not sure I understand correctly what you mean, could you provide a pseudo-code or asm example?

The only thing I could think of right now would be to implement it via a digi core (like in fluidcore, zbmod, etc). But that would be pretty inefficient, as you'd need 4 shifts to derive a suitable volume value from H. So pointing to a predefined table of wave data would be much faster (but at the cost of using up an extra register, of course).

Speaking of digi core, there is a phenomenon that I haven't quite understood yet. When the overall calculated volume is >50% for longer periods, the actual output volume starts to ramp up, producing a saw-wave like timbre (check octode2k16, it is very noticable in the demo tune, when bass kicks in). My assumption was that this happens because the speaker cone does not have enough time to retract in "off" periods, and thus will start to ramp up volume. However, I made some code to specifically trigger that behaviour (by keeping calculated volume continually above certain thresholds), and it wouldn't produce any conclusive/consistent results.

591

(43 replies, posted in Atari)

Alright, I can live with that wink
Are the works available for download somewhere?

592

(3 replies, posted in Atari)

Hmm, interesting. As far as I understand the schematics (read: not very far), it might only affect RF out, though?

Good suggestion, that might indeed be useful. I think I had thought about it at some point, but completely forgot along the way. I'll put it on my to-do list for 2.30 wink

594

(3 replies, posted in Atari)

So I was wondering, would it be possible to apply the GTIA method from Atari 8-bit to the 16-bitters somehow? Ie. produce sound without using YM or DMA sound? Any ideas?

595

(20 replies, posted in Sinclair)

I'm also still very much intending to add XM import at some point, though there are more, uh, pressing problems at the moment wink

596

(21 replies, posted in Sinclair)

Alright, we've got a working PhaseSqueek config! It's pretty complete, except that MDAL doesn't support tables that aren't linked from a pattern yet.
For example something like this doesn't work yet:

:SEQUENCE
    pattern1
:pattern1
    A=c1, FX=fx1
    .
:fx1
   A=c1
   A=d1
   A=e1
   FXJUMP=fx2
:fx2
   A=f1
   A=g1
   FXJUMP=fx2

I have to say, MDAL makes things easier, but the engine is still a major p.i.t.a. to use. You have to be very careful especially when constructing tables, because of the data format quirks. For example, if you have A and B set in your pattern, and want to use a table that modifies A, then you should set B again at the start of the table. This is because the player expects a value for B when A is set, but mdalc has no means of knowing what that value should be, and thus will fall back to the default value if you don't tell it to do otherwise. (Setting the value once is enough, mdalc will use the value that was last set from this point on). Likewise, SIDA requires SIDB, ESA, and ESB and vice versa. Also, when in doubt, use PAB/PCD=0 to reset the phase.

597

(21 replies, posted in Sinclair)

Not 100% there yet with PhaseSqueek, some details are still missing. For example, I've recently added label prefixes, to minimize the change of name collisions (eg. if you name a pattern "pattern1", it'll be named "mdp_pattern1" in the asm output. However, I still need to implement this for commands that set a pointer (which the PhaseSqueek config uses). Once these things are taken care of though, MDAL should be able to support almost all existing beeper engines, except those that use multi-track sequences and/or samples.

598

(21 replies, posted in Sinclair)

I've got some very good news: The core table parser is implemented and working. In other words, MDAL just generated the first complete and (more or less) working music.asm for PhaseSqueek. There's a number of things that still need tweaking, but we're definately getting there.

599

(43 replies, posted in Atari)

I want to make an entry, but I don't know if I will have the time. Especially considering deadline is 1 week before the party, aka next Friday.

Ahahaha, yes! Me <3 Speedcore. Also, this is a whole new level of "Mario on a rave" big_smile