Toggle navigation

Flow 2 Adding Content to Flow+

Version 1.0

Scope of this document is to show how to add libraries in the Flow+ application by creating manually the required JSON data.

The process of adding content to Flow+ does not require any development skills, since Flow+ is just using external files to show its content.

Those files are in JSON format.

When you purchase the professional version you will already receive tons of data that you can reuse in the process of building new libraries.

The process can be split into the following steps:

  1. Create the library folder structure
  2. Create the vendor data
  3. Create the folder data
  4. Create the instrument data
  5. Create the library data
  6. Create the track data
  7. Create the expression map data

The technical documentation of the JSON data model can be found in this document.

 

Liked it? Take a second to support on Patreon!

The beast approach for building new content is that you first create a separate folder which will contain all the data of your new library and then paste this content in the standard data folder of Flow+

This way you have all the data of your library always available for one of the following use cases:

  • you want to build a minimal template so you need to copy only the data of a specific library
  • you have just downloaded a new version of Flow and you need to add again the data of your added libraries

The folder structure you need to create is the same of the folders that you will find in the “data by library” folder inside the template product you have purchased.

The best way to create the new folder structure is to just copy one of those and remove all the content of the subfolders.

In the end your folder will have to look like this, in this case SARO is the code for Spitfire Abbey Road One:

 

The first data object to add in your folder is the vendor object inside the vendors folder.

Move to the Flow+ data and search for the right object if it already exists, otherwise create it.

In this example, since SARO is a Spitfire Audio library we will copy the file Spitfire Audio-v.json which is already part of the Flow+ data.

If you need to create a new vendor object you need to map the new presets in the generic remote for flow-1-out

Spitfire Audio-v.json

{
    "SA": {
        "id": "SA",
        "name": "Spitfire Audio",
        "order": 10,
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 6,
                "value1": 120,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "FILTER_NOT": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 6,
                "value1": 118,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "HIDE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 6,
                "value1": 119,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

Next data object to add is the one related to the folders that are part of the Cubase template.

In our case we need to add in Flow+ all the folders that contains any midi track that is part of our library.

Supposing that we we just want to add one track for the moment and the track looks like this:

Then we will need to add all the parent folders

  • Brass
    • Brass Family
      • Brass Family High

This can also be deducted from the name of the track which has the prefix (bfh)

Navigate in the Flow+ data, search for those folders which of course already exist, and copy them inside the “folder” folder of your library

Below the content of the data added.

If you need to create a new folder object you need to map the new presets in the generic remote for flow-1-out

(b)-f.json

{
    "(b)": {
        "id": "(b)",
        "sectionRef": "BRASS",
        "typeRef": null,
        "groupRef": null,
        "order": "400000",
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 4,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "EXPAND": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 1,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "FILTER_NOT": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 2,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "HIDE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 3,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "COLLAPSE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 0,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

(bf)-f.json

{
    "(bf)": {
        "id": "(bf)",
        "sectionRef": "BRASS",
        "typeRef": "FAMILY",
        "groupRef": null,
        "order": "402000",
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 29,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "EXPAND": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 26,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "FILTER_NOT": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 27,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "HIDE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 28,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "COLLAPSE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 25,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

(bfh)-f.json

{
    "(bfh)": {
        "id": "(bfh)",
        "sectionRef": "BRASS",
        "typeRef": "FAMILY",
        "groupRef": "HIGH",
        "order": "402010",
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 34,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "EXPAND": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 31,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "FILTER_NOT": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 32,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "HIDE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 33,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "COLLAPSE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 1,
                "value1": 30,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

Next content object is the instrument data object.

You first need to identify all the instruments that are part of your library and then copy those from the Flow+ library or create them if they do not exist yet.

For this exercise we will add the horn instrument which is linked to the midi track we are working on. Of course you should do this for all the instruments of all the midi tracks that are part of your library.

If you need to create a new instrument object you need to map the new presets in the generic remote for flow-1-out

b.Horn-i.json

{
    "b.Horn": {
        "id": "b.Horn",
        "name": "Horn",
        "sectionRef": "BRASS",
        "order": "40040",
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 3,
                "value1": 108,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "FILTER_NOT": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 3,
                "value1": 106,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "HIDE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 3,
                "value1": 107,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

For the library object you will need to create a new file, since this does not exist in the Flow+ data being a new library that you are adding.

Instead of creating a new one from scratch it might be simpler to copy any library data object from Flow+ data and modify it, so that you will not have to write the JSON format and you will surely avoid to have syntax errors.

Adding the library object requires some work on Cubase,

  • Create the logical presets to show, hide and filter the object
  • Adapt the generic remote
  • Copy in the library json object the settings of the generic remote to trigger the logical presets

Setting the first attributes is pretty simple, just make sure to have all the instruments and Cubase track in the parameters when you finished.

The library won’t show up in Flow till there is not at least one instrument and one Cubase track object added in the list parameters

If you need to create a new library object you need to map the new presets in the generic remote for flow-1-out

5.1. Quick Controls

The Quick controls array contains the mapping to 8 faders as defined in Cubase.

In Flow template the 8 faders are mapped to the following CC:

  • 1 (modulation)
  • 11 (expression)
  • 21 (vibrato)
  • 10 (pan)
  • 7 (volume)
  • 22 (mic)
  • 23 (mic)
  • 24 (mic)

Of course you can change this as you like.

The last three are typically mapped to microphones and you should check which microphones are used in your library.

In our example

  • 22 = MIX 1
  • 23 = MIX 2
  • 24 = VINTAGE 1

Copy all the needed faders from the Flow+ data into the library folder, and if some are missing you will need to create them first.

CC1_DYNAMICS-f.json

{
    "CC1_DYNAMICS": {
        "id": "CC1_DYNAMICS",
        "name": "Dynamics",
        "cc": 1,
        "defaultValue": 1.0,
        "isMicrophone": false,
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

5.2. Logical Presets

The library object requires you to create three logical presets:

  • SHOW: showing each track linked to this library
  • HIDE: hiding each track linked to this library
  • FILTER_NOT: hiding each track which is not linked to this library

In the Flow template there is a set of templates that you can use to create those logical presets, where you will need to change the parameter 1 accordingly to the name of your library

It is recommended to copy all the presets that you create in a custom library outside the Flow  one, so that you will avoid losing them in case of updating to a new version of Flow.

 

SHOW Logical Preset

 

HIDE Logical preset

 

FILTER NOT logical preset

5.3. Generic Remote

Finally you need to change the Generic Remote linked to flow-1-out and add three new lines that corresponds to those new presets.

When choosing the channel and value to use, choose always to work with channel 15 to avoid clashes with Flow upgrade.

Finally you will need to come back to the JSON library object and add those channel and value 1 settings in the associated midi events.

Be aware that you will need to do again this mapping in the generic remote next time that you will upgrade Flow and load its standard generic remote

 

SARO-l.json

{
    "SARO": {
        "id": "SARO",
        "name": "Spitfire Abbey Road One",
        "vendorRef": "SA",
        "sectionRef": "ORCHESTRA",
        "order": "20100019",
        "instrumentsRef": ["b.Horn"],
        "cubaseTrackRef": ["01_004_103"],
        "quickControls": [{
                "order": 1,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC1_DYNAMICS"
            }, {
                "order": 2,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC11_EXPRESSION"
            }, {
                "order": 3,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC21_VIBRATO"
            }, {
                "order": 4,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC10_PAN"
            }, {
                "order": 5,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC7_VOLUME"
            }, {
                "order": 6,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC22M_MIX_1"
            }, {
                "order": 7,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC23M_MIX2"
            }, {
                "order": 8,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com",
                "faderRef": "CC24M_VINTAGE_1"
            }],
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 15,
                "value1": 0,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "FILTER_NOT": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 15,
                "value1": 2,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            },
            "HIDE": {
                "host": "midi",
                "port": "flow1",
                "address": "KEY_PRESSURE",
                "channel": 15,
                "value1": 1,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

Next content to create is the track data.

You will need to create one track file for each of the midi track that you have in your library.

As for the library, instead of starting from scratch, is a better idea to copy an existing track and start modifying it.

The identifier of the track needs to be equal to the value of the midi sends 1 declared in Cubase.

Use a channel different from the first one, 15 and 16 are reserved. Recommended to start with 14 to avoid clashing with Flow+ which starts from channel 1.

Make sure you add this identifier inside the cubaseTrackRef parameter of your library

Setting the attributes micsRef and fadersRef is similar to what we have done for the quick controls, copy the faders from the Flow+ data and reference them by id

In the track you will need to define one single midi event which is the show one, the process is similar to what explained for the library, but the generic remote to be used is the one linked to flow-2-out

 

When you create a new track object you need to map the new presets in the generic remote for flow-2-out

(bfh).SARO Horns-t.json

{
    "01_004_103": {
        "id": "SARO_Horns",
        "name": " SARO Horns",
        "dawTrackName": "(bfh).SARO Horns",
        "libraryRef": "SARO",
        "folderRef": "(bfh)",
        "order": "401010010",
        "micsRef": ["CC22M_MIX_1", "CC23M_MIX2", "CC24M_VINTAGE_1"],
        "fadersRef": ["CC1_DYNAMICS", "CC11_EXPRESSION", "CC17_RELEASE", "CC18_TIGHTNESS", "CC19_REVERB", "CC7_VOLUME"],
        "instrumentsRef": ["b.Horn"],
        "midiEvents": {
            "SHOW": {
                "host": "midi",
                "port": "flow2",
                "address": "NOTE",
                "channel": 2,
                "value1": 21,
                "version": "1.0.0",
                "copyright": "www.artificialharmonics.com"
            }
        },
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

The last object you need to create is the expression map. For this object, like for the others, just go in the Flow+ data and copy an existing one to avoid creating it from scratch.

The creation of the expression map JSON object requires that you have already created an expression map in Cubase.

The mapping is quite simple, each slot represent one slot in the expression map.

If you want to save time you can put dummy content in the output mapping which is just used to show in Flow + how the articulation is mapped in Cubase. Will become optional.

The articulations need to be reference via id, and they can be found in the articulations folder of Flow+ data.

The professional version of Flow has already a thousand of articulations created and ready to be used. Eventually if one is missing, you will need to create it and add it to the articulations folder.

 

SWELL_LONG-a.json

{
    "SWELL_LONG": {
        "id": "SWELL_LONG",
        "shortName": "Swell L",
        "longName": "Swell Long",
        "order": "01200000",
        "type": "Direction",
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

SARO Horns-x.json

{
    "SARO_Horns": {
        "id": "SARO_Horns",
        "name": "SARO Horns",
        "slots": [{
                "remote": 0,
                "color": 11,
                "outputMapping": [{
                        "type": "Note-On",
                        "data1": "C-2",
                        "data2": "120"
                    }],
                "articulationRef": "LONG"
            }, {
                "remote": 1,
                "color": 7,
                "outputMapping": [{
                        "type": "Note-On",
                        "data1": "F#-2",
                        "data2": "120"
                    }],
                "articulationRef": "SWELL_LONG"
            }],
        "version": "1.0.0",
        "copyright": "www.artificialharmonics.com"
    }
}

 

You can now copy the content of the library you have created inside the “data” folder of Flow+, and then stop and run again Flow+