Very Unofficial C700 VST Guide

A Very Unofficial Guide to the C700 VST

by zyzzyvaproject, July 2019

DL:

http://picopicose.com/software.html 

Official Manual:

http://picopicose.com/how_to_use_the_c700_eng.html 

Grey text designates version-exclusive features

Blue text designates items that are still being researched

Possible Plug-in Versions:

This is the current layout of the mac AU plugin.

Image result for c700 vst mac
Image result for c700 vst mac

Full version–the Mac 64-bit .vst uses this layout. See below for .vst cautions:

Issues with the Mac 64-bit .vst:

There’s at least one major issue with the 64-bit .vst version of the mac plug-in–it doesn’t load samples properly–or, at least, reliably. A sample may load an alternate version of itself, or a blank or noise sample. It’s unclear what causes this issue, which is a shame as the .vst version of the plugin has one serious piece of functionality that’s missing from AU–it auto-loads loop points previously added to a sample.

The added functionality of the .vst version isn’t enough to make up for this issue. I haven’t been able to discern how the PMOD (portamento) and Glide settings function as of yet. Losing noise and Khaos! Functionality is frustrating–it may be possible to use the Khaos! setting on the vst version to do exploratory sound design then export any waveforms that seem appropriate as samples to be loaded in the AU version.

I don’t know whether this same issue also appears on the windows .vst version or the 32-bit mac .vst, as I’m unable to load these in my DAW (FL Studio).

Plugin Options:

general_settings
general_settings

MIDI Channels:

1-16 indicate incoming MIDI channels. Click on a channel number to see the currently loaded sample for that channel.

The number above the MIDI channel shows the max polyphony currently used by the channel (will update as played)

Vib Depth:

Sets Vibrato Depth. This is a global variable.

Range: 1.000 to 15.000

Vib Rate:

Sets Vibrato Rate. This is a global variable.

Range: 0.010 to 35.000

Poly:

Global. Sets total polyphony (Use ‘8’ for most authentic SNES)

Range: 1 to 16

Bend Range:

Sets pitch bend range, not sure how helpful this is as I haven’t been able to use MIDI controllers to trigger pitch bend.

Range: 1 to 24

Engine:

{Missing from the AU version of the plugin}

VoiceAlloc:

{Missing from the AU version of the plugin}

Velocity Curve:

This is a global variable governing the attack velocity curve of sounds. 

  1. There’s constant, quadratic curve, and linear options here. 

  2. Constant seems to be the optimal choice if one wants to emphasize percussive sounds, as other options seem to dull the initial attack of sounds.

  3. Linear and quadratic can help dull initial ‘clicking’ effect of samples, but also result in losing some punch of the initial transient.

  4. Note this seems to govern how the chip emulation itself generates sound, and is separate from the attack value in the envelope generator.

Multi Bank/Bank Settings:

This is used to include multiple samples within the same channel, useful for drum kits and different samples of the same instrument over different pitch ranges.

To play a sample in a multi-bank, select any sample within the multi-bank in that channel of C700, and check the corresponding ‘Multi-bank’ box. Each sample can be set to one multi-bank at a time.

gui_image
gui_image

High Key/Low Key:

This sets the high and low key range that will trigger this sample when the corresponding multi-bank box is on. 

A couple cautions. If multiple samples within the same multi-bank cover the same MIDI key (or if no sample is designated for a MIDI key), C700 will play the sample with the lowest sample number (located above the waveform display, to the left of the sample name). 

Because of this it’s highly recommended to use a multi-bank other than multi-bank A, since this is the default multi-bank for loaded samples and may cause unintended side-effects when working with a large group of samples.

It also looks like C700 may not register that a sample has been added to a multi-bank unless both high and low key values are manually typed in.

Root Key:

Sets the MIDI key# associated with a sample’s pitch (i.e., 60 for C4)

  • It looks as though ANY sample raised two octaves or more above the root pitch stops re-sampling normally–with the note exactly two octaves about the root note being silent (i.e., 84 or C6 if root is C4), and higher notes beginning from the bottom. This doesn’t appear to be an issue when descending. 

  • When given the opportunity, use a note within two octaves of the highest note in that instrument’s part.

Loop Point:

Sets the loop point. Samples loop from the loop point through the end of the sample. Note that loop point can only be set in multiples of 16 (for best results, save your samples as a 16-bit version of themselves.)

The arrows next to the loop point counter allow you to scroll through the waveform by single instances of 16.

Sample will only loop when the ‘Loop’ box is checked.

Sample Rate:

Set the sample rate used to process the waveform.

  • There is an ‘Auto’ Button, however it’s unclear how this calculation works (it doesn’t appear to set the sample rate from that used by the .wav file.)

  • Note that the pitch of a sample will change if you enter a different sample rate here than the one used in the .wav file. You can use an audio editor to save a .wav file at a different sample rate. Be sure to choose ‘resample’ when doing so in order to preserve the .wav file’s pitch.

Some notes on sample rate:

Sample rate designates the number of samples taken of a piece of digital audio per second. A sample rate higher than double the highest frequency of sound (the ‘Nyquist Frequency’) included in a piece of audio is needed in order to avoid aliasing. Aliasing is a form of digital distortion that may cause a high-frequency signal to appear lower in pitch. 

44.1kHz tends to be the industry standard (it’s what’s used for CD quality audio), but the SNES uses a lower sample rate, maxing out at 32kHz.

A 32kHz frequency allows pitches up to 16kHz without aliasing. Given A = 440Hz, this allows all MIDI standard MIDI notes to be played without aliasing (providing they don’t contain higher-frequency overtones), as MIDI note 127 is approx 13kHz. C8 (the highest note on a piano keyboard, and MIDI note 108) is 4,186.01 Hz. (Note that these base frequencies will still usually produce an overtone series of higher frequencies that may still cause aliasing.)

In researching actual SNES samples, it looks like lower sample rates are used for instruments that will only play at a lower pitch (in some cases, I’ve found sample rates as low as 261Hz). I assume that this is a way of making memory usage more efficient on the SNES, since a bass instrument can afford to have a much lower sample-rate due to its lower Nyquist Frequency.

Priority Note:

{Missing from the AU version of the plugin}

gui_image
gui_image

Echo:

This enables the echo/delay settings shown at the bottom of plugin for this sample (note this applies to all instances of this sample, not just the instance in one MIDI channel.)

PMOD:

I believe this activates portamento for this sample. Note with PMOD on chords will not play properly.

{Missing from the AU version of the plugin}

Noise:

Converts this sample number into a noise channel. This doesn’t affect the loaded waveform, and seems to produce the same note at each MIDI note regardless of what sample is loaded.

{Missing from the AU version of the plugin}

Mono:

While on, only one note can be played on this channel simultaneously. 

{Missing from the AU version of the plugin}

Glide:

Turns on glide for this sample. I haven’t noticed an appreciable difference with glide on.

{Missing from the AU version of the plugin}

Khaos!

This generates a random sample and sample name for this sample number–note this will overwrite the current sample under this sample number.

{Missing from the AU version of the plugin}

Volume:

Used to set volume (by L/R channel) for this sample.

Range: -128 to 127

AR/DR/SL/SR1/SR2:

Envelope settings. Note ‘0’ is the maximum here.

AR: Attack. Range 0 to 15

DR: Decay. Range 0 to 7

SL: Sustain. Range 0 to 7

SR: Release. Range 0 to 31

SR1/2: Unclear–from context, this may be the amount/level of release; according to the manual this triggers on note end. {Missing from the AU version of the plugin}

Enable Release:

{Missing from the AU version of the plugin}

gui_image
gui_image

RAM Simulation:

Shows the amount of memory currently used–64kB is the total available on actual SNES hardware, but limiting to ~40kB is ideal

Echo Settings:

These settings are global across all MIDI channels.

echo_settings
echo_settings

Main:

Master dry volume. Note this still affects channel volume even if ‘echo’ is not checked for that channel. Separate right and left channels.

Range: -128 to 127

Echo:

Master wet echo volume, separate right and left channels.

Range: -128 to 127

Delay Time:

Echo length.

Range: 0ms to 240ms

Feedback:

Sets level of echo feedback. Echo feedback is fed back into echo after passing through the FIR filter.

{‘Set Recorder’ button missing from the AU version of the plugin}

Range: -128 to 127

Copy:

This copies the filter settings in (I believe) hex format. Note there’s no paste option here.

{Not included in the .vst version of the plugin}

Filter:

These filter only the wet output of the echo.

The 8 numbers displayed here are the coefficients of an 8-tap FIR filter (see references and below information box.)

Range: -128 to 127

The five sliders along the bottom alter the filter coefficients to mimic different types of filters:

Slider 1: Seems to be behaving as a high-pass filter

Slider 2: Seems to be behaving as a mid-cut filter

Slider 3: Seems to be a band-cut filter for between 3k and 4k

Slider 4: Seems to be behaving as a band-cut filter for between 5k and 8k

Slider 5: Seems to be behaving as a slow low-pass filter

Values can also be manually typed into the coefficient boxes; however doing so may cause issues with the VST shell within your DAW (requires more testing, but the times I’ve done this I’ve been forced to reload the project in order to regain control of C700’s parameters.)

On the FIR Filter:

A FIR (finite impulse response) filter is a tool used in digital signal processing. The exact math required to calculate precisely how a FIR filter will operate is beyond the scope of this guide, but there will be some helpful links below.

A FIR filter uses a series of ‘taps’ (essentially a small delay)–each tap will pass the signal on to the next tap, as well as to a modulator which multiplies the signal by a given coefficient and then passes it to the output. 

As I understand it, a low-pass filter will use generally smaller positive integers as the coefficients for all taps. This will have the effect of ‘averaging’ the signal and removing higher frequencies. On the other hand, a high-pass or band-pass filter will include both positive and negative coefficients, which serve to take the difference of each other and cancel out lower frequencies in the signal. 

The filter in the SPC700 and in the C700 .vst is an 8-tap FIR filter, meaning that the echo signal runs through eight taps on its way to the output. The 8 fields correspond to the coefficients for each tap.

The default setting for the filter is 127(7F in hex)/0/0/0/0/0/0/0, this allows the signal to pass through the filter ‘unaltered’.

The max setting for slider 1 is 119/-7/-7/-7/-7/-7/-7/-7 (Slow high pass filter, ~1kHz cutoff)

The max setting for slider 2 is 111/-14/-11/-6/0/6/11/14 (Band stop filter ~2kHz)

The max setting for slider 3 is 111/-11/0/11/15/11/0/-11 (Band stop filter ~4kHz)

The max setting for slider 4 is 95/-6/27/14/-15/-14/4/6 (Band stop filter ~7.5kHz)

The max setting for slider 5 is 71/39/-7/-11/7/5/-7/-1 (Steep low pass filter, ~10kHz cutoff)

(graphs of the frequency domain for these filters available in Appendix A)

 

If you’re unsure of how to implement a specific type of filter within C700, I’d recommend either referencing the hex values of a filter used in an .spc soundtrack (you can view these in most .spc players) or by using an online FIR filter coefficient calculator (see links at the end of document for some recommendations.) 

Note that the value of a tap’s coefficient will be on a scale of -128 to 127, while on most coefficient calculators it will be on a scale of -1 to 1, so be prepared to convert between formats. Some suggestions for filter coefficients included in Appendix B

Samples:

wave_settings
wave_settings

Waveform Number/Label:

Shows currently loaded waveform number and name, can type in waveform number or use arrows to select.

While you can select a waveform by channel, note that the number/waveform relationships are global (i.e., ‘1’ always corresponds to the same waveform across all MIDI channels.)

Waveform display:

Displays the current waveform.

Top display shows the entirety of waveform, with loop point shown as a vertical yellow line.

Bottom left shows the end of the waveform, bottom right shows waveform starting from the loop point. These two displays are used to line up beginning and end points when looping a waveform.

Note that while the C700 can handle stereo .wav files, it’s unclear if stereo separation is displayed at all in this view.

Preemphasis:

Preemphasis is a technique used to preserve high-frequency signal quality while avoiding added noise (see: https://wiki.hydrogenaud.io/index.php?title=Pre-emphasis)

Keeping this on (on by default) applies a high-frequency emphasis filter.

It’s unclear whether this only applies to samples which were saved with preemphasis, or if preemphasis is applied to the sample and deemphasis is applied before playback within the plugin.

Load:

Loads samples–can load .brr, .aiff, .wav, and .spc files (possibly also .rsn and .smpl)

Note when loading a sample bank, it loads to ALL MIDI channels.

See how this interacts with loading multiple .wav type samples. See how loading multiple .spc banks interacts with loading plugin, this may be the cause of some of the startup issues I’ve had.

Save Sample:

Saves file as a .brr file (the lossy format used by the SNES) along with a related .smpl file.

If you’re going for an authentic SNES sound, it may be worth converting samples to .brr and re-loading them. Note that the .brr format also saves any settings within C700, including loop points, ADSR settings, etc. so reloading a sample from these files is largely painless.

Export:

Exports an .xi file containing all loaded samples within this bank. .xi files are the format used by FastTracker II, in case you want to use a bank within a tracker rather than a DAW.

Unload:

Unloads the current waveform. 

Additional Notes and Issues:

For the most ‘authentic’ SNES sound, use 16-bit .wav files with a maximum sample rate of 32kHz.

Note that changing the sample rate of a sample within C700 without changing the sample rate of the .wav file will cause the pitch of the sample to change. For best results, convert the .wav to 16-bit/32kHz in an audio editor. Additional options may be required to ensure the sample retains its pitch when converted this way, depending on the audio editor (for example, FL Studio’s Edison requires you to select ‘Resample’ when doing this conversion.)

As sample settings are global, altering the envelope settings for a sample in one MIDI channel will change those settings in all channels. If multiple settings for the same sample are desired, load multiple instances of that sample as separate samples within the plug-in.

I’ve had an issue where the same sample playing the same MIDI note may play at different pitches, however this seems to be caused by MIDI routing issues rather than the plugin itself.

Note that C700 cannot play a sample two octaves or higher above that sample’s given root note. When setting samples, use a root note less than two octaves below the highest note to be played by that sample.

Modulation (by note) is possible given the SPC unit, so using a DAW for modulating effects (at least, pitch, pan, slide, portamento, and vibrato) is reasonable. It might be reasonable to turn echo on/off, though I’m unsure whether changing echo params is a realistic possibility if you’re a purist about emulating the original SNES hardware..

The coefficient values for the echo filter are usually displayed as hex values on the SNES and other .spc emulation programs, you may need to convert these values if copying from another source.

In some cases, reloading the DAW/project which contains C700 may cause channel 1 to change sample to the current highest sample number loaded in the plug-in. It’s unclear what causes this, as this issue doesn’t always occur on reloading.

Unpredictable popping and clicking. A sample may pop or click during its attack. Reloading the DAW generally solves this issue. In some cases it looks as though playing either of the individual parts isn’t an issue, but playing two parts in conjunction may be. 

Currently using the ‘Used fixed size buffers’ option in FL studio, and this seems to have helped. (This may cause latency, but this is less of an issue when all sound is coming from a single plugin.)

(Will also test if having multiple instances of C700 open aids in this issue.)

For issues where popping is caused by samples being played at a higher pitch than their root note, may just use multiple samples

Additional Information and References:

The C700 .vst and the SPC700 parameters:

http://www.smwcentral.net/?p=viewthread&t=65193 (Good instructions on getting up and running with the C700)

http://emureview.ztnet.com/developerscorner/SoundCPU/spc.htm (Provides an overview of the SPC700 and explanations of some values used by the SPC700)

http://baltimorebarcams.com/eb/snes/docs/spc700/SPC.txt (Provides detailed specifications for the values used by the SPC700 sound chip)

http://baltimorebarcams.com/eb/snes/ (Overall resource on SNES romhacking including links to some of the above resources)

Sample Rates and Aliasing:

https://www.reddit.com/r/chiptunes/comments/7gw4tc/help_creating_custom_samples_for_c700_plugin_for/ (Some information on the SNES’s sampling rate)

https://forums.nesdev.com/viewtopic.php?f=12&t=14234 (some comments on audio aliasing in SNES emulations)

Echo and FIR Filter Design:

https://barrgroup.com/Embedded-Systems/How-To/Digital-Filters-FIR-IIR (General FIR filter overview)

https://www.quora.com/What-is-an-intuitive-explanation-of-FIR-filters (Helpful explanation of how FIR-filter coefficients relate to filter types.)

http://lavryengineering.com/pdfs/lavry-understanding-fir-filters.pdf (Example showing math involved in individual FIR filter calculations)

http://t-filter.engineerjs.com/ (FIR filter coefficient calculator)

https://www.arc.id.au/FilterDesign.html (FIR filter coefficient calculator)

https://www.minidsp.com/applications/advanced-tools/fir-filter-tools (software tools for FIR filter design)

General Tools:

https://www.rapidtables.com/convert/number/hex-to-decimal.html (Hexadecimal to decimal converter)

Appendix A – Frequency Response Curves for Built-in Filter Sliders:

Filter slider 1: (119/-7/-7/-7/-7/-7/-7/-7)

Filter slider 2: (111/-14/-11/-6/0/6/11/14)

Filter slider 3: (111/-11/0/11/15/11/0/-11)

Filter slider 4: (95/-6/27/14/-15/-14/4/6) 

 

Filter slider 5: (71/39/-7/-11/7/5/-7/-1)

Appendix B – Some suggestions for FIR filter coefficient settings:

In general, it’s advisable to have the coefficients for your FIR filter sum to either 0 (for high pass or band pass filters) or 127 (for low pass or band stop filters). This will keep frequencies you would like to preserve from also being cut by the filter. 

Here follows some examples of possible starting points for filter design. An application allowing for generating these plots will be available in a future version of this guide.

Low pass filter: (72,15,15,10,10,5,0,0)

Different ranges of later coefficients alter frequency responses for higher bands.

High cut filter (for removing aliasing): (0,0,0,0,0,10,60,57)

High pass filter with some boosted highs: (117,10,-117,-10,117,-60,-67,10)

Setting only a coefficient other than the first  creates a strange pattern of frequency spikes: (0,0,0,0,0,0,0,127)

Leave a Comment

Your email address will not be published. Required fields are marked *

/* add by OCEANUS */