576

(10 replies, posted in General Discussion)

The was supposed to be one in november, but I didn't have time to organize it after all. Next good chance would be in early spring, after Winter Chip has finished on Battle of the Bits.
In the meantime, perhaps you would like to participate in the Beeper compo at DiHalt 2017 Lite: http://dihalt.org.ru/rules5_eng.html#zx ?

Neat!

"$db" is indeed a note value in hex notation, equal to 219 in decimal wink

I wonder what went wrong with those errors though. The line "#define db .byte" actually means the opposite in TASM, eg. "interpret '.byte' as 'db'". But as I said, back in the day when I wrote these I didn't have much of a clue about asm either. In any case, I promise to make a better version of ti1bit pack as soon as I can find the time, hopefully in January.

If you run into the "too many lines" problem, it might also suffice to put some dummy labels somewhere in the music data, eg.

   db $bla
   db $bla
   db $bla
dummyLabel1
   db $bla
   db $bla
   db $bla

Haven't tried this though. In any case, first thing for the new ti1bit pack will be to eliminate TASM and replace it with a modern assembler which doesn't bicker about stupid crap like that.

A note on speed: Speed conversion in ti1bit is not very accurate to begin with. But there are also other problems, some of which were discovered only recently. Namely 1) The TI-83 Parcus (the model you have) actually runs at around 7 MHz, despite the official specs claiming it runs at 6. 2) CPU speed on TI calcs fluctuates significantly depending on battery strength. On TI-83, it's not as bad as on some other calcs, but still normal to have +/- ½ MHz variation.

Wow, you seem to be really active! Also, I think black metal will have a few fans around here wink

In theory it should just work by setting the loop point where you want it in 1tracker. I have no clue what I even meant by what's written in the ti1bit readme.

580

(135 replies, posted in Sinclair)

Proof of concept for my idea about saw wave generation:

;saw wave via square wave transform ([f,a]+[2f,½a]+[4f,¼a]...)

    ld hl,0
    ld de,#40
    ld c,#fe
    
loop
    add hl,de    ;11
    
    ld a,0        ;7    ;timing
    ld a,0        ;7    ;timing
    ld a,0        ;7    ;timing
    nop           ;4
    
    ld a,h        ;4

    out (c),a    ;12__64   ([f, a])
    rrca         ;4
    out (c),a    ;12__16   ([4f, ¼a])
    rrca         ;4
    ds 4         ;16
    out (c),a    ;12__32   ([2f, ½a])
    jr loop        ;12

Ha, with a demo tune like this, it was totally worth it big_smile Looking forward to what you'll come up with. Please do post your stuff here, I'm curious.
And yeah, applying some eq is totally fine in the 1-bit world (well, in my opinion at least). Though lsengine is a pretty hopeless case. I've used it quite a bit for some time, but I never managed to get it to sound really good, neither on Spectrum nor on TI.

Yeah, almost there I think.
Did you remove all dots (.) from the music.asm file? If the answer is yes and it still doesn't work, attach your music.asm here and I'll take a look.

Hey, no problem at all. Using this crap package certainly isn't trivial wink and others might benefit from having these questions discussed. So no need to feel guilty.

Regarding the error, I'm a bit surprised by this one. I don't have any problem running TASM in DOSBox. But I just noticed that I'm appearantly using 3.1, not 3.2.
http://www.ticalc.org/archives/files/fi … /1504.html
Maybe using this ^ will solve the problem? Otherwise, I'd say 3.2 appears to NOT require DOS after all. So perhaps try to run in directly under Windows (though I doubt that would work under anything newer than XP)?

584

(135 replies, posted in Sinclair)

Alright, got a new idea - use a "state memory". Now wtf is a state memory? Think about how we implement accumulative pin pulse engines (Octode XL, for example). We basically "remember" the state of the carry flag from add hl,de for a given time (which, in an accumulative pin pulse engine, will control the volume). But in pulse interleaving engines, we evaluate the state only once and then discard it immediately. But it might be useful to actually remember it for some time. For example, we can implement a primitive low-pass filter like this (excuse the sloppy code, it's early in the morning big_smile)

   ld hl,0        ;counter, clear it
   ld de,#40      ;freq divider
   ld b,0         ;"state memory"
loop
    add hl,de     ;nothing special going on here, just adding da stuff
    ld a,h        ;HL bit 12 = output state
    out (#fe),a
    
    and #10       ;store the current state in state memory
    or b
    ld b,a
    
    rrca          ;get old state from 8 loop iterations ago
    ;rrca         ;2x rrca = high cutoff, 1x rrca = low cutoff (filter moves slower)
    nop

    nop           ;timing
    
    out (#fe),a
    
    and #ef       ;delete old state from state memory
    ld b,a
    
    ld c,0        ;timing
    
    jr loop

High-pass could be implemented in a similar fashion, because HP_output is basically just (original_output - LP_output). There could be other uses for this "state memory" thing as well.

You're not giving up easily, are you? big_smile Well, with so much persistence, I don't have a choice but to help you wink

Ok, so first of all, you need the "other" TASM - not Borland, but Telemark. You can get it here:
http://www.ticalc.org/archives/files/fi … 25051.html
You'll probably need to run it in DOSbox, btw.
And devpac83 is here: http://www.ticalc.org/archives/files/fi … /3650.html
Just dump all the files in your working directory, where you have the asm files. "asm83.bat" goes into that folder as well.

Regarding step 5, just make sure the first two lines look something like this:

;#define TI82
#define TI83

Anything that has a ";" in front of it is considered a comment in assembly, and will be ignored by the assembler. If you just have the line "#define TI83" (without a ; in front of it), then that'd be correct. Don't worry about the "looping" part for now.

Also, don't worry about the "long song data corrupts TASM" part, unless you actually run into problems. If that happens, take this:

ptr1
loop1
    db $21
    db $2d
    db $1e
    db $2a
    db $20
    db $2c
    db $1c
    db $28
    db $2a
    db $1e
    db $26
    db $1a
    db $28
    db $1c
    db $25
    db $19
    db $2d
    db $2d
    db $2a
    db $2a
    db $2c
  bla bla bla...

and transform it into this:

   db $21, $2d, $1e, $2a, $20, $2c, $1c, $28, $2a, $1e, $26, $1a, $28, $1c, $25, $19
   db $2d, $2d, $2a, $2a, $2c, ...

Also yes, that rawp thing will be a bit easier to use. No need to fiddle with TASM, at least.

It's even less straightforward, actually. If you have an XM, you'll need to use one of Shiru's original XM converters to produce an .asm file, adjust some things manually, then use TASM and the ti1bit pack to compile them into a .83p. The problem is that those XM converters are meant to operate on specifically crafted templates. While it is technically possible to not use the templates, your mileage may vary wildly as far as the results are concerned. As I said, it's really one big hassle to use. Well, knowing that you are interested in using this, I'll think about rewriting the whole thing and making it more convenient to use. It'll be some time before I get around to that, though, probably won't happen this year anymore.

Ah, glad that's solved. Hmm, perhaps I can make things a bit more clear in the manual.

Also... you actually want to use ti1bit pack? yikes I always assumed there's literally nobody using it, hence I haven't updated it in ages. In it's current form, it's a major p.i.t.a to use. Well, in theory you can use the engines while ht2 is installed, but I'm afraid you'll run out of RAM very quickly. On TI-83 with HT2 installed you have around 500 bytes left, of which Ion needs another 200 or so for its internal operations. So you have just 300 bytes left, but even a small 1-bit song usually takes more than 1 KB.

Hi there,

If you don't have "A", it means the Ion shell is not fully installed. Make sure you have done the following steps, in this precise order:
1) transfer ion.83g
2) run "ION"
3) delete ION/IONZ
4) transfer ht2.83p
If that doesn't help, let me know. We'll get there eventually wink Also, props for building your own cable!

589

(135 replies, posted in Sinclair)

I believe there may be another way of fak... err, I mean generating a saw wave on beeper. For this, we need to look at the frequency spectrum, rather than the waveform. In the frequency domain, a square wave is characterized by having a peak at each odd harmonic. That means, for a 440 Hz, 50% duty square wave, frequency components will be present at 440*3, 440*5, 440*7 Hz, and so forth, but not at 440*2, 440*4, 440*6 Hz etc.
A saw wave, on the other hand, peaks at both even and odd harmonics. Thus it can be approximated by mixing a series of square waves with frequencies of f, f*2, f*4, f*8, etc. With the "fast accumulation" technique (add hl,de \ ld a,h \ out (#fe),a) we can easily achieve this by rotating A to get the required multiples. Doing this with 3-4 frequencies should already give a reasonable approximation of a saw, because the missing components will be high enough to fall out of the range at which humans can reliably detect the difference.

590

(21 replies, posted in Sinclair)

Ok folks, last engine from me for 2016. This one is a weird beast. In terms of capabilities, it's somewhere in between Tritone, Betaphase, and qaop. However, at 3-10 bytes per row, its data format is much more compact than the latter two.

wtbeep's main specialty are 32 different "waveforms", which are realtime generated, ie. no samples involved. Also re-using the new user-configurable click drum system from povver, though at a slightly decreased quality because wtbeep's loops are shorter (184 cycles vs. 224 in povver), and I don't want to decrease overall tempo resolution just to facilitate longer clicks.

To be honest I don't even understand myself what's going on with some of these waveform generators. But hey, it works, so let's not ask too many questions big_smile

Source code and stuff is on my github as usual. I might do an XM converter and/or MDAL config later if I can find some time for it.

591

(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

592

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

593

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

594

(43 replies, posted in Atari)

Thanks! "The Wild Walker" is pretty cool.

595

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

596

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

597

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

598

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

599

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

600

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