76

(4 replies, posted in Other Platforms)

Yeah, that's exactly what I mean. There are some things going on with VIC sound which just leave me scratching my head. In any case, considering the strong low-pass filtering, I guess anything that involves fast switching might be out of the question. Haven't studied Aleksi Eeben's code, so I don't know how it works, but my guess would be that it's mainly writing to the global volume reg?

77

(7 replies, posted in Other Platforms)

Thanks for the detective work, mate. Do you have a .CAQ format description somewhere? I'll need that if I ever add these to Bintracker.

78

(135 replies, posted in Sinclair)

Ha, I missed that gem wink

Ah, glad to hear there's at least one person who's exited about this! smile Haven't had much response about it otherwise yet. Well, that's also partly my fault because I just can't be bothered to do a whole lot of promotion. And to be fair, it's not that big of a deal in the end, as there's not all that much functionality available yet. For my part I'm really happy to finally have Windows builds though, as this was the last major challenge. From here on, it's mostly smaller, incremental changes that won't require me working on the same thing for weeks on end.

Anyway, yeah, go check out Bintracker, and let me know about any bugs you come across!

nmplaces wrote:

That's really interesting--that there's a dearth of music done on minicomputers.  I could be mistaken, but my sense is that minis were targeted a lot at businesses and offered a lot of end-user applications, so maybe there weren't a lot of programmers on them creating music. I dunno, just a theory.  I'd love to be proven wrong and there be a cache of previously-unknown minicomputer music unearthed!

I dunno either, you could very well be right and it just doesn't exist. It's just what I'm guessing based on various factors:
- music was commmonplace on mainframes
- the same music techniques re-emerged quickly when Altair & friends became available
- documentation on minicomputers is notoriously hard to find, much worse than finding things from the mainframe era
So since the novelty had worn off by then, perhaps it wasn't considered to be note-worthy. Even on mainframes music is often remembered in this kind of hand-wavy manner of: Oh yeah, we also did that, but then, so did everybody else...

You could very well be right about the business environment not exactly encouraging tinkering. Back in 50s and 60s the whole music thing apparantly had some business value in terms of promoting computers, but in the minicomputer era that no longer applies, of course. Then again, aren't a lot of people bored at the workplace? I'm sure there must have been at least some degree of off-the-record activities on these machines...

nmplaces wrote:

These are in the PC era and maybe not 1-bit but I'm assuming you've seen Classical Mosquito and the album from the First Philadelphia Computer Music Festival?  They are wonderful!

The Philadelphia record I know, but what's Classical Mosquito? A quick search didn't really turn up anything that seemed related.

81

(7 replies, posted in Sinclair)

A couple more issues:

- Description of the drum column layout in phaser4.txt is wrong
- There's a lot of timing drift from the drums. It seems that there is no auto-correct, but it doesn't quite add up: even if I correct tempo manually, it's still not correct.

Also, what's the proper sample rate for drums, actually?

82

(7 replies, posted in Sinclair)

A huge leap forward! The spectrum of sounds coming out of this thing is amazing. Congratulations Shiru, this is a real masterpiece.

I noticed a slight inconsistency between how an instrument sounds from the instrument view's PlayRow and how it sounds in the main editor, under certain circumstances. See the attached file. I guess the actual problem here is that Rest does not work with this instrument, but I like the sound that's leaking. It's possibe to force a rest by setting another instrument at the rest note. So it would actually be nice to keep the "feature", but somehow making sure it sounds the same in the preview.

83

(135 replies, posted in Sinclair)

Ah, yes, of course. I'm clearly getting senile.

Don't think it was me who invented the rla trick. I'd be a cheap bastard and omit both the rla and the sbc a,a. Doing that could potentially open up a few more possibilities here, but with the unrolled loop, modifying 3 bytes might not be worth it. Even without that, I've got a feeling there are more possibilities hiding in those 2 bytes. I just don't see them right now. #dd 0 0 would give a pin pulse, of course, but that's probably not very useful in this setup. You could also swap bc and sp. Then #dd 0, add b/c would give duty control for example, but we already have that via phase offset, of course.

84

(135 replies, posted in Sinclair)

Wahoo, now you're on a roll!

Excuse me for having a brain freeze right now, but what is the purpose of the rla in normal phasing mode?

Some tangentially related, inspirational reading: Grayscale on 1-bit LCDs. Would be interesting to try and apply some of the more advanced techniques to 1-bit music. Iirc perevalovds was using error diffusion of sorts for 1-bit sampling.

These are great! Thanks a ton for your digital archeology efforts.

1) I actually had these sitting on my hard drive, but couldn't remember where I got them from. Mystery solved. And yes, I'd say it's quite likely Pete Samson did these recordings.
4) Yes! Been chasing LINC music for ages, so glad you found proof of it.
5) Haha, I love this one. Quite possible he's right that "It may have been the first program for both generating 'music' and playing it in real time."
Btw, fixed the link to Andrew Herbert's Elliott 900 series music software collection as well. He was kind enough to put it on Github!
6) According to Discogs, the 7" is actually from 1962: https://www.discogs.com/release/3793284 … Processing Looks like 1962 was quite the year for 1-bit music, heh.

nmplaces wrote:

If I come on any others I'll add to this list but I think that's it for now.  Hope they are useful.

Yes, they absolutely are useful, and please do add any further findings you may come across. Aside from the mainframe era, I'm also notoriously short on info on the minicomputer era, especially non-PDP stuff. Also happy to hear about any non-1-bit music software from that time (aside from the rather well documented later PDP models stuff).

86

(164 replies, posted in Sinclair)

Yep, I'm using Print, and it's called twice here. Ehhh... well, it's not causing any major issue, so I'd say let's just walk away from this one.

87

(164 replies, posted in Sinclair)

I'm pretty sure ZXStandartExportOptions itself is called twice, but I don't know yet where those calls are coming from. While investigating, it turned out my build system is broken and can't link pthreads for some reason. So I need to fix that first.

88

(164 replies, posted in Sinclair)

Also found the bug that causes peskysoundzx to segfault. It seems that Angelscript does not like implicit type conversions in conditionals. The following changes to peskysoundzx.1te will fix the problem:

line 542:

    if(row<int(songLoopStart))//start before loop

line 549:

    if(row<int(songLoopEnd))//start inside loop

line 748:

    if(takeLoop==1) if(row>=int(songLoopEnd)) row=int(songLoopStart);

89

(6 replies, posted in Sinclair)

Excellent. Though I would argue that the discovery of CrossPhase alone warrants a Phaser4 engine.

90

(164 replies, posted in Sinclair)

Spent some time trying to tackle the notorious "Z80Ass error: label already defined!" error again. I still don't know what exactly is going wrong here. The .loop label is indeed set twice under some circumstances (at the start of a block, in any case). So for esex, it will output this:

.song
.loop
    db #68,#00,#82,#e4,#82,#e4
.loop
    db #01,#01,#01
    db #00
    dw .loop

Anyway, I found a possible fix. In the affected engines, you usually have something like this near the beginning of the Compile function:

    row=startRow;
    takeLoop=0;

    if(oneShot==1)
    {
        len=1;
    }
    else
    {
        len=songLength-row;
        loopRow=-1;

        ...

Initializing loopRow to -1 before the conditional instead (so it affects both branches) prevents the error from occuring. Not sure if it causes any problems further down the line. I haven't noticed any yet.

Btw it seems the assembler always runs twice. Is this intentional?

91

(135 replies, posted in Sinclair)

Nom nom, that CrossPhase has a very satisfying sound. Great discovery.

I've used the idea behind ModPhase (without the xor modulation) a couple of places, BetaPhase for example. The good thing is that it can be done in the outer loop, which also allows for variable speed (by adding a variable amount to DE). In a pinch, one could even abuse the outer length counter for this, hehe.

92

(4 replies, posted in Sinclair)

Whoa, a wild garvalf appears! Good to see you're still around, mate.

93

(135 replies, posted in Sinclair)

    di
    ld hl,0
    ld de,0
    ld bc,#180
    ld sp,#38+#180/4

.play_note
    add hl,bc

    ex de,hl
    add hl,sp
    ccf
    sbc a,a
    ex de,hl
    and h
    ld h,a

    cp #20
    sbc a,a
    out (#fe),a

    dec ixl
    jr nz,.play_note
    dec bc
    jr .play_note

Not going to pretend I have any idea what's going on here. Some interesting sounds happening though. Seems that the note frequency is actually determined by the value in sp, not the one in bc. Just resetting the phase without additional modulation in the outer loop does something rather Earth Shaker-y. inc sp instead of dec bc is fun, too. No idea how to make any practical use of all of this, though.

94

(135 replies, posted in Sinclair)

Btw, I think I know what you mean re: maths now. It's often kinda tricky to know what the resulting perceived tonal frequency will be.

95

(135 replies, posted in Sinclair)

BASE=#18

init
    di
    ld hl,0
    ld de,BASE*#400
    exx
    ld hl,0
    ld de,0
    ld bc,BASE*#20
    ld sp,BASE*8

.play_note
    add hl,bc
    ld a,h
    cp #20
    sbc a,a
    out (#fe),a

    ex de,hl
    add hl,sp
    sbc a,a
.mod1=$+1
    and #40
    ex de,hl
    add a,h
    ld h,a

    exx
    add hl,de
    ld a,(.mod1)
    adc a,0
    ld (.mod1),a
    exx

    jr .play_note

??? Now what. If I could get it to only do the part where it goes "oooeoouuwww", that'd be cool.

96

(135 replies, posted in Sinclair)

I think that generally, pre-calc is a viable option. The number of unique notes in a song is usually not that high, so size-wise it's probably ok. More broadly speaking, pre-calc could open up quite a few new paths for beeper. We'd just need an editor that supports that *cough cough*

The alternative would be to, well, use a suitable modulator, which boils down to having one or more additional counters/oscs. Which is what lead me to the "scheduler" design I described above. The whole scheduling part is actually not that important. The core idea is to unroll the sound loop, say, 8 or 16 times, updating the main counters on each iteration and spreading out the more expensive computations across the various iterations. When using a 12-bit main counter, updating an auxilliary 8-bit counter every 16 sound loop iterations should give sufficient precision and speed.

My last, failed experiment uses something along those lines. It's running off 32 byte wavetables (which, in conjunction with an 8-bit main counter, gives a reasonable frequency range). When the aux counter overflows, a variable offset is added to the wavetable pointer, and the offset itself is negated. The problem is that my usual 16-32-64-112t PCM renderer is too noisy, so I would need to rewrite the whole thing using multi-core (ie, one copy of the sound loop for each volume level). It should be possible without duplicating all the "expensive calculation" versions of the sound loop, but eh... it's still a lot of tedious work.

Ah, it's made by nyanpasu64. Him and me were exchanging tracker design ideas a while back, as he was also working on an experimental next-gen tracker back then. He's also the main dev of Dn-FamiTracker, which is the only active Famitracker fork atm afaik.

98

(135 replies, posted in Sinclair)

Neat idea, don't think we've used that anywhere yet.

I wonder if it could be pushed even further. Like, instead of every frame, add the offset at a variable rate. That could perhaps turn into a sort of 1-bit FM, without the use of PCM emulation trickery. (Sorry for hijacking your idea immediately, but I recently tried to implement actual FM again, and came to the same conclusion as last time: It's possible to do the necessary calculations fast enough, but the output is too noisy for reasons not entirely clear to me.)

Thanks  for sharing.

Does your tool do spectrograms as well? Those sometimes look super interesting with 1-bit music,

100

(2 replies, posted in Sinclair)

TOO QUIET! big_smile big_smile big_smile