Somewhat related, I have a couple of tapes from the 80s that contained software for the ZX Spectrum (mostly my first attempts at writing code). They were written in a custom format by a custom device I no longer have, and of which I have very little information (I managed to track down one of the engineers who designed the thing some 30 years ago).
I have raw audio files of these tapes. I have managed to convert some other tapes in standard ZX Spectrum format to readable files I can load in an emulator. However, for the special tapes, there's no tooling available - all I have is a waveform.
If I had an array of bits, I could start trying to figure out the format of this thing. However, I have no idea how to go from a raw waveform to the zeros and ones it encodes. My best idea so far is to write a small program that looks for zero crossings, and depending on the timing output zeros or ones, but I suspect there might exist some software that does this already? I have next to no knowledge of signal processing.
Your typical tape from that era was simple FSK, 256 byte blocks + a checksum. You may want to start with trying that and simple variations on it. It shouldn't be too hard to figure out the FSK frequencies from the audio using a good scope.
I'd recommend asking people at https://www.worldofspectrum.org/forums/. This forum has been around since the 90s (iirc). I'd expect the kind of detailed knowledge you're after to be present there.
If you just want to get a quick answer on basic questions of the encoding, such as where to put the zero/one threshold, bits per second, how bits are encoded etc you can open up the file in audacity and zoom in on the wave form.
What you have is probably some variant of FSK, so if you view a spectrum (in Audacity, or similar) you should be able to pick out the frequencies being used.
Decoding the block structure is going to be harder, and it will also depend on the data representation. The data is probably tokenised. If it's standard ZX BASIC it should be easy-ish to decode, but if it's a custom format it's going to be much harder.
A .wav file is pretty simple, just an array of amplitudes indexed by time quanta. See if your audio files can be converted to .wav files.
Then, read the amplitudes into a C array (or a D array, even better!) and they're easy to do simple processing on.
I wrote a program a few years ago that would do this, looking for things that looked like clicks and smooth them with a cubic interpolation. It was fun to dink around with it.
No audio domain specific related experience, so there may be something better for this, but, failing that, for format exploration at least, I'd think numpy/scipy+jupyter would be great for interactively mucking around with the bits/bytes e.g.
np.where(x > ((max(x) - min(x)) / 2))
(roughly, am a bit rusty at the moment)
basically gives you a boolean array containing approximate zero crossings in an array, and so on.
similarly, you could subslice on range boundaries to ignore imagined 'marker' bits, index this through an ASCII table & display results, etc.
if you're not up with numpy array syntax / dtypes it takes a bit of getting used to, but well worth the effort IMHO in terms of the overall data exploration skills gained
I have raw audio files of these tapes. I have managed to convert some other tapes in standard ZX Spectrum format to readable files I can load in an emulator. However, for the special tapes, there's no tooling available - all I have is a waveform.
If I had an array of bits, I could start trying to figure out the format of this thing. However, I have no idea how to go from a raw waveform to the zeros and ones it encodes. My best idea so far is to write a small program that looks for zero crossings, and depending on the timing output zeros or ones, but I suspect there might exist some software that does this already? I have next to no knowledge of signal processing.
Any suggestions on how to go about this?