-
c0dav0x
The yamaha FM synth chip that was used in alot of their keyboards as well as some of the best-sounding arcade games... Does anyone know of a patch that emulates all of its features? Or can anyone even tell me where to find all of its features & settings? I know it has 8 voices, with 4 operators to choose from for each (saw, sin, tri, noise(?)). But can anyone tell me what else it has in terms of digital or analog envelopes, filters, effects and all? If there's no patch for it I plan to try and make one, but I'm not finding much information.
I did find the datasheet, which doesn't help a whole lot. Here's what it says:
_"Generate up to 8 notes"
"Generate noise"
"Timbre can be altered temporally"_
How? I think that can be done by sweeping the modulator frequency or level controls - but are there auto-sweepers or hard presets?_"High harmonic can be de-harmonized from the base freuency"_
What does that mean - that I can control the pitch of the highest partial independently from the pitch of the lower ones? Is this easy to do in pd? I imagine it will require FFT, or maybe I could erxperiement with networks of key-following filters?_"De-harmonize between octaves"_
Anyone know what this means?_"Interval setting of 1.6 cents."
"Add vibrato and AM"_
AM is just the volume envelopes, right? Or am I missing something completely?If anyone wants to answer these questions, fire away, heh. I certainly appreciate it!
-
c0dav0x
This may sound confusing, if so no worries.
OK... right now I'm working with 4 voices, each with 5 values that I want to be able to occasionally sweep (fund freq, vibrato range & speed, tremolo level & speed). I don't have a piano keyboard, and may never get one because I prefer to send ordered, pre-loaded lists of notes and envelopes to the instruments to control their sounds, rather than MIDI device inputs. I'm wondering if there's an easier way to program sweep information than the method I'm building now (which is to store each upcoming sweep as it's own pre-loaded table of offest values, and have each list of tables accessed by sending the address referencing the voice-modifier I wish to sweep). That way I can encode the ranges, direction changes, and speeds of a particular sweep motion with a single, easily-resized data structure.
Basically when I want a certain input to a particular voice swept, I just negate the value I'm sending (since they are all otherwise positive), then use a cell logic to return the abs values to the voice player, and if negative then also send a message to my sweep sequencer consisting of "addresses", which are just numbers representing which voice's modifers I want swept on the current beat. The sweep sequencer then decodes this address using a large [select] to choose which of 20 lists of sweep-offset-tables to use: (to tabread through @ 1 index/ms, then send & add the sweep-offset values to the proper modifier input of my voice player, and finally, prime the next offsets table to use next time the same address is sent to the sweep sequencer.
This means that my little 4-voice synth, with 5 sweepable modifiers per voice, will require 20 separate lists of tables (I figure anywhere from 0-30 tables per list in a given track). To me this seems like kind of an ugly/expensive approach, but it's alot faster than the only other programmable-sweeps method I could come up with.
I bet this post looks like a train wreck, but hopefully someone else has "been there" and can visualize what I'm trying to do. Is this going to be the easiest way for sending programmed sweeps? Maybe there's something I'm overlooking that would do this with less work and code volume?
And if this is my best bet, then is 1 index/ms a good speed to use for extracting sweep offests from the tables? This is kindof a guess... I shouldn't need my sweep response to be faster, but maybe it needs to be slower? The most voice modifiers I'll ever sweep simultaneously on a given beat is 12, with the average being more like 1-2.
-
c0dav0x
I can't seem to use the [<~], [>~] and [||~] objects from zexy external, because windows won't take those characters in the filename. I tried renaming the pd patches to "lt~", "gt~" etc, but I can't get them to work. Is there something else I need to change for everythig to match up properly? Or are windows users just unable to use these three objects?
-
c0dav0x
My specialty is hardware, logic and machine programming. I know that down the road, I will be looking into trying to run pd on my own boards. The thing is, I don't really know anything about the language pd is written in, or more importantly, the nature of a pd patch's disassembled code.
Does anyone know if pd code can be easily run on architectures other than x86 and ppc?
I have alot of experience on the moto 68000 series, which at 16MHz is probably fast enough for some wavetable syntheses and alot of control comptations, right? That's where I would like to start.
I'm also interested in some other cpu's that I haven't delved much into yet.. the hitachi SH-4 looks attractive for embedding in a pd board, with its built-in logic for fourier transforms and matrix math (which I think would be nice for an audio-responsive GEM patch).
-
c0dav0x
Hi everyone, I forget if I already mentioned elsewhere, but I'm new to synth design and for my first project I want to emulate the NES sound device (2A03), which I've got over halfway complete.
There's alot of detailed specs for the 2A03, even a manual on programming the hardware, and that helps alot but it still takes me a long time to figure out how to emulate some of the effects. The how~ forum has been very helpful, but I was wondering if anyone else here is into the "8-bit sound", and does any designing/composing with pd?
Once I finish my 2A03 project and get some experience, I want to move on to emulating the Sega X-Board sound devices, or the Seta x1-010 both of whch seem to have no technical documatation available. Anyone know a good way for analyzing obscure sound devices? Alot of times it's difficult to get samples where only 1-2 channels are playing.
-
c0dav0x
I feel like an idiot asking this but I've been looking for the answer a long time. How can I get object boxes and especially comments to appear smaller? I've seen this alot in other peoples' patches but I've never figured out how to shrink it down.
-
c0dav0x
I want to reduce the linearity of a triangle wave by reducing the bit-depth of the amplitude, basically make it into a fine, triangle-shaped step-function. I'm trying to think of what would be the best way (least CPU work) to achieve this?
I suppose the most direct approach would be to convert from digital to a low-resolution (like 8-bit or even 4-bit low) analog approximation, but is that possible in PD?
Could I somehow get the triangle into a table, and then use tabwrite~ (or tabosc4~?) to create another table that is incremented at the same rate (hopefully real-time), but the amplitude values written to the new table are only updated on every n-th sample of the input? I'm a little confused on the differences between the various table objects... I know I need to do some more reading, but I'm hoping someone may have a quick answer for me
-
c0dav0x
Hi all, glad I found this place and it's still active! I'm fairly new to pd and to synthesis in general, but I've been playing with the platform for a few months now and I recognize a few names here already from alot of examples and tutorials I've viewed, so it's good to be here.
Anyway on with my question.. I notice vline~ has two extra inputs, but all the examples I've seen use three-member lists on the hot input. And the built-in help for vline~ only explains the first input as well. What are the other two inputs for? Can all three be used to set the target, duration and delay values individually?
And if so - can I send for example:
msg[ 1, 0 ] to target, msg[ 20, 100 ] to duration and msg[ 0, 400 ] to delay inputs of vline~, instead of using:
msg[ 1 20 0, 0 100 400 ] on the first input?This would help me alot for the simple ASR envelope I'm working on. Otherwise I suppose I can go through set & trigger hell and maybe figure out a good way to get the variables into the (list, list) format but I'm worried about lagging something up.
Thanks!
-Matt -
c0dav0x
thanks guys, I'll poke around and see if I can find some manuals. nestor if you have one that's ready to upload that's cool, but don't go outta your way, I'm trying to be more resourceful, heh.
AM is rapid modulation of volume that causes audiable sidebands. When the sidebands are inaudiable for low modulation frequencies we usually call the effect "Tremelo" not AM. Vibrato is slow frequency modulation, usually less than 10Hz
Man that's a great analogy! I had figured out the relationship between FM and vibrato, but I didn't realize the one about AM and tremolo. Thanks!
-
c0dav0x
well, I've got the four main instruments and the panelling done for my pd-NES, all that's left is to add glue for the sequencing and composition tools. I had to cheat pretty badly on the noise channel though. For the standard noise mode I used the method from zenpho which looks simple and sounds good, but I noticed he didn't emulate the looped-decay noise mode, which all my resources describe as being "difficult", but otherwise provide slightly different explanations of the mode. It appears that emulators and other software that fully emulate the noise channel seem to "wing it" and use their own unique methods. I'm guessing it's because the actual hardware driving the random number generator kicks out one random bit to the 4-bit DAC at 890KHz, which I guess I can't simulate in pd unless I could change my sampling rate to 445kHz (for 4bit codes). I haven't found a good explanation of what happens to each bit - apparently the hardware updates one of two different bit sequences (a 93-bit sequence and a 32kbit sequence, the latter of which makes no sense to me - that's a big load on the memory bus). I've tried creating different kinds of noise generators or 93bit noise samples, and looping them with an interpolating sampler and decay envelope, but it never sounded right. The problem is the noise itself - no matter how fast I loop I never get a smooth tone, or I still hear regular noise over the tone.
I ended up ripping the looped noise sounds from NES games and an emulator, storing them as timbre presets, and using soundfiler and elementary granular methods to transpose. It's definitely cheating, but it doesn't limit me to the 16 pitch colors that the hardware has to choose from. So I got what I wanted, the NES sound without all the NES limitations, but I'm a little frustrated that I couldn't find a solution that uses only generators as opposed to external samples.
Does anyone have a recommendation for correctly emulating the looped-decay-noise sound? I've attached a wav ripped from Megaman that has a D# tone at four different timbres (caused by different decay strengths in the envleope).
-
c0dav0x
well, i thought it was related... I think I'm trying to do the same thing as the OP, just with wav instead of mp3
And yeah it looks like soundfiler is what I need! I had briefly seen a description of soundfiler, but it must have not been a good description because I thought it was something else entirely... and I see now you already mentioned soundfiler in an earlier reply so I guess I need to be more observant.
thanks!
-
c0dav0x
What's the best way to get grain-sized (< 10 ms) wav files into a table? I wouldn't need it to be real-time, since I would just load my samples into different tables before runtime by loadbanging [[i]myarray read filenames] messages, and just switching tables in real-time.
If I have to, couldn't I actually do it myself (hopefully all in pd, or at least in C) where I parse/strip the wav header and replace all the PCM data with the actual levels? I'm not good at that kind of programming, so I'm hoping a patch or external exists?
-
c0dav0x
Well for now I'm concerned about getting an authentic sound without worrying too much about emulating the specific operation of the hardware. I also want to add a few extras that the original didn't have, like vibrato, sweeping of the triangle channel, and maybe some other small odds and ends.
The pulse channel sound is simple to emulate, especially if you aren't concerned about timing their length & envelope data against other components, like the frame counter or interrupt lines. The triangle is a bit trickier to get authentic.
The noise channel is particularly difficult to emulate, at least for the inexperienced like me. The NES noise sound in itself is easy to reproduce as a sample using 4bit level quantized noise. The 2A03 actually uses a long shift register and a XOR gate to generate a new pseudo-random bitstream for noise samples. Rather than use my very own enveloping like I did for pulse and triangle channels, I will have to reproduce the native specs of the counters/timers and decay envelope modes, especially to get the looped-decay noise channel mode to sound authentic.
So I guess I will be using some of the same dataflow and control logic that the hardware uses, but I want to cut as many corners as I can right now, especially where I can easily provide userdata through the GUI instead of poking 6502 assembly. Then I can use my own, simpler methods for programmable manipulation of all of the inputs, but ideally get the same-sounding output as I would programming the actual hardware.
Right now I'm going through this document to try and get a full picture of the hardware:
http://nesdev.parodius.com/NESSOUND.txtI believe that has everything needed to directly emulate the channels, I just gotta keep studying the hell out of it until I can determine all of the specifics on timing, mode switching, sample sizes and such.
The zenpho patch looks similar to what I want to use eventually for making real music, I'll probably refer to that a few times. I see he uses a completely diferent PWM routine than I do. Once I get the NES channels sounding properly, I plan to keep adding voices from other old sound chips I enjoy along with more extras and use it as my main synth.
Thanks alot for that headlessbarbie link. Really amazing stuff. I've had thoughts about later on trying to emulate the 2A03 hardware directly, so that I possibly could put pd on a board with a fast CPU (maybe a SuperH) that would be small enough to fit in a NES cart. Then I could use pd as just an interpreter between the user and the real live sound hardware.
-
c0dav0x
ok, it looks like I wasn't using the startup/path lists properly... the main problem was that I was using '-lib zexy -lib sigpack' on their own lines in the Binaries section, instead of the Flags section in Startup..... sigh
-
c0dav0x
arghh now I can't load the sIgpAck libraries...
what exactly do I need in my path and/or startup lists for zexy and sigpack?sigpack readme offers no clues...
zexy has a readme and says to add the line "-path <mypath>/pd/externs" to my .pdrc...
first of all what's a pdrc, is that the same thing as the path list in pd file menu?
and the other thing is I don't have an "externs" directory... I've replaced 'externs' with /extra since the zexy bat file copied the files there, but it still won't load... -
c0dav0x
well I think I found out the problem. I downloaded the zexy 2.1 external for NT, which should have been fine. But some of the patches (||~, <~, >~) wouldn't copy correctly because they have characters that windows won't accept in the filename! I can get most of the zexy patches to work, but the above are the ones I really need.
I tried copying them with new filenames (lt~ and gt~), and pd will still let me place them as recognized objects, but they still won't give any output. Is there some way I can fix the external to recognize windows-compatible names for these patches, or are there equivalent patches for comparing signals?
Also I still can't load zexy from the path or startup lists - only by adding the [zexy] object (which is probably not a big deal).
-
c0dav0x
I'd like the solutions too.
Miller's book is why I was able to get started in synthesis in the first place. I've had to learn about audio signals from scratch, other than a primer course from college that laid out some of the math (which I had to take twice). Instead of going in the DSP direction, my specialty was digital logic - instruction decoders, interfaces, memory design, FSM's and such, so I'm still in a learning phase for almost all of the synthesis process. It's kind of hard to make myself do homework when nearly half the time I don't even know if I'm doing it right, so the solutions would really help.
-
c0dav0x
Also - I know it sees /./pd/zexy/zexy.pd, otherwise there's no way it would have known what a [zexy] object is. So why can't it find the dll file that's in the same directory?
-
c0dav0x
I can't even get zexy to run, it always says "can't load library". Right now in my startup section I've got:
-path C:/Documents and Settings/admin/Desktop/pd/zexy/
-lib C:/Documents and Settings/admin/Desktop/pd/zexy/zexy.dllThe only way I can load it is by creating a [zexy] object, and then the main window will print the message from zexy, and then I can place Zexy objects - however, they don't give any output or do anything, so I think I still don't have it working right. It also crashes pd when I try to send "help" to the [zexy] object.
I'm usung pd version .40-2 and trying to use zexy version 2.1, will those work together?
-
c0dav0x
I've been playing around with this. There were some nasty partials that I took out with a key-following [lop~], and tuning the cutoff more precisely I can get the sound I'm looking for (the Nintendo 2A03's triangle wave with its metallic groan at bass frequencies).
One thing I noticed was that the sound would "break" past 2757 Hz, which I noticed was about 1/16 of the 44.1k sampling rate. I realized it was due to the multiplied phasor (set to 16 at the time) trying to generate a signal faster than the sampling rate. If I adjusted multiplier down to 8 or 4, then I could sweep up to 1/8 or 1/4 of the sampling rate before getting breakup. If there's no easy way around this I can probably use a "real" triangle with different filtering as a second voice to get the higher ranges.
The other thing I've noticed is that if I sweep the fund. frequency in mid or high ranges (at any multiplier setting) there's a noticeable "waw" like when you tune an old radio, I'm not sure what that is or how to get rid of it. I've often heard it on old arcade sound devices, but the 2A03 didn't do this. Could it be foldover from the multiplied phasor generating over the nyquist frequency?