376

(1 replies, posted in Sinclair)

Just in case anyone will need it, came up with a kind of universal noise routine. It is strongly based on utz's noise generator with rlc h. Allows to control pitch, volume, and duration of a noise burst.

    ld hl,0                ;noise accumulator
    ld de,#2174            ;utz's rand seed
    ld bc,#0101            ;noise pitch, #01 highest, #ff (#00 actually) lowest
    exx
    ld bc,1000            ;noise duration

noise_loop

    exx                    ;4
    dec c                ;4
    jr nz,noise_skip    ;7/12
    ld c,b                ;4
    add hl,de            ;11
    rlc h                ;8        utz's noise generator idea
    inc d                ;4        improves randomness
    jp noise_next        ;10
    
noise_skip

    jr $+2                ;12
    jr $+2                ;12
    nop                    ;4
    nop                    ;4
    
noise_next

    ld a,h                ;4
    
noise_volume=$+1
    cp #80                ;7    noise 'volume' here, #80 max, less is lower volume
    
    sbc a,a                ;4
    out (#fe),a            ;11
    exx                    ;4

    dec bc                ;6
    ld a,b                ;4
    or c                ;4
    jp nz, noise_loop    ;10=106t

377

(164 replies, posted in Sinclair)

Reverse enginereed and added the other Lyndon Sharp's engine, from Bubble Dizzy. Also reworked support for the first one, renamed it to lyndon89.1te (if you have modules made with the old version, just edit the module text, replace engine name there).

Thought to make a note on the row transition noise. There is a way to minimize it. The idea is to avoid row transitions as is. Rather than storing song as a set of rows, with constant skipping of empty fields, store delays between any actual changes that is taking place. This should keep the sound loop tight, and longer gaps when actual changes happens will be masked by the fact that these changes actually change/restart a note, or trigger a drum, i.e. introduce a major change in the sound anyway.

I.e., rather than:

C-1 ...
... ...
... ...
... ...
... C-2
... ...
C-1 E-2

have:

C-1 ... > run sound loop for four rows without parsing anything
... C-2 > run sound loop for two rows
C-1 E-2

379

(135 replies, posted in Sinclair)

Wow, totally missed it too. Really cool one. Seems to be next version of the Lyndon Sharp's engine. Thanks a lot for pointing out.

380

(164 replies, posted in Sinclair)

v0.26 is up. Much faster Z80 assembler (in AngelScript), still not as fast as any native would be, but work gets more comfortable. Many minor fixes as well.

381

(135 replies, posted in Sinclair)

There is a few games with seemingly unique engines that weren't used anywhere else. What they has in common is the strong vibrato on the tone channel, which I think is underexplored area in modern engines.

Saboteur and Sigma 7 engines has one tone channel and noise drums, Sigma 7 also has phasing effects going on the tone channel.

Galaxy Force has as two channels of tone noise drums. The second channel sounds somewhat like ZX-10.

Maybe we could somehow exploit the saw/triangle generator for vibrato? Triangle should be good enough for this use. Should be easier than FM, too.

382

(164 replies, posted in Sinclair)

v0.25 is out of WIP. Now powered with SDL2, which supposedly solves some issues. For one, it now switches to the fullscreen and back blazing fast under Windows, unlike the old version. It also brings separate files for fonts (which is now 1-bit) and color schemes, and a pile of the font and color scheme files to look pretty and provide flexibility regarding screen sizes. It seemignly compiles fine under Ubuntu without editing the code, just by 'make' command (given SDL2 installed, not sure about AngelScrpit). I accidentally Pytha engine, too.

383

(164 replies, posted in Sinclair)

The window can be of any resolution.It is kind of a pseudo text mode, customizeable through the config file (width and height in text characters), and the font.bmp. Smaller font graphics, smaller window; different aspect ratio of the characters also takes effect. The defaults is done for 1920x1080.

Actually, I probably should add a few fonts and selection through the config file, for better convinience.

384

(164 replies, posted in Sinclair)

No, the idea of the changes in file structure and makefile was to compile and link AngelScript as part of the program, directly through object files, not as a lib.

Migrating to SDL2 is actually a good idea, I had a few SDL2 projects done, so will put it to plans. It just happened that the program does not really needed things that SDL2 has to offer, so I kept it plain SDL so far.

The display issue is really weird, as I don't have it neither under Windows nor under Linux. The construct is for normal view, it aligns the scrolling for blocks properly. My only guess is that it is some unitialized variable or getting out of bounds, althogh considering proper results in two very different environments, I'd expect the issue to be more exposed. Also, row < 24 means it is somehwere in the scrolling logic, as it is half of the pattern view height, the position to keep cursor line once scrolling starts. I'll think more about it.

385

(164 replies, posted in Sinclair)

So, tried to mess up with Ubuntu under VirtualBox, and got really weird results. Here is WIP source for 0.25: http://shiru.untergrund.net/temp1/1tracker_src.zip

I tried to reogranize files to simplify build process. Just 'make' it, and it should be enough (I only had to also 'sudo apt-get install libsdl-dev').

Weirdities:

- The program does not start if JIT is enabled in the config file (closes window right away)
- The program works without JIT, but produces no sound and occasionally reports missing data
- File dialog allows me to browse everywhere, just like under Windows. No changes has been made to the code

Please take a look, is the behaviour the same on your system?

386

(164 replies, posted in Sinclair)

The first = is a bug, I normally don't use such unsafe constructions (apart from a piece related to dirent code).

Yes, I think it going to work if the line will be disabled in the chopped view. I'm trying to compile it under Linux at the moment, to look into directory navigation issue. Not sure if I'll be able to fix that part, but will put an updated version soon anyway, with the display fix at least.

387

(164 replies, posted in Sinclair)

What does the filebrowser show at the bottom of the screen, where full current path is supposed to be displayed? Is the directories above executable actually seen there? I don't know much of Linux, maybe some permissions/security stuff is involved?

The second bug is very weird, definitely don't have anything like that here. Will think over it. Maybe I need to setup a virtual machine and see it by myself, after all.

388

(164 replies, posted in Sinclair)

1tracker got an update. No new engines this time, sorry. Instead, I tried another improvement to the 'single pattern' concept, that is called 'chopped view'. When it is enabled through the new alternative menu (hold Ctrl to see it), only current block is displayed starting from the top of the screen, like a separate pattern. I hope that obstructing visibility of other blocks should help to focus attention on current block, and make it more comfortable to work in case of short blocks (less scrolling). If you split your song into blocks of 16 or 32 lines, it will work similar to the traditional pattern/order list view in a way.

Linux users, please let me know what changes this version needs in order to compile it. Hopefully less changes will be needed this time. I also just noticed that dirent.h had a wrong include path, docs say it should be there, so file dialogs should work properly.

Thanks a lot for the write-up, now I get how it works. Pretty clever and cool stuff. 1-bit synthesis findings still able to amaze me, after so many engines and years.

390

(22 replies, posted in Sinclair)

Now that's some black magic is going on here.

391

(10 replies, posted in Sinclair)

I didn't have enough time yet to devote it to this idea, but I'm definitely want to work on it sometime.

You would need to spend most of the CPU time on both machines to run the MIDI protocol, as Spectrum does not have hardware serial I/O.

Really great video, was very interesting to watch.

Never was able to make my TI calc connect to PC, and it eventually bricked out on its own by just laying around (not powering on no matter what), so I never was able to see the thing in action. As I understand from the docs, the only way of data exchange in HT2 is the save states, i.e. loading/saving snapshot back and forth by the OS/linking software means. However, as the tracker naturally uses the I/O port as an audio output, it could be also used for a 'tape save' routine to store songs data to an external media (any modern audio recording device) quite easily. Such feature could be handy for frequent backup purposes.

Minor update to the 1bitstudio. All plugins now support Program Change event to switch between presets, also support preset name edits. phasesynth got extra oscillator mode, pin pulse in addition to the square/pulse wave.

Another different, but a bit related thing - VT2i. This is AY-3-8910 emulator combined with Vortex Tracker II instruments system. I.e. you can just load VT2 sample and ornament files and use them with a modern DAW.

396

(135 replies, posted in Sinclair)

Thinking on the 1-bit SuperSaw on ZX and messing up with assembly code a bit, I tried this thing. The idea behind it is the early electronic orgrans that used frequency dividers to form sound registers. So only one real counter here. Can't remember if we ever used something like this?

    ld hl,0
    ld de,400
    
loop
    
    add hl,de
    ld a,h
    cp #80    ;duty 1
    sbc a,a
    out (#fe),a

    push hl
    
    add hl,hl
    ld a,h
    cp #80   ;duty 2
    sbc a,a
    out (#fe),a
    
    add hl,hl
    ld a,h
    cp #80   ;duty 3
    sbc a,a
    out (#fe),a
    
    pop hl
    jp loop

This is one channel with 16-bit adder, the usual idea with duty cycle control like in Tritone. The trick is to generate a number of octave doubled derivatives (phase synced, though) by multiplying the adder by 2 (adding the adder to itself) a few times, two in this example. It adds octave doubles to the sound. Interesting thing is that the three duty cycles kind of have a limited control on the strength of the octave harmonics.

Another thing is that just applying a few duty checks to single unchanged adder also affects the timbre in a way:

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

    ld a,h
    cp #08
    sbc a,a
    out (#fe),a

The principial issue with a single oscillator that would produce detuned derivatives is the phase sync, I think. For now I see no way to produce detuned copies with their own phase (phases interference is what creates the effect), you'd need an unique counter to store the phase anyway. To me it seems that all possible approaches that adds/subs something constant to the main osc would produce fully synced (constant relation) phase, thus no effect.

Well, basically that's what Mister Beep always doing in his 8-channel songs for bass, to increase its strength - a few voices of slightly detuned copies of the same bassline. Just pushed way further, like all 8-16 channels set up to do this thing automatically. So a basic version can be done on the Octode (narrow pin wave) or Squeaker (square wave) base, but for more interesting results more channels (CPU power) is needed.

Added yet another synth to the 1bitstudio - phatsynth. It is based on the idea of JP8000's SuperSaw, just in 1-bit. Was just an experiment, but the results were quite interesting. It can generate a pack of square/pulse/pin voices, up to 16, detuned around the base frequency, with controllable duty/pulse width, phase reset, etc. The number of voices works kind of resonant filter at times. Velocity can be targeted to many of the parameters besides the volume, it is useful here to create controllable changes in sound.

And now something different, but related. I never was able to find a VSTi arpeggiator that would work with any MIDI synth and allow to create true chiptine arpeggios. There are MIDI arpeggiators out there, but they're targeted to trance and such styles, taking an arpeggio pattern designed in the program itself, then playing it relatively slow as a sequence on note on/offs, thus creating major buzz, and sounding nothing like chiptune arpeggios. I also seen that people imitate chiptune arpeggios in MIDI using tons of manual pitch bend automation edits. So I made a chiptune VSTi arpeggiator - ChipArp. It designed to work best with the 1bitstudio synths, because all of them support any reasonable pitch bend ranges, unlike other synths that often limited to two octaves, if properly supports the pitch bendrange RPNs at all. ChipArp just takes normal chords as input, so no learning of quirky editors or messing with 0-4-7 etc numbers is required.

Tested with Reaper only. Should work in any VST host that supports MIDI in/out type of VSTi plugins, i.e. where all 'traditional' VST arpeggiators will work (Psycle does not support them, for example). It may work with other VSTi synths than ones from 1bitstudio, but so far I found only one that actually supports pitch bend in a way that is usable for arpeggios.

Download ChipArp