2.0 Final
- fixed Launchpad controller (thanks danoise)
2.0 Beta 2
- Updated/Tested on Renoise 2.8 beta 8
- Handle closing of song while Cells! is running
- Fixed preferences not initialised before rendering patterns bug
- Updated the controller API and associated documentation (also added to this post)
- Updated Ohm64 support for the new controller API
- Updated Launchpad support for the new controller API (to be tested)
2.0 Beta 1.1
- Quick fix release which fixes a bug making note patterns on Renoise 2.8 beta 7
2.0 Beta 1
- Inital public release of Cells! 2.0
Cells! 2.0 is a complete rewrite of Cells! 0.9. This has been based upon further code experimentation and user feedback. However, due to the improved approach and cleaner code, it has been possible to add many more features.
Screenshot
Demo Video
Thanks to Void Pointer for kindly supplying the samples used in the demo video
Major New Features
Realtime 'Granular' Timestretch
Cells! 2.0 allows realtime timestretch in a 'granular style'. This allows full independant control of both tempo and pitch while still keeping playback syncronised to the beat. Granular timestretch applies to samples which have both a beat sync value and autoseek enabled but beat sync is disabled.
Realtime 'Slice Based' Timestretch
Similar to the 'granular' timestretch, Cells! 2.0 adds support for sliced loops with independant tempo and pitch control. Each slice will be played back at the correct time to maintain the overall tempo of the entire loop. Slice-stretch applies to samples which are sliced. The length of the cell is assigned through the beat-sync value.
Pattern 'Riff' Storage and Playback
Cells! 2.0 allows you to quickly save individual pattern tracks as riffs for use live in Cells!. The riffs are stored in compressed format within the instrument itself, so you can quickly and easily save all samples, sample mappings and riffs self-contained within a single XRNI file. Note that any Renoise instrument is be supported. This means you should be able to send note riffs to external instruments or VSTi's.
Live Jamming Mode
For specific types of samples, Cells! 2.0 allows real-time 'live jamming' playback mode. Play your samples directly with either the mouse or a physical controller for improvising over your mixes to add that extra sparkle. Individual slices from sliced loops and plain one-shot samples can be played in 'live jamming' mode.
Bidirectional Controller Support
Cells! 2.0 now has it's own native controller framework. This allows full bidirectional support for supported hardware controllers. Livid Instruments Ohm64 and Novation Launchpad (beta) are available with the inital release. If you would like further support for any additional controllers, feel free to either send them to me for development or contact me directly to work together and implement support.
[edit: controller API - 'doc/controler-api.txt]
Spoiler
Introduction / API
------------------
To implement controller support for a new device all that is required is to
create a new class definition and 'require' that file from main.lua in the
correct section.
All controller classes must implement the following functions:
To handle events received from the controller just call the same functions
within Cells! as the UI would call. A useful list of these follows:
Functions updated since beta 1.1 are marked with an *
cc[i] - Cells! channel 'i' class instances
cc[]:SelectTrack()
Selects the specified track as the current track
* cc[]:IsSelectedTrack()
Returns if the current track is the same as the specified channel
Returns true or false
cc[]:CueCell(1..#cells)
Cues the specified cell (if available)
If the cell doesn't exist, the request will silently drop
cc[]:CueStop()
Cues the stop cell for the specified channel
* cc[]:GetCue()
Returns the cue state for the specified channel
Returns true if enabled, false if disabled
cc[]:ToggleCue()
Toggles the cue state for the specified channel
* cc[]:GetMute()
Returns the mute state for the specified channel
Returns true is muted, false if unmuted
cc[]:ToggleMute()
Toggles the mute state for the specified channel
* cc[]:GetBassKill()
Returns the bass kill state for the specified channel
Returns true is enabled, false if disabled
cc[]:ToggleBassKill()
Toggles the bass kill state for the specified channel
* cc[]:GetLiveJamMode()
Returns the current state of live jam mode for the specified channel
Return true if enabled, false if disabled
* cc[]:CanLiveJamMode()
Returns if live jam mode can be enabled for the specified channel
Returns true if possible, otherwise false
cc[]:ToggleLiveJamMode()
Toggles the live jam mode for the specified channel if available.
Nothing bad will occur if this is called and it is not available.
* cc[]:GetPanning()
Returns a channel panning value
Returns 0 to 1 (0 = hard left, 1 = hard right)
cc[]:MovePanning(0..1)
Sets a panning value on a channel
0 = hard left, 1 = hard right
* cc[]:GetVolume()
Returns the volume for the specified channel
Returns from 0 to 1 (0 = -200dB (off), 1 = +3dB)
cc[]:MoveVolume(0..1)
Sets the volume for the specified channel
0 = -200dB (off), 1 = +3dB
* cm:GetEffectAmount()
Returns the current effect amount
Returns 0 = least (off), 1 = most
cm:MoveEffectAmount(0..1)
Sets the effect amount
0 = least (off), 1 = most
* cm:GetEffectState()
Returns wether effects are enabled
Return true if applied, false if disabled
cm:ToggleEffectState()
Toggles whether effects are applied
* cm:GetEffectTarget()
Returns the current effect target
Returns enum:
CELLS_ROUTING_A
CELLS_ROUTING_MASTER
CELLS_ROUTING_B
* cm:MoveEffectTarget(enum)
Sets the effect target
CELLS_ROUTING_A
CELLS_ROUTING_MASTER
CELLS_ROUTING_B
* cm:GetEffectType()
Returns the effect type
Returns enum:
CELLS_FX_FILTER
CELLS_FX_REPEAT
CELLS_FX_DELAY
CELLS_FX_FLANGER
* cm:MoveEffectType(enum)
Sets the effect type:
CELLS_FX_FILTER
CELLS_FX_REPEAT
CELLS_FX_DELAY
CELLS_FX_FLANGER
ct - Cells! Transport class instance
ct:TogglePlayState()
Toggles transport playback start/stop
ct:SetBpm(bpm, true)
Sets the transport BPM from 32 to 999 BPM.
Ensure that the second parameter is passed as true
Is master node, changes will propegate to slave nodes
No effect on slave nodes
ct:NudgeBPM(delta, apply)
Nudge the bpm by delta amount, apply is a boolean flag
delta is usually -1 or +1
apply is true when pressed, false when released (non-latching)
* ct:GetQuantizeValue()
Returns the current quantize value
Returns enum:
CELLS_QUANTIZE_HALFBEAT
CELLS_QUANTIZE_1BEAT
CELLS_QUANTIZE_2BEATS
CELLS_QUANTIZE_4BEATS
* ct:MoveQuantizeValue(enum)
Set the cell trigger quantize value:
CELLS_QUANTIZE_HALFBEAT
CELLS_QUANTIZE_1BEAT
CELLS_QUANTIZE_2BEATS
CELLS_QUANTIZE_4BEATS
MultiFX
Cells! 2.0 incorporates a simple 'DJ style' effects processor into the main UI. Effects supported are a low-pass filter, beat repeat, delay and phaser. All effects are controlled through simple common amount and rate controls. All time based effects are syncronised to the beat.
Sample Preparation Tools
Cells! 2.0 incorporates simple methods to quickly create and prepare samples for use. Both the sample editor and the sample list box contain a 'Cells! menu' from which the sample can easily assigned to a specific playback mode and length. A 'sample report' feature is also available which allows you to quickly identify how the selected sample will play within Cells! 2.0.
Additionally, Cells! 2.0 allows quick rendering of either entire patterns or specific tracks within patterns from your existing songs. Only the instrument of the first note within the pattern track will be saved. It will automatically assign the correct beat sync values even if the original song is not written at 4 LPB. All rendered samples will be contained within an 'Unsorted Cells! Renders' instrument within the song to easily allow saving of all samples to disk. This menu is present in the pattern editor context menu.
Multiplayer Networking (beta)
Cells! 2.0 has built in support for up to four machines to link together over a lan (via OSC) and keep in sync. Make huge mixes across multiple machines or get some friends around and all play together. Setup network connections on the master and ensure Renoise OSC servers are running on all machines.
Minor improvements
Variable channels from 4 to 16.
Variable cells per channel from 4 to 16.
Variable cell height and width (for touch screen usage).
Automatic sample selection option (for waveform view in the sample editor).
Safe cueing option to automatically mute cue output if set to the same as the main audio output.
Single output mode (splits the audio so master output on one channel and cue output on the other).
Slightly tweaked user interface to cater for the additional features.
Better audio routing (A/B crossfader or crossfader bypass (M))
Various other optimisations (too many to list)
Downloads
The tool can be downloaded from its tools page here.
Download the updated 2.0 beta manual here.
Acknowledgements
There are many people I wish to thank who have assisted or supported Cells! during it's development. In no particular order: taktik, dblue, danoise, void pointer, miron_man, Peter Kirn, Livid Instruments and everyone on #renoise. Sorry if I have missed anyone.
Guruh Motha Fakka is Levitating and Knows Everything About Renoise Member
Group:Normal Members
Posts:1298
Joined:02-April 03
Gender:Male
Location:Groningen, the Netherlands
Posted 06 February 2012 - 03:00 PM
Very impressive!
but I got this when I loaded a new song.
std::logic_error: 'trying to access a nil object of type 'class PatternTrack'. the object is not or no longer available.'
stack traceback:
[C]: in function 'line'
.\core/CellsChannel.lua:1102: in function 'Tick'
.\core/CellsTransport.lua:429: in function 'LineTick'
.\core/CellsTransport.lua:403: in function <.\core/CellsTransport.lua:386>
I know I'm not supposed to load a new song while cells! is running but I thought I'd mention it anyway.
"It's nice to be important, but it's more important to be nice"
'C:\Documents and Settings\User\Application Data\Renoise\V2.8.0\Scripts\Tools\com.mxb.Cells.xrnx\' failed to execute in one of its menu entry functions.
Please contact the author (Martin Bealby | mxb ([email protected])) for assistance...
.\extras/PatternRendering.lua:103: attempt to index global 'preferences' (a nil value)
stack traceback:
.\extras/PatternRendering.lua:103: in function 'render_pattern_to_sample'
.\extras/PatternRendering.lua:188: in function <.\extras/PatternRendering.lua:187>
for each pattern action (Render current pattern[...]) started from the context menu. When I open Cells! -> Preferences first, everything works fine afterwards. Is this intentional?
I get this on XP and Win7 (both 32bit) btw...
-- "on a long enough time line, the survival rate for everyone drops to zero."
'C:\Documents and Settings\User\Application Data\Renoise\V2.8.0\Scripts\Tools\com.mxb.Cells.xrnx\' failed to execute in one of its menu entry functions.
Please contact the author (Martin Bealby | mxb ([email protected])) for assistance...
.\extras/PatternRendering.lua:103: attempt to index global 'preferences' (a nil value)
stack traceback:
.\extras/PatternRendering.lua:103: in function 'render_pattern_to_sample'
.\extras/PatternRendering.lua:188: in function <.\extras/PatternRendering.lua:187>
for each pattern action (Render current pattern[...]) started from the context menu. When I open Cells! -> Preferences first, everything works fine afterwards. Is this intentional?
I get this on XP and Win7 (both 32bit) btw...
Thanks for this. Replicated here, it will be fixed for the next version. For now, open preferences before rendering anything to initialise the preferences table.
vV, on 06 February 2012 - 10:13 PM, said:
Good, playtime is over... now get back to your FmSynth project, embed some instrument envelope arpeggios
randomly triggering a bunch of cells across a & b and got this:
Quote
'C:\Users\plugexpert\AppData\Roaming\Renoise\V2.8.0\Scripts\Tools\com.mxb.Cells.xrnx\main.lua' failed in one of its notifiers.
The notifier will be disabled to prevent further errors.
Please contact the author (Martin Bealby | mxb ([email protected])) for assistance...
std::logic_error: 'ViewBuilder: invalid value for mini slider: '5633'. value must be [5676 - 5692].'
stack traceback:
[C]: ?
[C]: in function '__newindex'
[string "do..."]:22: in function <[string "do..."]:11>
.\core/CellsChannel.lua:1292: in function 'Tick'
.\core/CellsTransport.lua:429: in function 'LineTick'
.\core/CellsTransport.lua:403: in function <.\core/CellsTransport.lua:386>
one bug found, right click track, select 'render track as repitched loop'...
'C:\Users\peter\AppData\Roaming\Renoise\V2.8.0\Scripts\Tools\com.mxb.Cells.xrnx\' failed to execute in one of its menu entry functions.
Please contact the author (Martin Bealby | mxb ([email protected])) for assistance...
.\extras/PatternRendering.lua:103: attempt to index global 'preferences' (a nil value)
stack traceback:
.\extras/PatternRendering.lua:103: in function 'render_pattern_to_sample'
.\extras/PatternRendering.lua:205: in function <.\extras/PatternRendering.lua:204>
Guruh Motha Fakka is Levitating and Knows Everything About Renoise Member
Group:Normal Members
Posts:2121
Joined:30-July 05
Gender:Male
Location:Berlin, Germany
Interests:Music, Blu-ray, PC Games
Posted 07 February 2012 - 11:23 AM
Just something i have noticed: It would be handy to have GetValueOfSomething() for the methods exposed to the controller implementation class. I could of course do own housekeeping inside the class, but having "get" functions would make writing support for endless encoders for example more readable and would take away a bit from the complexity.
randomly triggering a bunch of cells across a & b and got this:
Thanks for the bug report, I'll look into it.
lazerbeat, on 07 February 2012 - 01:51 AM, said:
Im really keen to see user demo videos of cells if anyone is putting it through its paces!
So am I! Anyone up for making one?
petervh, on 07 February 2012 - 04:42 AM, said:
i'm pretty impressed.
one bug found, right click track, select 'render track as repitched loop'...
<snip>
This is the same bug as reported earlier. See post #14 - basically, open the preferences dialog first as a work around for now.
Beatslaughter, on 07 February 2012 - 11:23 AM, said:
Just something i have noticed: It would be handy to have GetValueOfSomething() for the methods exposed to the controller implementation class. I could of course do own housekeeping inside the class, but having "get" functions would make writing support for endless encoders for example more readable and would take away a bit from the complexity.
Makes sense, I'll look at adding it at some point.
Are you making some controller definitions? If so, excellent!
Guruh Motha Fakka is Levitating and Knows Everything About Renoise Member
Group:Normal Members
Posts:2121
Joined:30-July 05
Gender:Male
Location:Berlin, Germany
Interests:Music, Blu-ray, PC Games
Posted 07 February 2012 - 07:27 PM
mxb, on 07 February 2012 - 12:58 PM, said:
Are you making some controller definitions? If so, excellent!
Not right now yet... i'm working on a low level framework for the Korg microKONTROL, mainly for own applications but it could be used for Cells too or probably also Duplex in some way. Deciphering that MIDI implementation is quite some pain though.