A Christmas no-brainer

All Rhino commercial presets for $25
(instead of $181).


Thanks for being a loyal user of our products. We hope you will use them to make wonderful music in 2012 and all the years to come…

Dear Friends,
We love Christmas.
We receive lots of wonderful presents.
We hope you do too.

Now is our time to exchange…


86% off


Rhino commercial presets bundle

Click here to get it now !

This offer is valid until Dec. 31st, 2011 and includes the following banks (1728 presets):
Azul / Basic FM / Trancemissions / Bread & Butter / Digital Synth / Classic Oberheim / Classic Moog / Classic VL / Grain Field / Textures / Morpheus / Eclectic Analog / Wildlife / Modern Analog Designs / Nature & Industry

Zen: now for x64….

Zen 1.6.5 has just been released, and is now available for x64.

Other changes below:
* Store results of previous plugins scans
* Offer to blacklist any plugins that crashed the previous scan
* Fixed random crashes when deleting a user-defined synth
* Crashes when attempting to load ReaPlugs, or Polyvalens VL1.
* Now uses SQLite 3.7.7.1 and FTS4

As always, Zen can be downloaded here.

Accessing the Zen database – for plugin developers

With the latest version of Zen using fxp for presets storage, it is now possible (and very easy) for plugin developers to directly query the Zen database to find and load presets for their synth.

Here is some basic information to get you started:

1. The Zen data folder.
This is where the database and presets are stored. In order to find it, look up the zen.homePath entry in /Documents and Settings//Application Data/Big Tick/zen/zen.properties. If this entry is not present, the default folder is /Documents and Settings//Application Data/Big Tick/zen

2. Presets
Presets are referenced by a numeric number: the preset ID. You can find the data for preset ID x in the presets subfolder of the Zen data folder, under the name .fxp.

3. The Zen database
It is a sqlite database located in the Zen folder, and named zendb.s3db
Inside the database you will find all the metadata for the presets. The most useful tables are:

ITEMS: the list of presets.
ATTRIBUTES: the list of tags.
ATTRIBUTES_MAP: the mapping of tags to presets.
SYNTHS: the list of synths.

I suggest you load the database in an SQLITE tool and explore around, or ask me if you want more information. As an example, here is a simple query that returns the first 10 presets for ACE:

select I.ITEM_ID, I.ITEM_NAME from ITEMS I, SYNTHS S
where S.FXID='acEU'
and I.SYNTH_ID = S.ATTRIBUTE_ID
order by ITEM_NAME limit 10

ITEM_ID ITEM_NAME
136 Aenima
144 BT 7th scraper (mw+pb+v
145 BT analog pad
4 BT beloved, too (vel)
146 BT broad’n smooth (mw)
147 BT broken shimmer (mw+p”
148 BT butter
149 BT butterfly (mw+vel)
150 BT calm agressor (mw)
151 BT cankered (mw+vel)

another one, to list the tags associated with preset 148 “BT butter”:
select AM.ATTRIBUTE_ID, A.ATTRIBUTE_NAME from ATTRIBUTES_MAP AM, ATTRIBUTES A
where AM.ITEM_ID=148
and AM.ATTRIBUTE_ID=A.ATTRIBUTE_ID

ATTRIBUTE_ID ATTRIBUTE_NAME
8 Pad
23 ACE
35 BigTone
20001 New
20003 Mine (public)

As you can see, this is a Pad by BigTone, for plugin ACE.

Rhino|CM add-on

Baby Rhino is 1 year old ! To celebrate the first anniversary of Rhino|CM, here is a free add-on for Computer Music readers: 130 Mb of new waveforms, taken from the best Rhino commercial libraries. Samples from Moog and Oberheim analog synths, acoustic instruments and synthesized tones bring new sonic flavors to the Rhino|CM engine.

The waveforms can be downloaded here.

New Rhino bank: WildLife

WILDLIFE is a new Rhino soundbank by Sound Designer extraordinaire Daniel Stawczyk (aka STATUS).
It features 128 presets, mostly industrial, gritty leads, and ambient textures – complete with user control assignments for expressive playing.

The presets can be previewed and purchased individually through Zen. Alternatively, you can listen to an audio demo here.

1.6 beta 3 – one small step, one giant leap

I’ve just released Zen 1.6 public beta 3. Here is the mandatory changelog. The first point marks a turning point in the history of releases, lifting up one of the most complained-about limitations of Zen.

Enjoy !

Version 1.6 beta 3
——————
* All users can now activate any plugin locally. For designers, the first preset uploaded for a local plugin makes this plugin public
* Replaced “hidden” and “favorites” tags by icons
* Add presets comments to the ZenCore engine
* Better design for the presets sort option
* Add shopping cart icon
* Zen will now silently ignore duplicate warnings happening within a few ms
* Add mousewheel on preset name to scroll through presets
* Fixed crash when trying to apply a tag without first selecting a preset
* Fixed bug when using full-text with ‘ character
* Fixed (for the last time:)) the problem with Zen not exiting properly

Version 1.6 beta 2
——————
* User ratings are not lost when uploading a preset.
* Added option to clear the stored path for a plugin
* ‘untagged’ attribute was sometimes displayed incorrectly
* Fixed a rogue entry in the synths list
* Fixed a rare bug where uploads would be stuck in a loop
* Fixed another bug where Zen would stay running indefinitely in the background
* Changed installer system on windows – it will prompt for update, or fresh installation

Version 1.6 beta 1
——————
* Drastic (x10) performance improvements in the search queries.
* Added button to clear the current search criteria
* Add presets rating
* Add search results sort options: by ratings + name, by ratings + date, by name, by date
* Add Volume control
* Replaced some tags with icons
* Fixed a rare bug where downloads would be stuck in a loop
* Fixed rogue tag “JamesXIIIC” appearing in the synths list

Zen 1.5.3 update

Here is a new version for the universal presets manager. Don’t forget to check the roadmap to see what’s coming next…

Zen 1.5.3 New features

  • Added an option to extract/expand tags list with no matches in the current list
  • Extended virtual banks slots to 127
  • Added a dot indicator to identify untagged presets
  • Added support for Audjoo Helix
  • Added infobox messages and credits in the config page

Zen 1.5.3 Bug fixes

  • Fixed tooltip message for the previous preset button
  • Fixed – sometimes tagging a preset would not be uploaded properly
  • reduced CPU usage with UI refreshes
  • fixed bug with uploading icon (would keep flashing after uploads were finished)


The tags list expand/contract feature is accessed through the down/up pointing arrows at the left of the list titles. Clicking the down arrow expands the list, so that all tags (including the one with no matching presets) are displayed. Clicking the up arrow contracts the list, showing only the relevant tags.


The dot next to some presets indicates that the preset hasn’t been tagged yet. A preset is considered untagged until at least one tag from the instruments category is assigned to it.

Zen 1.5 released

Zen 1.5 is finally out ! Download it here….

Here is the changelog:

  • Major code rewrite, separating Zen into a core library (ZenCore) and the Zen Browser itself
  • Added midi-controlled “virtual bank” slots, where presets from different vstis can be stored
  • Replaced tooltips with a contextual help box
  • Added support for Zen-aware plugins, including assets management
  • Added ‘hidden’ flag to permanently hide presets from search results
  • Fixed various UI refresh issues
  • Fixed crashes when duplicating instances in Ableton Live
  • Fixed button for creating own tags on OSX
  • Invalid designer keys are now rejected immediately
  • Optimized dynamic memory allocations
  • Changes for 64bits compatibility

The biggest change was the creation of a core library, mostly because I am starting to have requests from companies who want to license the Zen engine (database searches + online synchronization) to build their own preset browser.

The virtual banks feature is a nice new addition, very useful for live use, where loading a new vsti, with a given preset, can now be fully automated with a single program change. Zen has 32 slots, corresponding to Midi programs 01..32. To assign a preset to a slot, just drag it from the results list. The video below shows the basic usage.

Tooltips have gone, and are replaced by a context box which is much more user-friendly, and can also be used to display information messages.

The designers keys system has changed, so please contact me if you need a new key – the older ones won’t work any more.

Zen & Virtual Banks

People find new uses for Zen every day. This is great ! And they come back with enhancement requests, which is even better.

The “virtual banks” feature is now completed, and it really rocks – now you can make your own banks of heterogeneous presets from different synths, and automate the changes using MIDI Program Changes. I can definitely see how useful this is going to be for live use.

Now, until this change is released in Zen 1.5… please keep those requests coming !

Zen Vst Extensions – take 2

Here is another take on the extensions API – I am already supporting this in Rhino, so I am confident it is not too difficult to implement this in a plugin.

As explained before, Zen-aware plugins inherit from ZenAwareAudioFX instead of AudioEffectX. They can then exchange information about the current preset with the host, provided they implement the methods described below.
For the sake of simplicity, there are 3 different logical groups of extensions:

Presets comments

Many plugins have a text zone providing textual information about the preset, for instance playing tips. It would be useful to retrieve this information in Zen, so that full-text search can apply to the preset comments as well. The comments are exposed to the host through the following methods:

virtual VstInt32 zenGetPresetCommentsSize() const;
virtual void zenGetPresetComments(char* comment) const;

The host first calls zenGetPresetCommentsSize to ask the size of the comment area. It then allocates memory accordingly (to store the comments) and calls zenGetPresetComments, which writes the comments into the provided area. If the comment spans over several lines, they are separated by a \r (0×0A) character.

User control assignments

A lot of plugins provide preset-dependent “performance” parameters, that allow to quickly access the most useful controls of a preset. The following 2 methods are used to export these assignments to the host.

virtual VstInt32 zenGetNumberOfUserControls() const;
virtual VstInt32 zenGetDefaultUserControlAssignment(unsigned int ctrlIdx) const;

The host will first call zenGetNumberOfUserControls to ask how many performance parameters the plugin provides. Then it will call zenGetDefaultUserControlAssignment for each performance parameter. This last method returns the ID of the VST parameter associated to the performance control.

External files (aka “assets”)

These extensions are really useful for plugins relying on external files, such as samples. Remember, Zen distributes presets to many users, so if a preset requires a particular sample file, we need a way to somehow “attach” the sample to the preset, and distribute the sample too. This is the role of the following “assets” extensions.

Before going into the details of the extensions, here are some general remarks about assets:

  • Every plugin has its own way to identify assets. Zen uses a char[256] to store asset IDs in a plugin-independent form. So if your plugin uses numeric IDs for assets, you can use itoa() or equivalent to fill in the asset name.
  • Imagine a plugin playing large samples, using disk streaming. It would not be efficient to send these samples to the host by loading them entirely into memory. So Zen uses a “chunks” mechanism to exchange assets, where large data is split into smaller parts. The maximum chunk size is 1 Mb. So if you use a 2.5Mb sample, Zen will ask you for 3 chunks. You will be free to split your data in any way you want, as long as no part is bigger than 1Mb.

virtual unsigned int zenGetNumberOfAssets() const ;This method returns the number of assets required for the current preset.

virtual Zen::ZenErrorCode zenGetAssetInformation(unsigned int assetIdx, Zen::ZenAssetInformation* assetInfo) const;When Zen calls this method, the plugin fills an assetInfo structure with information about the nth asset in the current preset:
struct {
const char *assetName;
unsigned int totalSize;
unsigned int nChunks;
bool dontPersist;
} ZenAssetInformation;

  • assetName is used to identify the asset.
  • totalSize is the total size of the asset (in our example above, 2.5M).
  • nChunks is the number of chunks the plugin wants to use (in our example, it has to be 3 or more).
  • Finally, you can ignore the dontPersist flag for now

virtual Zen::ZenErrorCode zenGetAssetDataChunkStart(unsigned int assetIdx);
virtual Zen::ZenErrorCode zenGetAssetDataChunk(unsigned int assetIdx, Zen::ZenAssetDataChunk* chunkData);
virtual Zen::ZenErrorCode zenGetAssetDataChunkEnd(unsigned int assetIdx);

Zen will call these 3 methods in sequence, for each chunk. zenGetAssetDataChunkStart and zenGetAssetDataChunkEnd are convenience methods, in case the plugin would need to do something before (and after) the chunk is queried. zenGetAssetDataChunk is where the plugin gives the chunk data to the host., using this structure:
struct {
const char* assetName;
unsigned int chunkIndex;
unsigned int chunkSize;
void* chunkData;
} ZenAssetDataChunk;

Zen calls zenGetAssetDataChunk with the chunkIndex value set to the number of the chunk it wants. The plugin simply needs to fill the remaining members.

So, to summarize: regarding assets, your plugin needs to implement the following 3 methods:

  • zenGetNumberOfAssets() to tell the host how many assets are required for the current preset.
  • zenGetAssetInformation() to give details about the nth asset.
  • zenGetAssetDataChunk() (and optionally, the associated begin() and end() methods) to fill a chunk of a given asset.

Once this is done, ZenAwareAudioFX gives you nice little methods that you can use to retrieve your assets from the host:

typedef void (*ZenEnumerateCallback)(const char* assetName, void* userData);
Zen::ZenErrorCode zenEnumerateAssets(Zen::ZenEnumerateCallback callback, void* userData);
Is used to list all the assets that Zen manages for your plugin. Zen will call the provided callback, once per asset, with the assetName.

Zen::ZenErrorCode zenQueryAssetInformation(Zen::ZenAssetInformation *info);This method asks the host about an asset identified by its name. The ZenAssetInformation structure is the same as above, but this time:

  • You fill in the assetName member to tell the host which asset you are interested in
  • Zen replies with information about the asset (size, number of chunks). If Zen sets the dontPersist member to true, it means that the plugin should not save the asset data to disk.

Zen::ZenErrorCode zenQueryAssetDataChunk(Zen::ZenAssetDataChunk* data);retrieves a chunk from Zen. The ZenAssetDataChunk structure is the same as above, you just need to fill in the assetName and chunkIndex members, and Zen will fill chunkSize and chunkData.

So this is the last thing you have to implement: whenever your Zen-hosted plugin needs an asset and can’t find it on the system, it should use zenQueryAssetInformation and zenQueryAssetDataChunk to retrieve the missing asset data from the host.

To be complete, here is the Zen::ZenErrorCode enum:
enum {
ZEN_NO_ERROR,
ZEN_UNKNOWN_ERROR,
ZEN_ASSET_NOT_FOUND_ERROR,
ZEN_OUT_OF_MEMORY_ERROR,
ZEN_METHOD_UNSUPPORTED_ERROR,
} ZenErrorCode;

Testing it

Finally, if you have added the extensions to your plugin, how do you test if it is working fine ? That’s easy:

  • Load your plugin in Zen, and import a preset.
  • Check the asset chunks are properly imported (they are stored in the Zen folder, under assets/[synth ID])
  • Now move away the original sample files from your system, and relaunch Zen
  • Select your preset in Zen, and marvel as:
    • Zen instantiates your plugin and sends the preset data.
    • Your plugin doesn’t find the associated sample on the system, and asks the host for help.
    • Zen picks the asset chunks and sends them to the plugin, who uses them to construct the missing asset and flawlessly play the preset.
  • What users say

    "If there is love at first sound, this is Rhino! I want it!" - dhrose, USA
  • Register

  • Welcome !

    Welcome to Big Tick web site ! Please login or register.

    Registration is free, and will enable you to download additional instruments and effects.