Yeah, there's the 1-bit AVR synth. Also, the famous 1-bit groovebox has some very crude means of syncing to a midi clock. There might be others as well.
776 2016-03-08 15:26:40
Re: What hardware equipment I need to make 1bit chiptune? (8 replies, posted in General Discussion)
777 2016-03-07 11:36:27
Re: 7 days, 7 (new) beeper engines (65 replies, posted in Sinclair)
Tadaa, here we are again with our popular series "Fixing the quattropic converter". In this episode, expert C++ coder utz will try a completely rewritten, all-new algorithm for determining the play mode! Be sure to have a good laugh at the latest bugs!
Download is still here: https://github.com/utz82/ZX-Spectrum-1- … p?raw=true
778 2016-03-06 18:29:37
Re: What hardware equipment I need to make 1bit chiptune? (8 replies, posted in General Discussion)
Hey gensek, welcome aboard! Yes, as garvalf said, you actually only need a Speccy (and perhaps a mixer/amp so you can boost the signal a bit when loading wav files created from .taps). However, tape/wav loading is slow and tends to fail frequently when doing it in loud environments, so if you plan on doing more work with 1-bit and/or playing this stuff for live shows, you might want to get a divIDE or divMMC for faster, more reliable loading. (The page I linked to is the original manufacturer, but there are other sellers/manufacturers as well, just google it).
779 2016-03-06 18:21:26
Re: next gen engine ideas (135 replies, posted in Sinclair)
Very interesting and pleasant sound! Wavetables are nice and good, but this is something that's uniquely 1-bit/beeper sounding while at the same time moving forward in terms of technique. Would definately use an engine with this.
780 2016-03-04 15:44:10
Topic: New Album: Tronimal - Eins (2 replies, posted in Sinclair)
This guy has a unique take on 1-bit music. Check it out.
HELLO WORLD!
The new ZX Spectrum Beeper Album
"Tronimal - Eins"
is available now!
As Stream, Download or limited SD Card Version.
Visit http://tronimal.bandcamp.com/This Album is completely written for
Sinclair ZX Spectrum 48K Beeper
using different engines in Beepola.
Music and lyrics written by Tronimal,
except Durchbruch (original song by Zweitgolf).
All songs were recorded from a real Sinclair ZX Spectrum 48K
without any extension or modification.Stream/Download Version contains 7 songs. Available for free as usual, with pay-what-you-want option.
Playtime 11:47 MinThe Special SD Cart Edition is limited to a maximum of 100 pieces.
It contains 8 songs, as well as 8 TAP files to play the instrumental versions on original ZX Spectrum or via emulator.
Playtime 13:00 MinThere will be a CD released later as well. It contains 10 songs. The releasedate is unknown yet.
Playtime 16:14 MinT-Shirts are in the making and one of them is already on the way.
Much better Quality than my Shirts before.
Colour Black///
additional information:
SD Card Version contains:
SD Card with Label-Sticker, an extra Sticker, a Booklet (3x3cm) and a transparent Shell!///
Many Thanks to Thomas, Jens, Markus, irrlicht project & Zweitgolf!
///
CC-BY 2016
For more information visit www.tronimal.de
781 2016-03-04 00:26:54
Re: 7 days, 7 (new) beeper engines (65 replies, posted in Sinclair)
sigh it's a curse with this engine, or rather with the converter. In theory the demo tune should be unchanged, so it's probably the converter causing the trouble. I'll look into it. Thanks for reporting, in any case.
782 2016-03-04 00:23:12
Re: new engine: fluidcore (4 replies, posted in Sinclair)
Thanks guys
Just checked it on +2A myself... looks funky indeed Ideally it should look more like this on 48K, too - then sound would be cleaner. I've got some ideas to improve sound by always keeping the beeper afloat rather than shutting it off at volume 0. But it'll be quite some work to implement, and I'll have to reduce the mixing rate, though there's some room for that.
783 2016-03-03 15:35:18
Topic: new engine: fluidcore (4 replies, posted in Sinclair)
What, another one? hehehe
fluidcore is a 4 channel PCM wavetable player for the ZX Spectrum beeper, using looped 256 byte waveforms. It offers a total of 17 volume levels, and can handle up to ~860% overdrive when the maximum volume level is exceeded. Sound is mixed at approximately 23 KHz.
Needless to say, I'm pretty proud of this thing Also, the good news is that I've managed to make an XM converter for it. So, hope you'll enjoy!
download (includes XM converter, pasmo is required)
source code
demo video
48K hardware recording
784 2016-03-01 11:11:57
Re: 1-bit music on Thomson 8-bit computers (3 replies, posted in Other Platforms)
Ah, nice! Must've been quite a challenge to get it up to speed on 6809. I'm curious if the guys will present something at Forever. I think I might've actually met them back at Forever 2010 (where LCD taught me my first steps of Spectrum coding ;D)
785 2016-02-23 21:00:48
Re: HoustonTracker 2 (TI-82/83/83+/84+) (130 replies, posted in Calculators & Pocket Computers)
Thanks guys! Btw I made quick video detailing some of the new features, check it out:
https://www.youtube.com/watch?v=tKfni5-_42g
786 2016-02-19 14:29:49
Re: HoustonTracker 2 (TI-82/83/83+/84+) (130 replies, posted in Calculators & Pocket Computers)
Good news everyone, HoustonTracker 2.1 has been released! Several new effects, improved keyhandling, and of course various bugfixes were implemented. For full details, check the original post in this thread.
787 2016-02-16 23:17:26
Re: new engine: wtfx (5 replies, posted in Sinclair)
Regarding a potential new tracker, I just remembered an old idea I had when 1tracker came out.
The main disadvantage of the pattern-less approach in 1tracker is that with increasing song length, moving around in the song, keeping track of what is what, and changing large portions of the sequence becomes tedious and demands a lot of attention. So, how to solve this?
My idea is to have an additional visual representation of the sequence - not unlike the Beepola pattern sequence in terms of layout, but translated to the marker concept in 1tracker. Each section (ie. block of song data defined by two markers) will be numbered, and shows up as a block in the sequence layout. This is fluid, ie. when a marker is removed, the sequence view changes accordingly (numbering should stay to avoid confusion). Perhaps there should also be the possibility to name sections, or assign a color to them, for those structures the user decides to keep permanently.
Now, obviously this wouldn't quite work like a traditional pattern matrix, ie. blocks can't be used multiple times. But it would still offer several possibilities to the user:
- clicking on a block will move you to the according position in the song data.
- drag blocks to move them around in the sequence. Multiple consecutive blocks can be selected with Shift+Click.
- Clone one or several consecutive blocks by marking source blocks with Ctrl-Click, then right-click at the desired position to insert the clone.
- Cut sections by marking them like above, then Del. Freed up section numbers may be re-used by the auto-numbering.
Well, just some random ideas here. I have neither the time nor the skills to actually program something like this.
788 2016-02-14 00:59:24
Re: 7 days, 7 (new) beeper engines (65 replies, posted in Sinclair)
Upgraded the compile scripts for the quattropic package. They will now generate the BASIC loader at compile time, adding a simple title screen and enabeling automatic assembly at an arbitrary address. There are two ways to use the new features - either via the new "interactive-compile" scripts, or by adding some parameters when running the regular compile scripts. Details for the latter can be found in the readme.
Thanks to Tufty for testing my Win build of zmakebas, which is now included in the package.
789 2016-02-13 20:31:58
Re: HoustonTracker 2 (TI-82/83/83+/84+) (130 replies, posted in Calculators & Pocket Computers)
Damn, what an ordeal! Does this also happen if you try to transfer via command line ("tilp ti82 Silverlink ht2.82p")?
790 2016-02-12 22:38:11
Re: Commodore 128 (2 replies, posted in General Discussion)
Hehe, I actually got a 128D sitting on my desk Was wondering about the Z80, too. But all the C= coders I've talked to so far have told me that it's not worth it because the Z80's power is seriously limited by the system. So, in order to make some 1-bit music on the machine, one would be better off coding for the 8502. I don't really like 65xx asm though, so... not for me
Btw check this out: http://csdb.dk/release/?id=94238
791 2016-02-12 13:53:53
Re: HoustonTracker 2 (TI-82/83/83+/84+) (130 replies, posted in Calculators & Pocket Computers)
Thx. Sent you a mail.
792 2016-02-10 20:21:32
Re: Best beeper music: top100 rating. (15 replies, posted in General Discussion)
Abrimaal's collection (= AYGOR) has already been added, I think. And yes, moroz needs .ay. I have some cruddy (Linux) toolchain which helps with the conversion, but it's still a lot of manual work.
793 2016-02-08 18:40:53
Re: Best beeper music: top100 rating. (15 replies, posted in General Discussion)
Neat! But yeah, definately needs more votes. Also yes, I think e.g. a lot of stuff from BotB is still missing. Unfortunately I don't have enough time to sift through and convert those entries atm. I think it would be really helpful if there was a conversion tool which would make the process a bit less time-consuming. Perhaps you could get in touch with puke7 from BotB to see if it's possible to utilize meta-data from BotB somehow?
In any case, I've added a link in the forum header, hope that'll help to generate a few clicks
794 2016-02-08 18:23:47
Re: List of 1-bit routines and editors for Sinclair ZX machines (7 replies, posted in Sinclair)
Thanks for the info! I have to admit the whole thing is a bit of a mystery to me - was the engine actually ever released in source format?
795 2016-02-07 18:21:40
Re: 1-Bit Forum Compo: Results (10 replies, posted in General Discussion)
Yeah, the usual problems... hope the site will be back up in a few days.
796 2016-02-07 16:04:03
Re: HoustonTracker 2 (TI-82/83/83+/84+) (130 replies, posted in Calculators & Pocket Computers)
Ok, sorry to hear that. Could you let me know which Windows version you're using though? I'm trying to sort things out with the TiLP developer atm.
797 2016-02-07 00:13:31
Re: HoustonTracker 2 (TI-82/83/83+/84+) (130 replies, posted in Calculators & Pocket Computers)
I'm afraid no. Could you post the console output with the ticalcs error? I'll try to pester the TiLP developer if I can't spot anything obvious.
Another option: Try the latest TiLP beta, perhaps there were some relevant bugfixes. See here: https://www.cemetech.net/forum/viewtopi … 917#244917
798 2016-02-06 12:46:42
Re: Tutorial: How to Write a 1-Bit Music Routine (56 replies, posted in General Discussion)
Yes, sure, that's what I'm trying to explain in the last paragraph. I didn't use it in the example code, because I wanted to first show a general, all-purpose approach before talking about possible optimizations, and because the logic behind the accu-MSB -> sample pointer LSB method may not be so obvious for beginners without some additional explanation (at least it wasn't for me when I was told about it).
799 2016-02-06 01:06:20
Re: Tutorial: How to Write a 1-Bit Music Routine (56 replies, posted in General Discussion)
Part 10: Achieving Simple PCM with Wavetable Synthesis
The idea behind pulse-code modulated sound (PCM) is remarkably simple. A PCM waveform consists of a set of samples which describe the relative volume at a given time interval of constant length. (Note the terminology of "sample" in this context, which has nothing to with a sample as we know it from MOD/XM, for example). For playback, each sample is translated into a discrete voltage level, which is then amplified and ultimately sent to an output device, typically a loudspeaker. The samples are read and output sequentially at a constant rate until the end of the waveform has been reached.
When attempting this on a 1-bit device, we face the problem that we obviously can't output variable voltages. Instead we only have the choice between two levels, silence or "full blast". So how can we do it, then?
In order to understand how we can output PCM on a 1-bit device, let's first recap how Pulse Interleaving works. The underlying principle of P.I. is that we can keep the speaker cone in a floating state between full extension and contraction by changing the output state of our 1-bit port at a very fast rate, thanks to the inherent latency of the cone. So we're actually creating multiple volume levels. I'm sure you've realized by now that the same principle can be applied for PCM playback.
So, say we want to output a single PCM waveform at a constant pitch. All we need to do is interpret the volume levels described by the samples as the amount of time we need to keep our 1-bit port switched on. So we just create a loop of constant length, in which we
- read a sample
- switch the 1-bit port on for a the amount of time which corresponds to the sample volume
- switch the 1-bit port off for the remaining loop time
- check if we've reached the end of the waveform, and loop if we haven't.
That's all - on we go with the next sample, rinse and repeat until the entire waveform has been played.
Loop duration is a critical parameter here, of course. We can't make our loop too long, or else the "floating speaker state" trick won't work. It seems that
a loop time of around 1/15000 seconds is the absolute maximum, but ideally you should do it a bit faster than that.
With common PCM WAVs, we'll run into a problem at this point. An 8-bit PCM WAV has samples which can take 256 different volume levels, take the more popular 16-bit ones and you've already got 65536 levels. How are we supposed to control timing that precisely in our loop? 1/15000 seconds corresponds to around 233 cycles on the ZX Spectrum. The fastest output command - OUT (n),A - takes 11 cycles, which means we can squeeze at most 21 of those into the loop - and that's not taking into account all the tasks we need to perform besides outputting. So how do we output 256 or even 65536 levels? The answer is: We don't. Instead, we'll reduce the sample depth (that is, the number of possible volume levels) to a suitable level. This will obviously degrade sound quality, but hey, it's better than nothing.
As far as the Spectrum is concerned, 10 levels seems to be a convenient choice. You might be able to do more with clever code (or on a faster machine), but for the purpose of this tutorial, let's keep it at 10. That is, if we want to output just a single waveform. But of course we want to mix multiple waveforms at variable pitches, let's say two of them. In this case, our source PCM waveforms should have 5 volume levels.
As you might have already guessed, we'll need to develop our own PCM data format to encode these 5 levels. How this format will look like depends on your sound loop code as well as the device you're targetting - anything goes to make things as fast as possible. On the Spectrum, we may take two things into account:
- bit 4 sets the output state (let's ignore the details for now...)
- we have a fast command available for rotating the accumulator.
So, our samples bytes might look like this:
volume binary hex
level 76543210
______________________
0% 00000000 #00
25% 00010000 #10
50% 00011000 #18
75% 00011100 #1c
100% 00011110 #1e
This reasoning behind this may not be self-evident, but it'll become clear when we look at a possible sound loop.
Unfortunately, this custom PCM format still won't allow us to create a sound loop that is fast enough, so let's apply another restriction - use waveforms with a fixed length of 256 byte-sized samples. You'll see in a moment why this comes in handy.
Our sound loop might look like this:
set up sample pointer channel 1 ld bc,waveform1
set base frequency ch1 ld de,noteval1
clear add counter ch1 ld hl,0
exx
set up sample pointer channel 2 ld bc,waveform2
set base frequency ch2 ld de,noteval2
clear add counter ch2 ld hl,0
set timer ld ix,0
loop:
load channel 1 sample byte to accumulator ld a,(bc)
output accu to beeper out (#fe),a
rotate left accumulator rlca
output accu to beeper out (#fe),a
rotate left accumulator rlca
output accu to beeper out (#fe),a
rotate left accumulator rlca
output accu to beeper out (#fe),a
add base frequency ch1 to counter ch1 add hl,de
IF counter overflows, advance sample pointer ch1 adc a,0 \ add a,c \ ld c,a
exx
load channel 2 sample byte to accumulator ld a,(bc)
output accu to beeper out (#fe),a
rotate left accumulator rlca
output accu to beeper out (#fe),a
rotate left accumulator rlca
output accu to beeper out (#fe),a
rotate left accumulator rlca
output accu to beeper out (#fe),a
add base frequency ch2 to counter ch2 add hl,de
IF counter overflows, advance sample pointer ch2 adc a,0 \ add a,c \ ld c,a
decrement timer and loop if not 0 dec iy \ ld a,iyh \ or iyl \ jp nz,loop
Now you also see why limiting waveforms to 256 bytes is useful - this way, we can loop through them without ever having to reset the sample pointer, which of course saves time.
However, there's a whole array of problems with this code. First of all, it's still quite slow - 218 cycles. Secondly, you can see that the last output from each channel last significantly longer than the first 3. A bit of difference in length is actually not a big problem, but in this case, the last frame is 3 times longer - that's simply too much. Thirdly and most critically, I/O contention has not been taken care of (this mainly concerns the Speccy, of course).
If you've followed the discussion in this thread, you'll have noticed that I normally don't pay as much attention to I/O contention as other coders, but in this case, aligning the outputs to 8 t-state limits does make a huge difference. I'll let you figure this out on your own though. Check my wtfx code if you need further inspiration.
I will tell you one important trick for speeding up the sound loop though. Credits for this one go to sorchard from World of Dragon.
In the above sample, we're actually using 24 bit frequency resolution, since we're keeping track of the overflow from adding our 16-bit counters. But 16 bits are quite enough to generate a sufficiently accurate 7-8 octave scale. So in the above example, instead of doing "adc a,0 \ add a,c \ ld c,a" to update the sample counter, you could simply do "ld c,h", saving a whopping 22 cycles in total. The high byte of our add counter thus becomes the low byte of our sample pointer. The downside of this is that our waveforms need to be simple - e.g. just one iteration of a basic wave (triangle, saw, square, etc.). It's less of a problem than it sounds though, as you won't be creating really complex waveforms in 256 bytes anyway. And for a kick drum or noise, you can simply use a frequency value <256, making sure that you step through every sample in the waveform.
And that's all for now, hope you find the information useful, and as always, let me know if you find any errors or have any further suggestions/ideas.
800 2016-02-04 22:33:56
Re: new engine: wtfx (5 replies, posted in Sinclair)
Yes, sadly the number of 1tracker users remains low, even though gotoandplay's new Phaser3 track might suck a few new people into trying it out. It's a shame, I certainly prefer the pattern-less approach. And I understand it would be rather messy to include wtfx. The same for Beepola, of course. I think the sample part could be solved in 1tracker by displaying a 16x16 hex matrix (plus WAV import), but the fx table part is indeed tricky. Another, somewhat smaller issue might also be that certain instruments (noise, kicks) need an alternate frequency table. Anyway, I don't have any real hopes to see wtfx in a tracker anytime soon.
Nevertheless, I've got to figure out how I can write plugins for 1tracker. It looks not even that difficult, seems rather I'm having some technical issues. I can copy and rename existing engines and they'll work, but as soon as I change anything in the code 1tracker will not "see" them anymore.
Btw just realized that I wasted a few cycles in the note data loader, will update in the next days.
Edit: Done. Optimized the data loader, and also replaced the noise samples, which had the volume levels wrong.