WREN release history

in version 2016.4.27.0

  • There was a bug in how the selectors worked, setting the value to zero by clicking on the selector instead of using the left mouse click popup menu would not set dependent modes correctly. Fixed that.
  • There was an error in the stereo RMS calculation used for the compressor. It calculated the RMS of the sum of the left and right signals where it should have calculated the root mean of sum of the squares. Changed that, it works better this way.
  • Fixed the range setting for the MixMM16to1 module.
  • Changed the looks a bit for this web page, checked the spelling for it (and for the module help) a bit better, updated the online module docs and updated some of the module help texts.
  • IntDif - Integrator differentiator I've made the IntDif module rate smart, it would not otherwise differentiate control rate signals the preferred way. Also added a gain control for the integrator to make it possible to avoid clipping. Also made a horizontal slider control type for this. Transparency acts on the differential output only and gain on the integral output only.
  • Envelope - Envelope follower Adding RMS mode to the envelope follower module. Note that in RMS mode the RMS averaging filter time is set from the Attack time, which is a bit odd, but setting it from the Release time seemed even less even.
  • Added a 'saw' mode to the ChebGen module. The image shows this mode for the order five output for some standard input wave forms. Basically this is:

       out := FloatMod( N * ( in + 1), 2) - 1;

    This would 'sort of' work for non integer N as well. Will make a separate module for that, the SawMill module.
    ChebGen module in Saw mode order five for some input wave formats
    (Also changed the graph colors back to something a little less psychedelic.)
  • SawMill - Sawmill module Added the SawMill module. This module is rate smart and will switch to audio rate when such a signal is present at one of it's inputs. The frequency multiplication proper only works for integer multiplication factors, for non integer factors it is more like a PWM effect on a sawtooth wave (that is the 'sort of' disclaimer mentioned in the lemma above). This is quite a nice effect on sine or triangle waves as well. This is a naive implementation … up to like 200 Hz this is sort of OK.
    Example output for the SawMill with modulation in the range [1.0, 5.0], controlled by the red triangle wave. The blue signal is the input saw and the green signal the frequency multiplied saw:
    saw mill example output
  • pulse modes Added pulse modes to the divider modules. They can now give a square output, a pulse output (a copy of the current binary value of the trigger signal) or pass the analog trigger signal's current value when it is larger than zero and false when it is not. The output level to be used for falseness can now be set on the divider modules too – see next lemma.
  • Logic output levels Added output level selection to some logic modules. The default mode will always be bipolar and non inverting to be compatible with the old situation. Any lights will still show the internal logic state independent of the selected output type.

    Added this for the divider modules as well now.
  • Added a 5 to 1 MixS5to1 - five to one stereo mixer and an 8 to 1 MixMS8to1 - eight to one stereo mixer stereo mixer to save some screen space in patches with many stereo mixers.
  • Made a phase distortion module, after an idea found here. The input signal is fed into a (short) delay line, and the delay time is being modulated with a low pass filtered copy of the input PhaseDistortion - phase distorter signal. The modulation depth can be set and modulated by an external signal. In addition to the modulation from the filtered input signal The delay time can be modulated by an external as well. The filter Q can be set and it's cutoff frequency can be set and modulated.
  • Added Hysteresis to the CubicClip module, and moved it from the Control page to the FX page (but it still can run at control rate as well). The default Hysteresis value is zero for compatibility with old patches. It is very possible to let this module clip now into one of it's two extreme states due to the positive feedback used for Hysteresis control. I'll consider this to be a feature.

    Hysteresis example:
    Example for Hysteresis on CubiClip
  • KS - Karplus Strong module Added an option to choose between two modes for the fractional delay calculation in the KS module. It used to have linear interpolation only, but can now do all-pass interpolation alternatively. The difference is a bit more subtle than I had thought it to be, but still may add this to more delay based modules.
  • AllPass - Allpass filter Added an AllPass filter, which is a delay line with feedback and feed forward around it. The feed amount can be modulated, which moves the frequency for the 'halfway phase shift point'. As it is a delay based algorithm it ended up on the 'delay' page. The delay time is specified in (whole) samples, so the actual delay time depends on the currently set sample rate. I put this in mainly to do some more experiments with phase distortion on arbitrary signals, it may be useful too for reverb experiments … or to help make stuff LAWDy like (by smearing out peak energies a bit for impulse like sounds).
  • Rungler - Rungler module Added a Rungler module. This is after idea from Rob Hordijk. It is to be found amongst the logic modules. The idea is to let the Rungler control the frequency of an oscillator where the output of that same oscillator goes to the data input of the Rungler. The clock input is then clocked by an LFO, or faster for weird effects, and from this little semi random patterns will emerge. For more info see http://hordijk-synths.info/ (which is not Rob's own website). It is nice to put some note quantization into the frequency control feedback loop (for tuned patterns). This module is rate smart, it will switch to audio rates when needed.

    I've made the number of taps used settable as well as the shift register length. It is possible to set the number of taps larger than the length of the shifter, this will result in non proper working. Default settings are 8 shift steps and 3 taps, like the original circuit has them. The output value is scaled with the number of taps to always have a range [0.0, 1.0], and after that a final level scaling is applied.
  • Measurement ranges for Value module Added some measurement ranges for the Value display module. Possible settings currently are : 'units', 'dB', 'Freq', 'Note', 'Lfo fast', 'Lfo med', 'Lfo Slow', 'Lfo BPM' and 'Lfo Lin'. All ranges assume the associated module parameter to be set to it's minimum value and the modulation input to be fully opened for a bipolar control signal. I.e. for the LFO fast range it is assumed that the speed is set to it's minimum value (0.254 Hz, knob position 110) and that the 'fm' control knob is set to the max (1.000).
    In the image shown the current cycle time for the bottom LFO will be 10 minutes and 36 s. (The top LFO provides the modulation for it.)
  • PulseDelay - Pulse delay module
    Pulse Delay mode delay
    Pulse Delay mode stretch
    Made a logic pulse delay module which can either delay an incoming pulse or stretch the length of it. The delay/stretch time can be set to the same ranges as available for envelope times, and it can be modulated.
  • Added positive and negative Q modulation to the SVF filter.
    SVF - SVF filter
  • Tapper - Tap control module Made a tap control … as in tap twice and it gets the tap rate from that to control LFOs with, or delay times. There is a rate multiplier which can set a factor of the tap rate to be applied to the control output. Also added a slave input and output to allow for chaining of Tapper modules (so one can be in LFO mode and another in DELAY mode,or a different rate multiplier can be used). Tap rate can be set by clicking the mouse on the tap area or when the keyboard focus is on the tap area (when it has a red colored border) the space bar can be used as well. It is also possible to set the rate with a knob, or by typing it in directly.

    There is a sync output which goes active on every tap action, and also the sync button can send a sync signal independent of the tap control (this is meant for resetting LFO's, for instance).

    An example patch for the tap control:
    tap control module example patch

in version 2016.3.5.0

  • 2016-02-20 : A user reported that when the windows theme is selected the text used on the module selector tabs is too large (not fitting the buttons). The styled font drawing for the module selector is a bit tricky, made a change to TKnobsModuleSelectorStyleHook.DrawTab which might help, at least the font is controllable then from the form designer … and no longer defined by the component's owner, so should be fixed to 8 point Tahoma now.
  • Fixed the memory leak in the TextSequencer module, it was present after all.
  • Pulser - Pulser module A new module, the Pulser. This is after an idea from Ian Fritz. This module only implements the pulsing bit though, and not the wave wrapper. The pulsing works by letting trough the 'signal' input when it's absolute value is larger than the 'shape' input value. When this is not the case the output is zeroed. To get the full implementation of the Wavolver the 'inact' output could be used to control mixing in some other signal, for instance from a wave wrapper module. This output goes active when the main output (out) is inactive (zeroed).
  • Formant2 - Formant2 module And another new module, the Formant2. This is a formant type of filter, or a vowel filter, for which presets can be loaded from a file.
    Sofar I've typed in formant sets named swedish, usa, french, csound_alto, csound_bass, csound_countertenor, csound_soprano and csound_tenor. See the supplied wren.formants file for details. Not all formant sets are equally well specified, only the csound ones did specify levels and bandwidths.

    The filters used are second order State Variable Filters used in bandpass mode, one for each formant. Bandwidth is being set by calculating a Q value and applying that. When no bandwidth was specified a Q of 10 will be used.

in version 2016.2.14.0

  • Tested Wren with the JACK Audio Connection Kit, looks like it is working fine here, but note that you'll need to select some channels to be used from the audio setup. I've added a FAQ item for this.
  • There is an issue with MIDI connections, when the server can not be found there is an endless amount of popups telling so. Ok, fixed that, and a couple of other possible ways for the NetMidi connection to go haywire. When something fails unexpectedly the auto connect feature will be turned off now, and error messages will go into the log instead of into a popup window.
  • There is an instability in the Formant filter in that it makes huge signal levels when modulated at audio rates. Ok, can fix this by setting the update rate lower, at a tenth of the control rate it seems to behave better – set it to 1 / 20 to be sure and at 44k1 this still seems smooth enough without filtering (update rate is then about 275 Hz).
  • An idea came in to make double click on a cable work like ctrl+normal mouse click, i.e. move or delete a connection.

    This was supposed to be working, but the double click was tested at the wrong point in the code, fixed it.
  • Added an average (avg) output to the Median module, it outputs the average value of all samples present in the sample bin. This provides a linear moving average, as opposed to the exponential type the Average filter and the Slew module use.
    Median - Median module
  • Added a simplified version of the Karplus - Strong oscillator. This one uses less CPU, the noise stuff went out and modulation update frequency was lowered to control rate. Also the brightness modulation was removed.
    KS - Karplus-Strong module
  • Changed the data buffering for the scope module a bit, seems to work better that way.

in version 2016.1.24.0

  • Thanks to Gabe I found a bug in the sample rate switching mechanism. Or two actually. First one would freeze Wren when using legacy audio and switching the sample rate. Second one caused general protection faults in the PitchShift module on a sample rate change. I've fixed those.
  • Looks like I fukt the math modules … if they ever worked … something to look into. Ok, it was only the monadic function module, fixed now.
  • The Third filter had some trouble with denormals, changed the code a bit, this affects all the multi-filters.
  • Solved the no-drag issue with module imports. Also made a distinct module import / export folder to be remembered over Wren sessions. This introduced a problem with regular module insertions … modules sometimes jump to silly places now … will need to check that. Found a quick and dirty patch for it, this will need some more attention at some stage (as the underlying issue is one that has been present for a long time already), but it's fine for now.

    Module import and export:

    module import and export
  • Made regular patch folder and template folder to be remembered over Wren sessions.
  • Added an Alternates item to the module pop menu, this can be used to change the type of the selected module. After the change it will try to reconnect the module (based on connector names, where they exist in both the old and the new module) and it will try to copy over parameters from the old module to the new one (based on control names, where they exist in both modules). Wire and parameter copying is not always possible however as there are some naming inconsistencies between modules (and to solve those would mean old patches can not be read anymore, not naively at least).
    alternate module selection
    And while at it … implemented non strict parameter paste as well, where you can copy over values from one module type to another type. Only the matching parameters (name based) will be copied in that case and the rest will be skipped. This fuzzy parameter pasting can only work from one module to another.

    This does not really work like I'd want it to work yet … it needs some more work.
  • Added peak / RMS mode selection to the compressor module. It used to do peak mode only.
  • 2015-09-24 : Different distribution laws for panner, say power law or volume law.

    Added some different fading curves for the XFade and Pan modules: linear (equal volume), square root, sine (equal power), sine squared (s-shaped) and squared.
  • Added a mixing level scaler, an "attenuverter'" like thing. The MixingScaler is on the Control page.
    MixingScaler - fourfold mixing level scaler
  • Added a a stereo widener module. For signals that are stereo already the base can be widened by raising the inversion amount, this adds a bit of -L to R and a bit of -R to L. For signals that are mono some delay can be added, amount and delay time can be set. Modulating the delay time will result into a flanging effect. This module can be found on the FX page.
    StereoWiden - stereo widener
  • Added a smaller mono mixer, taking less patch space. It has one input less than the other mono mixer, but is still modulatable, mutable, chainable and rate smart. The MixM3to1 module can be found on the Mixer page.
    MixM3to1 - three to one mono mixer
  • Added a volume control, with a preset, a mute and modulation. The Volume module can be found on the Mixer page.
    Volume - volume controller
  • Wren is now four voice paraphonic or limited polyphonic! Added a couple of note stealing algorithms 'none', 'cyclic', 'softest', 'oldest', 'lowest' and 'highest'. I've added level inputs too, note stealing can use that information (for the 'softest' mode), these could be connected to voice envelope outputs for instance. You'd still need to patch out the voices manually. The MidiMultiNoteIn module can be found on the I/O page.
    MidiMultiNoteIn - MIDI multi note input module
  • Added an RMS module, calculating the RMS value of it's input signal. The averaging time can be set with the time control. The RMS module can be found on the Math page.
    RMS - RMS module
  • Was asked for a utility module just displaying the value on it's input, made it and it can either show units or dB values. The Value module can be found on the Utility page.
    Value - A value indicator
  • Added a soft clipper with a cubic transfer function.
    CubicClip - A soft clipping module

in version 2015.12.15.0

  • The Hrast filter had a denormalization issue for the 24 dB section, added normalizing code there.
  • LevelConverter was not working properly, it took the input mode setting for both the input and the output mode (and so it acted like a .. wire).
  • Removed some the InternalName stuff, there were two mechanisms with one not being used.
  • Cleaned up the source code a bit by removing unused pascal units.
  • The previous distribution had an old version of the executable in it – fixed that.
  • New module type, a ScaleQuantizer, which is a NoteQuantizer with user definable scale presets.
    ScaleQuantizer - Scale quantizer
    The presets will be dynamically loaded from a file wren.scale which must be in the same folder as the Wren executable file. When this file does not exist Wren will create it, after that you can edit it with a text editor (like Notepad for instance) and Wren will not touch it anymore.
  • And yet another quantizer, a modulatable one. That is, the quantization steps can be switched on or off by both a selector and a logic input signal (the logic xor of those two signals). This one is a lot of fun actually, it can do trills for instance.
    ModQuantizer - modulatable quantizer
  • Changed the input level control for all note quantizers to be an input range control with a value to be set in semitones. This will not affect existing patches, just the displayed value changed to something more intuitive. The default range did change from 128 semitones to 48. The range can still be negative (meaning that an up going ramp for an input would result in a down going note sequence to be generated).
  • SeqChord - chord sequencer Made a chainable chord sequencer. This one outputs four note chords for which a degree, a type an inversion and a base octave can be set.

    Which chord is to be sent to the output is selected by the active inputs, the leftmost active active input wins. Four gate outputs are available to control envelopes, for this to work properly a gate input (which determines the length of the logic output activation) has to be provided.

    For chaining the logic inputs and the signal inputs are to be connected to the respective outputs of a previous module. The last module in a chain having an activated active input will be the one sounding. The activation inputs could be controlled from a binary counter set to seq. mode, or probably a gate sequencer would work as well. The logic in-outs are the ones closest to the indicator lights.

    The chords can be transposed with the transp. control, this only works on the local chords and not on any incoming ones.

    A slew control is present to get some gliding effect on the note changes, this works on the local notes as well as on the incoming ones.

    I'm not to sure that the chords played are theoretically correct … if there even is such a thing, please inform me about any mistakes I made – I'm not too good at this and basically just googled up some stuff.
  • Slew - Slew rate limiter And a slew rate limiter, or lag, or control rate low pass filter. This actually does the same thing as the Average module, except that the knob action is reversed and that this is a control rate only module. And with that … this text became longer than the code used to implement the module.

in version 2015.11.4.0

  • This version does no longer make use of the 'bitmaps' folder that the previous version used. Instead there now is a folder 'looks' which has a sub-folder for each selectable 'look'. This version comes with two pre defined sets, the default one and the gabe one. The gabe one was made by … gabe, also known as LfoHead on the electro-music.com forum. Thanks Gabe, great job!
  • As almost all coloring is user configurable now … all color references in this document will be according to the default coloring scheme. Except that I have substituted the color green by lime (bright green) in that scheme (which it used to a long time ago as well … on a darker scheme Lime seems better visible than Green).
  • 10-03 00:09 Octangula -> Blue_Hell: is it just me, or does the knob control mode setting not make any difference?
    Ok, the modes do work on modules but not on the other knobs, like settings and main volume control strips. Fixed it for the next release – the code to do it was never present … forgotten.
  • 2015-10-09 : When a module with a MIDI assigned control is removed from a patch the MIDI connection is not deleted, resulting in GPFs … Likewise, after that got fixed … when undo is used after a module with a MIDI assigned control was deleted … that CC does not work, although it is still shown to be present with a blue border. Ok, fixed that too. Apart from that there was yet another bug, CC's were never properly unregistered, also fixed now.
  • OSC sync was not working properly anymore, it sent a message /sync where it should send /*/sync to match any listening synth, fixed that. Had not tested this apparently after I incorporated the synth name into the OSC system. Likewise, the the OscMessage module did not send a synth name (while expecting it in listen mode).
  • I was not going to make any new modules for this one … but thought a fourfold multiplier to be handy … so here it is, taking half the space of four multipliers..
    MultipleMult - Multiple multipliers
  • And another one crept in … a 16 to one mono mixer with modulation controls.
    MixMM16to1 - 16 to 1 mixer with modulation
  • Trying to make a more general look and feel settings control.
    look and feel example
    Look and feel is stored into a 'looks' sub directory of the Wren application directory, each theme goes into it's own sub folder there. These folders can contain a set of bitmap files and a configuration file 'looks.ini'. On loading a a look and feel preset the bitmaps will be loaded from the selected folder and set as the application bitmaps. The file 'looks.ini' is then read and any settings in there will override the settings as read from the normal ini file, including the visual theme specified there. You can still override some settings after loading a preset, and these will be stored in the normal ini file. The 'looks.ini' file will be overwritten by Wren only when explicitly requested (by using the 'Save as preset ...' button). For example:
    look and feel example
    The following items can be customized (and can be stored in look and feel presets):
    • Each module has a bitmap associated with it, when a bitmap file is found in the looks folder that bitmap will be used. Bitmaps have to be named like <ModuleName>.bmp for this to work. The bitmaps should have a size of 21 by 21 pixels. I will supply example files as part of a default looks set.
    • Some bitmaps used by the modules can be overriden, this concerns the following items (I will supply example files as part of the default looks set):
      • skin_connector_audio_in.bmp
      • skin_connector_audio_out.bmp
      • skin_connector_control_in.bmp
      • skin_connector_control_logic_in.bmp
      • skin_connector_control_logic_out.bmp
      • skin_connector_control_out.bmp
      • skin_connector_logic_in.bmp
      • skin_connector_logic_out.bmp
      • skin_down.bmp
      • skin_env_attack_exp.bmp
      • skin_env_attack_lin.bmp
      • skin_env_attack_log.bmp
      • skin_env_attack_s.bmp
      • skin_env_release_exp.bmp
      • skin_env_release_lin.bmp
      • skin_env_release_log.bmp
      • skin_env_release_s.bmp
      • skin_gate_gate.bmp
      • skin_gate_off.bmp
      • skin_gate_trig.bmp
      • skin_indicator_active.bmp
      • skin_indicator_high_active.bmp
      • skin_indicator_high_inactive.bmp
      • skin_indicator_inactive.bmp
      • skin_indicator_low_active.bmp
      • skin_indicator_low_inactive.bmp
      • skin_indicator_mid_active.bmp
      • skin_indicator_midinactive.bmp
      • skin_knob.bmp
      • skin_module.bmp
      • skin_mute_active.bmp
      • skin_mute_muted.bmp
      • skin_mute_passtrough.bmp
      • skin_no_knob.bmp
      • skin_shape_random.bmp
      • skin_shape_random_square.bmp
      • skin_shape_saw.bmp
      • skin_shape_sine.bmp
      • skin_shape_square.bmp
      • skin_shape_tri.bmp
      • skin_signaltype_inverted.bmp
      • skin_signaltype_negative.bmp
      • skin_signaltype_negative_inverted.bmp
      • skin_signaltype_normal.bmp
      • skin_signaltype_positive.bmp
      • skin_signaltype_positive_inverted.bmp
      • skin_small_knob.bmp
      • skin_solo_off.bmp
      • skin_solo_on.bmp
      • skin_up.bmp
      These bitmaps will have to be 'approriately sized', except for skin_module which will be stretched as needed.
    • The following patch related colors can be changed from Wren directly:
      • Editor background color
      • Module color
      • Connector border color
      • Selector color
      • Selector border color
      • Selector border color single
      • Display color
      • Display border color
      • Knob MIDI color
      • Knob focus color
      • Knob MIDI and focus color
      • Viewer color
      • Viewer border color
      • Viewer line color
      • Viewer fill color
      • Indicatorbar peak color
      • Indicatorbar valey color
      • Audiorate color
      • Controlrate color
      • ControlrateLogic color
      • Logic color
      • Unconnected wire color
      • Wire highlight color
      • Module group I/O color
      • Module group OSC color
      • Module group LFO color
      • Module group Env color
      • Module group Filter color
      • Module group Switch color
      • Module group Mix color
      • Module group Control color
      • Module group Note color
      • Module group Math color
      • Module group Logic color
      • Module group Seq color
      • Module group FX color
      • Module group Delay color
      • Module group Utility color
    • A visual theme can be selected, this mostly is for the non editor related visuals. Currently user made visual themes are not supported, it seems to be possible to arrange for that though. Anyway, several themes are built in.

      Guess it will survive the coming winter with all this fresh paint :-)

      in version 2015.10.2.0

      • A multi compare module, after an idea I found here. Added individual outputs in addition to the bus outs, added random and clear buttons as well. Moved the module from the Sequencer to the Logic page … not sure … but hey, there is a module search function :-)
        MultiCompare - multi compare module
      • Moved the Pad module to the Utility page and added a new Knobs4 module there too – featuring larger knobs and memo fields to be able to give some information about what the knobs do. Added a switches module as well, same idea. And buttons, for momentary switches, with indicators lighting up when a pulse starts. The button out's are active for 1 ms, the lights for 125 ms.
        Knobs4 - four knobs Switches4 - four switches Buttons4 - four buttons
      • Added a simple level conversion module, direct translation of input range to output range.
        LevelConverter - level converter
      • Made a new Math tab for the module selector and moved some modules over from the control tab to the new one. Added some new math modules there as well.
        Reciprocal - reciprocal module Divide - divider module Monadic - monadic function Dyadic - dyadic function

        Current monadic functions are x2, x3, x1/2, x1/3, sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), 2x, ex, 10x, log2(x), ln(x), log10(x), 2x/12 and 12 * log2(x). Invalid domain values will output zero.

        The current dyadic ones are x mod y, xy, logx(y) and atan(y/x). Invalid domain values will pass on x.

        More may follow.
      • Made the Space bar work on focused selectors (red border). It will select the next value or when out of values the first one. This also works for momentary switches (buttons, each hit on the Space bar will pulse it then).
      • Fixed the lockout mechanism which must prevent module's real time execution during memory allocation and de-allocation. This should cure some issues like access violations or Wren stopping audio generation or knobs stopping to be responsive, stuff like that, which would still happen under some conditions with modules like the filter banks. The mechanism used only gives just a smidgen of performance loss (full fledged synchronisation degraded performance by about 20%, which made me prefer some instabilities) … I reasoned that the dirty trick I used should be ok, may it be so :-)

        As a consequence: Starting a second instance of Wren does not stop audio for the first instance anymore, as it occasionally would do.

        As a consequence: It should no longer be needed to restart Wren after a sample rate change was made in the Settings Screen [F3].

        As a consequence : It should no longer be needed to stop audio generation before a sample rate change is being made in the Settings Screen [F3], the change restrictions that were present have been removed. Wren needs to still stop and restart audio to make the new sample rate work, but it can automate that now.

        As a consequence : Removed the option to not use PortAudio when it is available from the Settings Screen [F3]. This option can still be set from the Wren ini file though (set 'UsePortAudio' to 0 (zero) there).
      • Changed the way output to input links are followed in a compiled patch. These are now traversed from the modules themselves instead of from the synth patch. Not only is this a tad more efficient, but once the compiled modules get properly sorted as well, signals will have less delay trough the patch. Right the modules were properly sorted already – great :-)

        Module execution order is top to bottom and left to right. Which means that signal flows from top to bottom and from left to right should have zero samples of delay, and reverse direction links should have one sample of delay.

        The lost feature is that in debug mode wire performance is no longer profiled separately, it has become part of the module execution time. But then again, there is no profiling support for release versions of the code.

        Also feedback behavior in existing patches may have changed.
      • Changed the drawing order for the graphs, the leftmost output (channel 1 L) is now drawn topmost.
      • Made help file generation automatic at program startup. The code will check the version information and new files will only be generated when needed. This also means that the image cache used for module previews in the module selector should always be up to date now. The popup asking for confirmation on writing out the help has been removed. It also means that starting up a new Wren version for the first time will generate some 'nervous window stuff'. I have no solution for that yet – in order to generate a proper module image the module has to be made visible, or some controls will not be painted correctly.
      • Forgot to actually update the patch version to 4 in both source code and for this page (should have done so for version 2015.8.21.0), fixed it now.
      • Moved some controls and indicators from the I/O level pane to the top control pane, and made the module selector resizable with a splitter bar.
        control strip
        When the buttons do not fit the width of the page in the module selector a left and a right scroll button are added.

        Also made a toggle on the visibility of the top pane as a whole, accessible through the view menu and using Ctrl+T as a keyboard shortcut. Currently the module finder has to be disabled when the top pane is not visible – could maybe add a modal dialog for that later on.

        So can do this now:
        minimal user interface
        for instance.
      • Made the CPU overload indicator larger.
      • Fixed some minor issues with displaying the file render status. Audio generation will be restarted now as well when rendering was stopped (when it was on before rendering was started). Changed the render indicator to be a slow green flashing light.
      • Added a context menu for the patch editor. It can be used to insert new modules cut, copy and paste modules etc.
      • Changed the default sample rate to 88k2, that's just the 'out of the box setting', an ini file present will override this.
      • Fixed the file history (menu File/Reopen) such that the files are actually listed according to when they were last opened now.
      • Fixed the issues with menu shortcut keys, the original issue text was:

        2014-12-13 : Ctrl+A in the Debug Screen [F5] selects all modules in the editor … and more keyboard shortcuts go wrong there … like Ctrl+C copies a patch, not handy.

        The solution also fixes the issue with the Del key not working in the popup editor for displays. The module title editor had the same issues, fixed those as well.
      • Changed the way the Enter key works in display editors. Some editors are multi-line and those will need the Enter key as part of the text to be edited but most are single-line, and will accept a plain Enter now for confirming the edit and closing the popup (as it already did for the display title editor).
      • Re-grouped the items in the file menu, changed some other menu's as well.
      • Added a toggle for sound generation, Ctrl+D. This is accessible from the action menu too. When active all sound outputs are muted but the patch will stay in a running state.
      • Added a toggle for lights updating, Ctrl+L. This is accessible from the action menu too. When active the indicator lights on modules are disabled. This can save a little processing time, like 15% or so. Note that the lights update rate can be changed too from the Settings Screen [F3]. This is not very useful when PortAudio is being used, as in that case the lights update process runs not on the same thread as audio processing. It would help a bit for legacy mode though.
        Also improved the speed at which the lights are handled – this used to work with formatted strings that needed to be made and parsed, now just passing around pointers to records with t the detail information. Also pre parsed the names of the lights for faster comparison during the update process. Did the same for all other data gathered for the editor from the synth, but lights are processed most often. This could maybe be sped up more by letting the synth broadcast changes, but it would need to maintain some state then and a synchronisation queue would be needed. Prolly not worth the trouble.
      • Added 'panic' control, Ctrl+P. This will stop all pending notes from MIDI inputs and from the MIDI player. This is accessible from the action menu too. MIDI input modules will listen to a MIDI AllNotesOff command as well.
      • Made it so that when a knob or slider is locked that a rnd or clr button will leave it as is.
      • There was a kludge used for the GVerb module to make the spread control work more or less properly. That kludge was based on the lights timer, so when the lights are disabled the kludge does not work anymore. As a kludge is still needed I replaced it with another one, added a timer to the TModGVerb code … at least stuff will not be broken by accident anymore that way … The thing is that the RoomSize can not be properly modulated in the GVerb code, and I still want to be able to do that. But the room size must be set before the spread can be correctly calculated. The timer will cause a little delay after patch reset to give some time for the room size to be set up, it will then recreate the reverb.

        Also for this module, I've removed some needless calculations for parameters that were not changed.
      • Fixed menu shortcuts for automatically generated menus, these would jump from '9' to 'K' instead of 'A'.
      • Added shortcuts Alt+1 .. Alt+4 to show 1 .. 4 I/O level strips.
      • Some selectors have only one value to choose from, and thes effectively act as momentary buttons (for reset or randomization mostly) I've given those a white border instead of the selectors' default yellow one.
      • For PortAudio mode started using the PortAudio CPU usage indication, which is more accurate than what was used before (and still is in Legacy mode). The CPU usage shown will be lower, but it will run out of real–time now at 100%.
      • Added support for loading bitmaps from files, this needs a bitmaps sub folder of the folder the Wren executable file is in. It also needs properly named and sized bitmap (bmp) files – going for 21 x 21 pixels.
      • Changed the default for the bread and butter mixers to dB mode instead of linear.
      • Fixed the spacing in the module selector.
      • Toying a bit with skinning, for instance, with a couple of custom bitmaps in the module selector (some more examples) :
        themes preview
        It works reliable now, so theming will be available for the next release. When needed it can be disabled from the ini file by setting UseThemes to zero – by default theming is on though, and there is no way to change this from the software itself. When theming is disabled the default Windows theme is used, just like in previous versions of Wren. When theming is disabled it is still possible to load your own user glyphs for the module selector.
      • Changed the default looks to be 'themeless' so it will look mostly like previous versions, a user can select a theme then to fit her needs. I did have to change some things in order to get things compatible with theming support. I will add a zip file to this web page with a couple of bitmaps to enhance the looks a bit. For now I'll not add any new module glyphs, that needs a bit more work, but these can easily be added later on. The bitmaps will be included in the main zip download as well.
      • Added a file opener for Scala files which shows the contents of the file selected to ease the selection a bit (the first couple of lines having some useful comment usually). You can enter a wildcard mask to zoom in on files as well. This is all a bit Windows 3 like, but that was the plan with windows 8 eh :-) Anyway, it works.
        scala preview
        The actual looks of this dialog are determined by the selected theme.
        Changed the code a bit such that file open dialogs from the patch will try to go to the directory that the currently used file is in.

      in version 2015.9.2.0

      • And the filter bank is finally finished :-)

        I had planned to realize this filter using Fourier transforms, but it ended up using State Variable Filters … up to 102 of them when the steepness is set to 6. It takes some amount of calculation time then, but steepness can be set lower and it is not too bad actually. Steepness controls the number of filters put in series 1 to 6 can be selected, where each step is a 12 dB filter and so amounts to 6 dB / Octave of slope for the bandpass ones.

        I've scaled the range for the Q control a bit so it's more or less usable over the full range – it depends a little still on the selected steepness. Also divided the effective internal filter Q by the number of filters cascaded, which tames the silly amplitudes a bit, not perfect but it's workable. At high Q settings and a large steepness it will do some ugly stuff still.

        The low side filter can be set to either low pass (shelving) or to bandpass and the high side filter can be set to high pass (shelving) or bandpass. The in between ones are bandpass always. The Q control can be used to add in some resonance. Added level modulation for each filter chain, and added FM control to be able to sweep the filter as a whole, but note that there is an upper limit for the frequency that can be used for a state variable filter. So for high modulations the high end frequencies may turn out to be lower than expected, and you might want to set some faders to zero there.

        Decided to make two filter types, one having a half octave (tritone) filter spacing, and the other a third-octave (major third) spacing. Both have the same amount of filter bands and so the second type has a reduced frequency range.

        TritoneBank - tritone filter ThirdBank - third filter

        And while we are at it … let's make a couple of splitters too. Added clip indicators to these.

        TritoneSplitter - tritone splitter ThirdSplitter - third splitter

        And … a simple modal thingie would be cool too :-) Added some random buttons to this one to help search for timbres, it should probably have presets that can be saved and reloaded. Come to think of it, I could make a general purpose presets mechanism for modules making use of the existing parameter paste mechanism. And then control it trough the module popup menu.

        Modal - modal filter
      • Just did that, added a presets mechanism for any selected set of modules or for the patch as a whole. Module presets can be used by selecting the modules to save as a preset, then right clicking on any of the selected modules, and then use 'Save as preset'. Patch presets can be saved from the file menu. On loading from a preset the selection will have to match the selection that was used on saving the preset, or else there will be a structure mismatch. So this probably is most useful for the patch as a whole or for single modules.

        The file format used for presets is exactly the same as the one for patches, but they will by default be saved with a '.preset' file extension. So they can always be loaded 'as a patch' (for seeing the structure of it for instance).

        Loading from a preset will only change the knob settings of the selection and there will be no patch recompilation, and so the patch will just keep playing using the new settings.

        When there is a structural mismatch on pasting of parameters there will be a warning generated now. These warnings can be disabled from the Settings Screen [F3].
      • Made the search function to operate on the module selector as well. Non–matching modules will be hidden from the selector. and when a page becomes empty this way the page will be hidden too.

        This feature can be disabled from the Settings Screen [F3], and also made it possible to disable patch searches from there. When both options are disabled the 'find' control and the menu item for it will be disabled.

        Pressing Esc while the keyboard focus is on the search box will clear the search phrase.
      • Rate Smartness (where modules can change execution speed based upon the actually connected signals) is now indicated with [RS] in the module popup description shown from the module selector.

      in version 2015.8.26.0

      • Added a new module type, a 16 step clocked delay (analog shift register). It is rate smart and it has the option to clock it at audio or control rate with an internal clock (fast mode) instead of from the clock input (clocked mode). When the module is operating at audio rates the fast mode will be audio rate, control rate otherwise. Just connect an audio rate signal to any input to make the module operate at audio rates. This one could be used not only as a bucket brigade like delay, but in fast mode you could implement your own FIR filters with it when used in combination with the 16 input mixer for instance.
        ClockedDelay16 - Clocked delay
      • Made a NoteQuantizer module. It quantize it's input value to the note nearest to one selected by the note selectors. When the highest and lowest nearest are equidistant it will use the higher one, and when no notes are activated it will pass the input value unchanged. Added an input conditioning knob to it to attenuate the incoming signal, or to invert it (attenuverter).
        NoteQuantizer - Note quantizer
      • Made a lookup table module with 16 sliders for the values. A select input selects which fader will be output, and there is a cross fade option to be able to output in-between values. This one is to be found on the sequencer tab, as it can be used for sequencing when driven with a saw shaped input signal (range [ 0, 1]).
        LUT - Lookup table
      • Made the Scala module working, copied the details about it over to a separate page.
        Scala - Scala scaling module

        It translates note information into scaled note information according to the Scala keyboard mapping and scale files loaded. The input is supposed to be be connected to anything that generates note information, like a sequencer or a MIDI note in module, etc. This information is first translated into MIDI key numbers internally, then the Scala algorithm is applied, then the output value is translated back to an internal note value again (128 notes / unit).

        You can get scales and keyboard mappings from http://www.huygens-fokker.org/scala/ but also there is the Scala program itself on that site which can make such files to your own liking .. it will also tell you how to hand-craft such files.
      • Made an inconvenient choice for the signal levels of the 'rec' buttons in the granulators and had to invert them. This means that on patch reload granulator recording will be inverted from how it was aved with the previous Wren version. Sorry about that …
      • I seem to have over 150,000 lines of code now
        smiley - eek!
        or 150 KLOC, sooo … there should be about 1500 – 7500 bugs … or 'code defects' as they call them … when I perform as 'good' as the 'code industry'. Or around 75 when I'm as good as µsoft … or ZERO when it is as good as space shuttle code. (see here for a rationale of this).
      • Fixed a bug causing Wren to refuse to stop under certain conditions. It would also not allow the Delphi environment to be shut down after Wren had run in debug mode. Forgot to call the inherited handler in a Notification function ... or forgot ... it was omitted in some old code that used to work long ago without that call (TKnobsWormPanel.Notification). I should have disabled the Friemels module as it does nothing usuful anyway.
      • The lookup tables were about twice as large as I had meant them to be, halved them.
      • Poetry generator, XYScope, Vocoder, Convoder and Filterbank had a memory leaks, fixed those.
      • The WaveWiper had its dezipper spec in the constructor instead of in SetDefaults.

      in version 2015.8.21.0

      • Poetry - Poetry module Added a 'Poetry' generator, modeled after an idea found in a Phd thesis by Johnathan Mackenzie found here. It finds seed patterns in a buffer starting at some random buffer position, and it will get it's next output from the value following the found seed. Then it will repeat this strategy, producing variations on a read in pattern as it moves along. New values can be clocked into the buffer and the search algorithm is triggered from a separate input. This is very similar to a hidden Markov model.

        This module is primarily meant to generate variations on control signal sequences, but the module is rate smart and will switch to audio speed when needed. As is, the history may be too small though for audio processing (and the search algorithm is probably too slow to allow for substantially more history). Anyway, I like it for control signals.
      • Delay8 - Eight tap delay Added an eight tap delay where each delay output can be individually modulated. Just like the regular delay module there is a fixed output having the maximum delay with no time modulation, and the delay time can be set from 10 µs to 5 minutes - in three separate ranges. The delay modulation inputs modulate between zero delay and max delay for input values from 0 to 1.
      • Added OSC support. Wren can be either an OSC transmitter or an OSC receiver. See the FAQ for more info on this and about how to set up OSC and about what OSC messages are implemented.

        In the current OSC implementation there can only be one listener in a patch for any specific address. The first listening entity seeing the message will disable it for other potential listeners. There can however be multiple transmitters for the same address. This is a feature of the OSC module I've used, and I may change this for a future version – it does not seem to be a serious limitation currently as further signal propagation can be done on the wire level in the patch.
      • Sync - OSC sync module Added a sync module which can send sync signals from one Wren instance to another. Or alternatively external OSC enabled software could make use of this. This module sends and listens to OSC /<synthname>/sync messages. See the FAQ for more info on OSC messages.

        The sync rate must be lower than a quarter of the control rate (currently amounting to the sample rate divided by 32), or else it will not work properly. A practical maximum working for all sample rates would be 1 kHz.
      • OscMessage - OSC message module Added an OscMessage module which can send or receive arbitrary float values over OSC using a user defined address. When the current Wren instance is an OSC transmitter it will send the value present on the blue output when the trigger input goes from low to high, this value will be set as the output value too then. When Wren is set to be an OSC receiver incoming OSC messages matching the set address and having a float value as their first argument will set the module output value (it will still copy the input value to the output as well on a trigger action).

        Messages may be sent with more than one parameter, only the first parameter will be used, and only when it's type is 'f' (float).
      • RndGranulator - random granulator Granulator - granulator SimpleGranulator - simple granulator Working on Granulator modules. These are all based upon sample storage in a delay line (hence, the module can be found in the delay section). The length of the line can be set up to five minutes. A maximum of 128 grains has been set currently, which seems to be about what the system can do (although the maximum actually obtainable in real time may be lower, depending on settings).

        There is control for the grain playback speed (dly mod), the grain inter-onset time, the grain duration, the grain volume and grains can be panned as well. There is a record control to be able to stop recording into the delay line, when it is off the delay line is being looped. The input left of the record control morphs between recording and looping for dynamic record control.

        For the first type the inter-onset time, the duration, the volume and the panning can be randomized. Not quite sure yet on how parameter modulation should work. Once the grain starts all the parameters are set, and they will not change during the grain's lifetime.

        Added a second type of granulator which does not have the parameter randomization, instead this should be controlled trough the modulation inputs. It looks exactly the same but the modulations work in a different way.

        Added an input on both versions to control the grain start point within the storage loop (this was just a random point before). Also upped the maximum grain count to 256. This can easily get the CPU on it's knees for certain settings, but for other settings it's nice to be able to have a higher grain count than previously possible.

        Renamed Granulator into RndGranulator and SimpleGranulator into Granulator, and then added a new SimpleGranulator. For this one new grains are started from a trigger input. This one has no pan or volume control. It should be a tad more efficient CPU wise and the trigger input allows for tuned inter-grain delays.

        Current envelope shapes are Bell, Exp, RevExp, Pulse, RndBell and RndExp.
      • MixM16to1 - 16 to 1 mixer Added a new mixer type, mono, 16 inputs, a chain input and one output. Control type can be linear or dB with a couple of ranges.
      • Added S-shaped envelopes for all modules having envelope slope shape selection (including the interpolation curves on the Seq16 module). Also sped up the envelope shape calculation a tad by working out an unnecessary multiplication.
        S shaped envelope
      • Added an 'env' out to the compressor module, an envelope of the sum of the incoming signals.
      • Changed the timing for the net MIDI and OSC lights from 250 ms to 125 ms and added an OSC enabled indicator light.
      • Added a SynthName property which can be used to distinguish Wren incarnations for the purpose of OSC addressing. The synth name can optionally be shown in the title bar and it can be changed as part of the OSC settings.

        Also added an OSCAddress property to compiled modules in the synth patch, it's value is set from the module title in the patch editor. A module title starting with '@' will enable the module for OSC activities.

        Furthermore I've changed the value popups for knobs to show the OSC address fragment to use for addressing them as the first line in the popup. When the control is not automatable an exclamation mark will be shown on the first line instead.

        The OSC specific modules such as Sync and OscMessage are OSC enabled always regardless of their title.

        Working on OSC enabling all modules, and maybe the controls of the main program as well, the above is in preparation of that.

        OSC patterns starting with /*/ should be accepted by all running Wren g incarnation that do have OSC enabled.
      • Optimized Pan, XFade, MultiMult and Multiplier a bit by getting some multiplications out.
      • Changed the patch format to version 4 to allow for MIDI CC values to be bound to ValuedControls. Old patch format versions 2 and 3 should still be readable, but older Wren versions will not be able to read the new version 4 patches. Also allowed for more options to be added in the future with better backward compatibility. This change was needed to allow for CC to knob associations to be stored into the patch.
      • Added an item on the context menu for knobs, sliders and selectors for associating a MIDI CC with them. Most knobs, sliders and selectors have support for this, not all. When a a CC is associated with a control it will be painted with a blue border (when not focused, otherwise the indicator color will be red still). The associated CC will also be shown in the hint popup when it appears, and the popup menu will show the currently associated CC as well.
        Also added a 'learn' feature to quickly assign the last CC received.
        Also added a CC un-assign item to the popup menu, and and un-assign button in the MIDI CC assignment window.
      • Added a MIDI channel selector to the Settings Screen [F3] to select what channel to use for the non MIDI modules (that is: passing on CC values). This can be set to listen to all MIDI channels. The MIDI modules have an independent channel selector.
      • MIDI CCs on knobs are working now, the CC directly controls the knob, which in turn will change the value in the synth – dezippering is not used on MIDI control.
      • quick channel select illustration Added a couple of quick select buttons to set the the amount of visible I/O channels more easily.
      • Some more work will be needed before general OSC will actually work, but the editor supports it now. Made code for general OSC support too now but did not test it yet. Controls are addressed by the OSC pattern /<synthname>/<modulename>/<controlname> and they want to see a float value in the range 0.0 to 1.0 for full travel. Every control that allows for MIDI automation can be OSC controlled as well. When a control is not automatable this will be shown on the control's popup menu by having an exclamation mark in the first line.
      • Made selectors focusable, they will get a red border to indicate focus (and a blue border to indicate that a MIDI CC was associated, or fuchsia when both focused and having CC control). Selectors also listen to the arrow up/down keys now when they have focus. Knobs will get a fuchsia border too now under the latter condition. Focusable controls will get focus now when the mouse cursor hovers over them regardless of the mouse wheel mode selected.
      • Output 10 of the Counter and the ChebGen module were not working, fixed now.
      • Demux module was not working, fixed.
      • Knob controls for Pan and Fade modules were incorporating the input type selected, not handy, changed that. It is a level conversion on the control input only now. This will probably break some patches … but it was just not good.
      • Fixed memory leaks.
      • Made the 'unfocus' feature work better with a 'sort of' hidden control that will get focus when knob focus gets lost. The 'use unfocus' feature is on by default, this can be changed from the Settings Screen [F3]. The unfocus option causes controls to loose focus when the mouse moves out.
      • Fixed sample and hold (which stopped working properly after making it rate smart).
      • Seem to have weeded out the access violations on the granulators.

      in version 2015.7.12.0

      • Added an option to use the standard module color (the color as shown when you hover over a module button in the module selector) on modules newly added to a patch. This is on by default but it can be turned off in the Settings Screen [F3].
      • Added a menu item on the module popup menu for setting selected modules to their standard colors.
      • Some hints on module controls were shown where they should not be and also some were not shown that should be shown. Also there were some double hints. Sanitized the hinting stuff a bit.
      • Added a second type of folding to the wave wrapper based upon a state machine that I found here. This mode is not amplitude compensating, the output range is directly set by the mirror positions (and the modulation on that). This second mode is probably a bit more efficient to calculate. Type 1 is the old behaviour with range adjustment after the wrap operation, type 2 is the new uncompensated behaviour.

        Also added a third type. This is my take at the smrl variation as found in the link from the previous section. The wrapping is as for type 2, except that the modulation is not used to change the mirrors and the folded signal is not sent to the ouptut. What happens instead is that when the folder changes direction the modulation signal is being added to the current output signal. When the output signal goes over 1.0 it is reset to -1.0. Also the modulation works different in this case, the modulation input and knob are added for this mode instead of being multiplied.
      • ChebGen - Chebyshev polynomial module Added a Chebyshev polynomial module (ChebGen). It can be used as a wave shaper, or as a rate multiplier (harmonics generator) for sine shaped signals. It provides the order 2 … 13 polynomials. Order zero would be a constant '1' and order one is just a copy of the input signal, so these are both not provided as outputs.

        Added a tri mode to this module, which will do the frequency multiplication for triangular waves, thanks to Scott Gravenhorst (Jovianpyx) for coming up with a nice solution for the odd order cases. Below, the first image is Chebyshev mode and the second is triangular mode, both for order five (top four traces being input waves, bottom four the resulting ones from the effect):

        ChebGen module in Chebyshev mode order five for some input wave formats ChebGen module in Tri mode order five for some input wave formats

        Also see the forum post I made about this.
      • Added a couple of modes to the TerraGen module, it now has (with prod = x * y):
        off          : out := 0;
        inx          : out := x;
        iny          : out := y;
        xy           : out := prod;
        curtis_roads : out := ( x - y) * ( x - 1) * ( x + 1) * ( y - 1) * ( y + 1);
        bass         : out := Sqrt( Abs( x * x * x * x + y * y * y * y * y - x * x - y * y - x * prod * y));
        lead1        : out := ( x - x * x * x / 12 - y * y / 4 + 0.5);
        hollow_lead  : out := ( -5 * x / ( x * x + y * y + 1));
        pulsar       : out := Sqr( Sin( x * x + y * y));
        flat_growl   : out := Sqrt( Abs( ( 1 - x * x) * (( 1 - y) + y * cos( 1 / ( x * x + 0.01))))) - 1;
        atan         : out := ArcTan( 15 * prod) / HALF_PI;
        softclip     : out := prod / 1 + Abs( prod);
        third        : out := 1.5 * prod + 0.5 * prod * prod * prod;
        chebyshev2   : out := 2 * prod * prod - 1;
        chebyshev3   : out := ( 4 * prod * prod - 3) * prod;
        chebyshev4   : out := ( 8 * prod * prod - 8) * prod * prod + 1;
        chebyshev5   : out := (( 16 * prod * prod - 20) * prod * prod + 5) * prod;
        chebyshev6   : out := (( 32 * prod * prod - 48) * prod * prod + 18) * prod * prod - 1;
        chebyshev7   : out := ((( 64 * prod * prod - 112) * prod * prod + 56) * prod * prod - 7) * prod;
                  
        Also added four and eight times up sampling modes to the TerraGen module – fast, better and best. And removed the upsampling stuff again, it was too slow. Aliasing is beautiful! … or remove it at the source side, it works OK with sines not too high in frequency.
      • Bugfix for MixQ1to1, the mode did not change when the mode setting was altered.
      • Rearranged the Settings Screen [F3] a bit.

      in version 2015.6.27.0

      • Removed some clicks from the basic envelope modules EnvAR and EnvARRetrig.
      • Moved the MIDI modules to the I/O tab, but the MidiPlayer to the Seq tab.
      • Added colors on the tab buttons for the module selector, showing more or less the same color as the popup module examples from the selector.

        illustrate colors on module selector
      • Added popup hints for the settings, graphs, debug and volume control views. And made a user setting to disable that – the feature is on by default.
      • Moved all debug related settings from the settings view to the debug view.
      • Fixed a bug in the color mixer code which caused border colors for modules to be off. This was barely visible but it showed itself when I tried to color the buttons on the module selector.
      • Removed the design notes from the designer window (FrmStore.pas) and stored the text into a file module_design_hints.txt which will be distributed with source code releases.
      • Suppressed some of the Delphi RTTI by using
        {$IFNDEF DEGUG}
          {$WEAKLINKRTTI ON}
          {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
        {$ENDIF}
                  
        in the main project file. This strips off about 13% from the exe size.

      in version 2015.6.21.0

      • Another error in displaying the envelope curves … the range settings were all taken from the attack range – fixed now.
      • Added some glyphs for a bunch of new modules, it got all a bit confusing with the copied ones.
      • Updated some help text, some new modules still had text copied from the modules they were copied from.
      • Fixed the tab order for some new modules.
      • Decreased the spacing between module buttons on the module selector a bit to get room for more module types. Resized all module glyphs to 20×20 px. to make that fit.
      • Changed the default font for the module title to Corbel 8 pt bold, seems lighter but more readable than the previous font used. Only thing is that it has 'oldstyle' numerals, that is lower case. When this font is not available (as in Windows XP apparently) the module titles will use the old font (Small Fonts 7 pt bold). But read on …
      • Made user selectable fonts for module titles and module text. It is probably best to keep using Small Fonts for the module text, as some of the text was measured out with that font, but one could still change the color.

      in version 2015.6.19.0

      • An instant crash was reported by a user, no clues yet.

        Inspecting the code I did find a bug in the audio handling. When it ever happens that there is no compiled patch and the audio stream runs, the audio I/O processing will write out of the array bounds of the audio out buffer … seems likely to be that … on a slower system audio I/O may run before the patch got compiled. Also it would be worse with largish audio buffers (seeing that user's buffer size is 4096, using 512 or so here). Fixed that issue.

        It fixed the problem too.

      in version 2015.6.18.0

      • Made a WaveWiper module after a schematic made by PHOBoS, which he in turn based on a Voltage Splitter idea published by Jim Patchell. Not sure if it does exactly the same thing, but it is quite a nice wave shaper I think. This module is rate smart, it runs at control rate when all inputs are control rate signals, at audio rate otherwise.
        WaveWiper - wave wiper module
        InSig1   := FInputs[ i_in1  ];
        InSig2   := FInputs[ i_in2  ];
        BreakSig := FInputs[ i_break];
        Mute     := SignalToMute( FInputs[ i_mute]);
        FOutPuts[ o_out1] := ( Max( Insig1, BreakSig) + Min( InSig2, BreakSig) - BreakSig) * Mute;
        FOutPuts[ o_out2] := ( Max( Insig2, BreakSig) + Min( Insig1, BreakSig) - BreakSig) * Mute;
                  
        With a sqare and a triangle input modulated (on the break input) by a sine wave:

        wave wiper example output
      • And while wave warping .. made a WaveWrapper module too. This one will mirror the input signal in a user set low and high bound limit. The limits can be modulated by the mod input. This module is rate smart.
        WaveWrapper - wave wrrapper module
        Modulation  := Normalize( FInputs[ i_mod] * FInputs[ i_modamt]);         // Modulation amount
        LoMirror    := FInputs[ i_lowlevel ] - Modulation;                       // Get low mirror and subtract modulation
        MirrorDelta := 2.0 * ( FInputs[ i_Highlevel] + Modulation - LoMirror);   // High mirror gets modulation added. calc mirror distance, times 2
        Mute        := SignalToMute( FInputs[ i_mute]);                          // Get Mute multiplier
        
        if Abs( MirrorDelta) < 1e-6                                              // When mirrors are too close to each other
        then FOutputs[ o_out] := 0                                               // make an exception ...
        else begin
          Amp    := 4.0 / MirrorDelta;                                           // Amplitude reduction factor due to wrapping - times two
          Signal := MathFloatMod( FInputs[ i_in] + LoMirror, MirrorDelta);       // Lift signal by LoMirror, and take signal modulo 2 * Delta
          if Signal > 0.5 * MirrorDelta                                          // Reflect bit above Delta back
          then Signal := MirrorDelta - Signal;
          FOutputs[ o_out] := Normalize(( Amp * Signal - 1.0) * Mute);           // Bring signal into -1, 1 range and apply Mute signal
        end;
                  
        With a sine wave input (range -1, 1), the low level set to about -0.6 and the high level to about 0.4:

        wave wrapper example output
      • Made a logistic map module. This one is rate smart, driven by an input clock signal. Not sure yet what the definitive form will be. R values below three and different start values seem not to interesting, so I may remove those. And the cross fade works good only when the clock rate does not change .. so I may change this into an oscillator module.
        LogisticMap - logistic map module
      • A new LFO module based on strange attractors, a Lorenz type and a Rössler type. Both the Lorenz and Rössler systems are 3D, so I made three outputs for both types.

        Made an audio rate version too and had some trouble to get the calculations stable for that. It needed quite a bit of over sampling to get it right (or actually the time step must be smaller than some critical value). For a sample rate of 44k1 12 times over sampling for Rössler (time step ⪅ 0.08), 15 times for Lorenz (time step ⪅ 0.02) seem to do the trick). For higher sample rates the amount of over sampling could be set lower but it betters the sound quality too. This may have to be adjusted later.
        AttractorLfo - attractor LFO module
        Attractor - attractor module
        Maybe these should get some means to set initial conditions, but otoh they seem to visit a lot of places already.
      • » Decoupled the connector color from it's signal type. In the designer the signal type should be set now and the default wire color will follow that. Also made a separate color lookup for painting connectors and wires. User selected cable colors are possible now; connector colors still reflect the signal type.

        » Note : The patch version got changed to 3. The patch reader will still read version 2 patches, and previous Wren versions can read type 3 patches as well, just ignoring the wire colors in it.
      • Changed the default wire color Lime (for control rate logic signals) into Green, Lime was not very visible on most module colors.
      • Moved Quantizer to the Note tab and made it a control rate module. Also the Scala and the TransInv modules are control rate now.
      • » Made rate smart modules. These execute at control rate normally unless one of their inputs gets connected to an audio rate output, they switch to audio rate processing then.

        » rate smart modules are: Inverter, Adder, Multiplier, Scaler, Ratio, Rotator, Rectifier, MinMax, MultiMult, Median, HardClip, Not, Gate, Divider, DFlipFlop, RSFlipFlop, Counter, ADC, DAC, Compare, LogicSelector, ProgDivider, XFade, Pan, MixM4to1, MixS2to1, MixTto1, MixQ1to1, SampleAnsHold, TrackAndHold, Switch2to1, MultiSandH, Mux, Demux, DigiMux, DigiDemux, TerraGen, Average, GateSeq, Seq16, SeqSeq, SeqStep, SeqClockStep, EuclideanRhythm, PhaseDetect and ClockedDelay.

        Changed the built–in module help to indicate rate smart Modules and what rate smart–ness does.
      • Removed a tab control level, all screens are on the same tab control now, giving a bit more screen space for the settings, graphs and debug screens.
      • Made a couple of new checkboxes in the Settings Screen [F3] to control what appears in the title bar.
      • Changed the PortAudio handler in FrmMain to combine the loops for input and for output into one.
      • Sped up the Normalize function considerably by not using the Delphi internal TDoubleHelper methods. Requested it to be inlined, but Delphi seems to mostly not do that. The SignalToMute function basically uses the same code as Normalize, changed that one too.
      • FreeVerb internally works with Singles, not with Doubles (for floats) as the rest of the synth does. The standard Normalization routine would not always properly deal with that – changed the value for the smallest acceptable number to 1e-20 (-400 dB).
      • Local copy of Normalize routine in GVerb module fixed too now.
      • Error in drawing the shapes for EnvAHD (and likely EnvADSR as well). I had changed the way the knobs work and how their values are calculated, but this was not reflected in the drawing of the envelope shapes, fixed now.

      in version 2015.5.31.0

      • NOTE: The memory management was changed, the borlndmm.dll is no longer needed – and it is not available for download anymore. This needed some code changes here and there and I may not have touched all affected places, please report bugs on the forum, will fix ASAP.
      • Added a debugging aid — Find small values — to help find possible calculation bottlenecks in a patch. This can be accessed from the action menu or from the Debug Screen [F5]. This feature will search for values that are either denormal or are in the range (-1e-50 … 0) or (0 … 1e-50), small values being not zero. Hit F10 to highlight the modules having such values on their inputs / outputs or as internal signals. In the Debug Screen [F5] a listing will be made of the found modules and the pin / knob names found (Name [Title] [inputs] [outputs]), knobs are listed as inputs. For compiled versions that have profiling support (which the regular releases do not have) the small value finder is part of the profile action.
      • Changed ranges a bit for knobs in dB modes and for Mute buttons – these are off now when their value is <= -140dB. Changed the dezipper algorithm in the same way, values <= -140 dB result in zero.
      • Made an option to allow for undo after a patch was saved, it is off by default. Likewise added an option for undo after load.
      • Tab order of form and module elements sorted – some elements do not properly show focus, that needs a fix too.
      • Cleaned out the source code a bit, removed unused units from the project, unused code from units, etc.
      • Experimented with allocating memory in large chunks. This was not really a good idea; having many smallish chunks performs better. Anyway, that idea is tested now.
      • Added user definable scales for the SeqRandom module, these will be loaded from a file wren.scale which must be in the same folder as the Wren executable file. When this file does not exist Wren will create it, after that you can edit it with a text editor (like Notepad for instance) and Wren will not touch it anymore.

        For example:
        scale definitions text scale definitions view
        A Line like
        "-", []
        (which is a dash for the scale name and no notes in the scale) adds a separator to the selector's popup menu.
        This unfortunately will likely break existing patches, in that for the SeqRandom a different scale will be loaded than was saved into the patch. Also this will make patch sharing a bit fuzzy as there may be a different set of scales in effect — but then again, such already was the case for wave players and Talkie files as well.
      • Some designer changes: added a 'DynamicStepCount' property for TKnobsValuedControl and for TKnobsXYControl. When this field is set to true (by default it is false) and the value for the control goes over StepCount - 1 StepCount is fixed to value + 1. This was needed to make the user definable scales work properly. This is also used for ModTalkie to allow it to have more than 32 voice banks. Also added a design time field '_DesignerRemarks' on TKnobsValuedControl and TKnobsXYControl, this is just a comment field, it is not used at run–time.
      • Added Dyads and Triads to the default scales for SeqRandom. Should make it easier to program scale modulations using chained SeqRandom modules.
      • Made Picture and Docs properties for modules, so that information is no longer in TImage / TMemo components in the designer, which cleared stuff up a bit there.
      • Added a help item to the module popup menu showing the help text in a message box instead of in the web browser.
      • Edited help texts a bit to get the greatest nonsense out.
      • Had some inputs exchanged on the audio rate square OSCs – PWM was not working – fixed now.
      • Changed the memory manager – this revealed some allocation and de-allocation issues, Like freeing something in the Median module that was also freed by the system. Some more things like that … anyway, trying to get rid of the memory manager DLL, reasoned that it would not be needed. Ah, and in allocating a new synth patch as well.
      • Changed the knob ranges for the SeqRandom module slightly, to be able to better set fractional values.
      • Freq input was not found on Pluck module, stopping execution of the user interface. Added the forgotten freq input. Also added some exception trapping to make connection errors issue a log item only and to not prevent the system from running the patch. The wires will still be there in the editor (and they will be saved on a patch save), it is the compiled patch that does not know of the input, and so the connection will not be made.
      • Made the program write logs to a log file (wren.log in the application directory). This feature will be always on at program start, but it can be set disabled from the Settings Screen [F3], which will cause the feature to be turned off once the settings are loaded from the ini file. If the file exists it will be erased at program startup, so there will only be a log of the most recent program run.

        Example log:
          00:00 000 probing PortAudio DLL presence, looking for "portaudio.dll"
          00:00 319 PortAudio DLL found
          00:00 321 probing FFTW DLL presence, looking for "libfftw3-3.dll"
        
          ...
        
          2015-05-30 12:36:43:622 compiled synth patch
          2015-05-30 12:36:43:656 starting  PA [api: "Windows DirectSound", in: "ADAT 1 (1+2) (R ...
          2015-05-30 12:36:43:684 PortAudio was started
                  
      • Made Graphs Screen [F4] to be invisible by default, it can be enabled in the Settings Screen [F3]. Changed the drawing of the main PageControl a bit so it does not show the nearly invisible tabs anymore (there were a couple of pixels in the top left).
      • Removed the About Screen – program information can now be found on the Settings Screen [F3]. The About button there and the About item in the Help menu now go to this site.
      • Bugfix on Pluck module, on FM modulation it could end up with a negative array index, causing a program crash.

      in version 2015.5.12.0

      • Bugfix for crash at 00801B75 ... code tried to read data from a synth patch that did not exist.

      in version 2015.5.10.0

      • Changed the knob ranges for a lot of modulation attenuators … old patches will need some work … especially FM control for oscillators. The new ranges make it easier to set fractional values, like 0.5 etc. I'd probably need to change the patch format so that it stores values and not knob positions, so that on an internal change it could find the closest value. I had that before, but it was messy, so don't know.
      • Made a RangeConverter module, or a linear mapper. For each input the selected input range is mapped onto the range set by the low and high values knobs. The input ranges are chosen to map the standard LFO output ranges.

        range converter module

      • Added a four channel mixer MixQ1to1.

        quad 1 to 1 mixer

      • Changed the layout a bit for MixM4to1 to make it clearer what are mix inpits and what are level control inputs — hopefully.

        4 to 1 mixer

      • Added a new tab on the module selector – 'Note' – and moved some modules into that from the Control tab, it was getting a bit crowdy there.
      • Fixed an issue with knobs: with a high opacity setting the red rectangle indicating selection would not be visible.
      • Changed knob painting a little to remove the faint rectangle it would always show.
      • Changed VU meter peak and valey indicator fall-off rates to be more consistent over various sample rates, buffer sizes and channel counts.
      • User set lights update rate was not restored after program restart – so it used a fixed value of 43 ms … until the setting would be manually changed — fixed now.
      • Added a new connector and wire color, Lime (bright green), to indicate control rate logic signals. Changed several modules for that.
      • New wave types for LFO's — 'Random Square' and 'Random'. The 'Random' type is white noise.

        lfo random pulses lfo random wave

      • Fixed bug in template support – loading or saving a template would change the internally stored filename of the patch so that a later save action would overwrite the template and not the patch. Also made the filename visible again in the window title. Filename and patchname can be different …
      • Changed the help for the Pulses module to explain why it does not always listen to the frequency setting, also changed the default mode for it to not be 'Async'.
      • PinkFilter had denormals – fixed now.
      • The denormal preventer itself would create denormal exceptions during debugging when the value passed to it was a denormal already, changed the code to first check that condition (in debug mode denormal checking is on to be able to find such issues) – fixed now.
      • Added signal normalization to all mixer outputs.
      • Changed sensitivity of PM input for ModResonator to be 32 times less sensitive. With the previous settings subtle modulations were impossible.
      • Added patch changed warning on loading a new patch or a template. This can be disabled in the Settings Screen [F3] – 'on load warn for patch changed'.
      • Starting to add un-attenuated frequency control inputs to modules, sofar Osc, Square, Pluck, OscTrig, SquareTrig, SVF and HrastSVF. These will just be added to the value set by the frequency control knob(s).
      • Changed the detection for unconnected modules. When a module has no connectors it is regarded to be connected. When it has no outputs it is regarded to be connected when an input is connected. Finally when it has outputs it is regarded to be connected only when an an output is connected.
      • Added pass-trough mode to the mute buttons of the FreeVerb and GVerb modules.
      • Changed the order of items in the module popup-menu to make it less likely to delete selected modules by accident.
      • Added input level control for Resonator module, as it is way too loud for non impulse like inputs. For single sample impulses it's fine at 0 dB.
      • Added a debug like thingie that can be turned on in the Settings Screen [F3] – 'show lights time' which for each update cycle shows the amount of time spent in updating the lights in the user interface. This can help to set the 'update rate for lights' parameter – it would not make sense to set the update rate higher than what the system can handle.
      • Fixed bug in 'Recent Files' mechanism, menu items were not freed but deleted only – this led to memory corruption on patch load / save actions.
      • Added input type selector for Pan and XFade modules. Default type = [-1…1] to keep existing patches compatible.

        pannner module cross fader module

      • Added a new pitch shifter module which can be accurately tuned in semitones and cents. It has exponential pitch modulation and the delay length can be set to make a trade–off between quality and delay. This is a delay line based shifter, not an FFT based one, meaning it will have some 'clasical artifacts'.

        pitch shifter module

      • Changed some memory allocations to make sure they are atomic and non blocking on the real time thread. Eventually all should be made like that, but some were a bit easier to do …

      in version 2015.4.25.0

      • When I googled for Delphi gverb I got this page back pretty high … which prolly means I should actually make that gverb thingie (as there seems to not be a Delphi translation for it yet) … in fact I just did a code translate on it … a bit more work needed to make a module and then some testing of course. Would love to hear an FDN based reverb …

        Ok … here is a proto … its not 100% stable … when I change the max room size from 1000 m2 to 0.01 m2 in an instant it can produce invalid floats. Changing the relative (actual) room size is OK though, and added a modulation input for that for some nice effects. Also some oddities with the spread control still, on a patch recompile spread goes to zero it seems. Spread and Max room size are non-realtime controls, and will give zippery side effects.
        The issue with sudden max room size changes got fixed, there was some out of array memory addressing. The issue with with the spread control stay, and when the effect runs for a long time the signal levels will explode.

        Ok, spread control is fixed, there was an issue with initialization order. Also found a way to control the 'explosiveness', this was related to room size modulation, by changing the amplification factor in the FDN matrix thate is control, setting it to 0.45 instead of 0.5 seems to work without altering the sound too much. Also reduced the zipper effect a bit on changing the max roomsie and the spread by flushing all internal data on changes.

        Changed the maximum room size to be 6400 m2 and the maximum reverb time to 30 minutes with an amp factor of 0.46 currently — seems stable, 0.475 was unstable.

        Changed the spread control to multiply by 100 before it gets into the actual gverb code, the control still goes from 0 — 1. with 180 it would try to make negative length delay lines, I calculated 160 to be the limit, Super Collider seems to allow for a maximum of 100 … the web is not clear on this … I thought one to be pretty wide already … oh well 100 it will be.

        Added modulation inputs for damping, reverb time, tone, early level, tail level and dry level. These are all clipped into a [0,1] range and multiplied by the knob setting. So the knob sets the maximum value, the modulation can lower that only.

        Added a mode parameter to select between rounded or relatively prime length delays amd between the original and an alternate FDN matrix. See the module help for details. Differences are quite subtle, mode 1 is most edfficient computationally.

        The GVerb port is in the released Wren now and in the published source code too.

        Settled on the following ranges:
        • MaxRoomSize from 1 to 6400 m2
        • RoomSize internal minimum is 0.01 m2, Roomsize is a fraction 0 to 1 of the maximum size, but it will never go under the internal minumum. It is possible to get some glitchy results with this still, but that seems nice …
        • Spread ranges from 0 to 1 but is internally multiplied by 100.
        • Reverb time is from 5 ms to 30 minutes.
        • FDN matrix multiplication factor is set to 0.43, which has been stable here for a couple of days now under wild modulations. The alternate matrix uses 0.73.
      • Made the Average module clear it's internal state on a system reset, so that it's outputs will always start at zero after reset. This way an averager after a constant module will always make a smooth start from zero on it's LP output after a reset, and the HP output will always make an initial spike under those conditions.
      • Removed the dezipper action fom the Constant module's mute control so it can be used as an on/off switch.
      • Found some addressing bugs, where indexing constants from one module type were used in another … changed the scoping of the indexing constants so that such a thing can not happen anymore.

      in version 2015.4.12.0

      • I seem to have fukt the Vocoder, it is way too loud … hmm … I had changed some math to a complex data type … innocently enough it seems … build 103 seems to be ok still. Ok it was in the Convoder instead where I forgot to divide by the Attenuation factor needed (16777216 so there is the reason to be LOUD) … got fixed for this release.
      • Made a version check in the help menu, and also added button for it on the about tab. Using your default browser it will bring you to the Wren web site which will then do a version check based on the Wren version passed to it,
      • Added a light left of the CPU load indicator that lights up red for a couple of seconds when any internal audio buffer over or underflows occur. The CPU load can go above 100% before this will happen. And conversly it can go red when the CPU load is below 100%. Not that you'd not have heard it … but still … it may show the actual cause of odd things happening … my algorithms being too slow …
      • Changed the FreeVerb parameters (for the Reverb module) to their original settings, but as they are recalculated when the sample rate is not 44k1 the selected parameters may not be the best (i.e. not relatively prime) — this may need some more coding.

        For example see the JCRev implementation from the Synthesis Toolkit (this one sets the next available prime value for delay lengths recalculated for new sample rates). Might also want to implement JCRev as a 2nd reverb algorithm. Still need to do some tests on this … I did not like the reverb very much as it was … too much high frequeency tone like stuff is/was going on to my taste.

        Another one to look into could be gverb. Gverb also enforces the delay lengths to be prime. There are some other similar implementations around, some simpler (so less CPU cycles needed). For some examples see the Artificial Reverberation section at ccrma.stanford.edu.

        It seems better now, ensured all delay lengths to be prime, but no check was made to see if they are relatively prime, so under some conditions two might end up having the same length.
      • Changed the 2to1 switch, it actuallly is a 2to2 switch now connecting (in1,in2) to either (out1,out2) or (out2,out1) depending on the selection input.



      • Added two new modules, DigiMux and DigiDemux, for which the routing is sleected by a couple of digital selection inputs. A bit like the CMOS analog switches, except they are one-way only in Wren of course.



      • Added a zero / hold mode selector to the DigiDemux which in hold mode causes the last output value the be held when an output gets deactivated. In zero mode the output value will go to zero.



      • Added a programmable frequency divider. A low division and a high division factor can be set and with the select input it is possible to change the division rate between these two values. A step value can be set as well, the amount to add to on each increment on the division factor.



      in version 2015.4.6.0

      • The global tuning parameters were not working properly, fixed that.

      in version 2015.4.4.0

      • Removed all Jittik scripting stuff — took too long to get it stable — must be a bad idea.
      • Made peak (black) and valey (white) indicators on main VU meters. The peak indicators are dynamic, the valey indicators show the lowest value seen since last reset (to reset click on the textual representation for the min / max values). The peak and valey indicators currently are mono, i.e. the same for left and right, taking the extremes of left and right values. Changed the colors for peaks and valeys, peaks are white no and valeys black.
      • Sanitized the VU code a bit, and made the peak and valey level indicators to work per channel instead of Left / Right combined. Also added a valey value label for each pair of channels. The labels still show the extremess of the Left / Right pair.
      • Recolored the Seq16 module chain input and the out output to red make it show those run at audio rate. With the xfade feature set to one these can be used as user programmable wave forms.
      • Renamed parameter pasting into value pasting.
      • Changed the bitmaps and painting for knobs so that they will be painted better on non gray-ish backgrounds too now.



        The red box to indicate the knob being focused (and processing keyboard input) is now drawn around the knob as well, instead hiding behind it on the right and bottom sides. The up/down clickers were resized a bit to make rtoom for that.
      • MIDI modules were not working anymore, forgot to make them control mode modules after the slow / fast mode changes in the previous release — fixed now.
      • Changed internal scaling for envelope times to not use a time in seconds anymore but a a range [0,1] which makes it easier to have properly working time modulations. Some existing patches probably will need envelope parameters to be changed (only when the use time modulation).
      • Added a pattern module, meant to be used for rhythmic figures in a more compact way than can be done with step sequencers. Basically it is a set of eight dividers, when a divider is started it will copy the trig input to the output on the first count only. Then when the divider counted down to zero a next divider will be searched, skipping all dividers with a count set to zero. When all dividers have their count set to zero there will be no output pulses.





      • Added an EuclideanScale module, a bit after what Kyma has in version 7, can set the number of divisions for the octave, and then a pattern selection can be applied to that. An ocatave still spans a factor of two with this.



      • Added an Interpreter module, it executes forth code at control rate. This is experimental, undocumented and subject to change. For now eight inputs are put onto the forth stack. Then a deferred forth word is called from Wren. This word can be hooked by custom forth code and that code should pop the stack values to do something with them. Outputs can be set from code by calling a predefinedootput word whenever such is needed.



      • Added a Convoder module. This module performs multiplication in the frequency domain which is equivalent to circular convolution. Nothing very speciall but it can give some nice reverb like sounds based on its input signals. It can sound a bit vocoder like too when used on speech signals.



      • Added a logic selector module, that when the select input is inactive passes its inputs A resp. B to its outputs A resp. B. When the select input is active it passes inputs A resp. B to outputs B resp. A (i.e. it swaps the signals then).

      in version 2015.2.26.0

      • Had an integer overflow in the Seq16 module when the module did not get clocked. This would stop sound generation in a particular patch after about 6 hours. The Integer is a counter used to measure the time between clocks and is used for interpolation. I've put a cap on it's value
      • Implemented value pasting, but did not test it yet. The idea is to select some modules, then do a copy to clipboard for those. Then select the same module structure elsewhere in the patch, or in anoter Wren incarnation's patch, and then paste the values over to that selection to get identical knob settings there. One could copy over the steps from a set of sewuencers to another set of sequencers for instance.
        It seems to not work yet, more later. Ok, there was an error for checking structural equivalence.
        It works now.
        • Made ModCompressor about 5 times as fast by getting some calculations out of the loop and optimizing the remaining ones a bit.
        • Sped up LFOs by about 10%.
        • ModReverb was sped up by about 15% — also changed the execution order of the allpass filters to be the same as in the original code, not sure if that would change anything (sound wise).
        • Sped up envelopes a bit by using table lookups for the power function.
        All in all that got about 10% off from the current patch's CPU load.
      • Re-implemented the FIsSlow mode request flag. A while ago I had settled on executing all modules in slow mode and only the ones needing fast execution in fast mode as well (with the FIsFast flag). With the reintroduction of the slow mode flag it is possible again to have fast mode only execution. I'm getting more detailed profiling information this way and patches seem to perform marginally better too. Module constructors need to now set Fast and / or Slow mode request flags always or their DoTick and / or DoSlowTick method will not be called (the TMod base module is neither fast nor slow). [Slow being control rate / blue signals, fast being audio rate / red signals].
      • Found hat denormal numbers could occur in SVF (again) and in FreqShifter modules resulting in stuttering for some settings. Added some Normalize calls to fix that.
      • CSV player would play 11 channels only instead of the 16 it was designed for — fixed now.
      • SVF Q calculation was wrong, changed it. It is still wrong but at leeast it is the same as on the Hrast Filter now (I should change both to use 1 / Q internally instead of 1 — Q … or maybe not … to not break patches).
      • Added a clocked delay module.



      • Added a bottom label to he graph to show timing to be in milli seconds (for some reason I always think it to be micro seconds), also added checkboxes to enable or disable individual traces.
      • Changed Pad module looks.
      • The Filter bank does not work yet.
      • Could use a SeqRandVals analog to SeqRandom, but then for random non-note values — no need for that, it is easily patchable.

      in version 2015.1.31.0

      • Got some 15% off from the execution time of the FreqShifter module, still not understanding really why it takes so long to compute. Well … 70 to 80% goes into the calculation of the Hilbert transform … but then again that's just about 100 multiply / add instructions. The vocoder does a lot more than that in about the same time. Hmm … maybe the vocoder does not do that much more … also looked at the compiled code for the FreqShifter, it is not that bad really, so this is it I guess.
      • Mute on Square and SquareTrig modules was not working, fixed.
      • Triangle amplitude was a factor four low after the anti-alias modifications, fixed now (for Osc and TrigOsc modules).
      • Pad module, with an X and an Y output, both simultaneously controlled with a mouse drag.

      in version 2015.1.23.0

      • When the FFTW DLL is not present some patches will not work. They will load though but they can not be compiled. When an old compiled patch was in memory that one will keep playing, and when there was no patch there will be silence … will need to issue a message for this situation. For now it will be the vocoder module only causing this issue.
        I've changed things so that an affected patch will load and compile but any FFTW dependent modules in it will just do nothing — a one time warning will be shown for this situation.
      • When words.lpc is missing and a Talkie module is used there will be a NULL pointer issue. I've changed the code a bit such that the Talkie module will show 'words.lpc missing?' in it's bank selector control when that file could not be found, or when it could not be interpreted. The file will be looked for in the Wren executable directory. Will try to get some better diagnostics on this at a later stage (for the case of parse errors).
      • Bugfix for SeqRandom, when 128 notes were in the scale there would be an integer overflow.
      • Added an exponential FM input for Talkie, and put a frequency range clip on it from 0 — System_Rate / 2. With no FM connected it will behave like the previous version. Also changed the layout a bit to create room for more controls. Added a bank select input, which when it changes value will overrule the manual bank selector control. Also made it work a bit different, Talkie will now only say something when it sees an upgoing edge on the start input (and it is no longer possible to change the phrase (or bank) while Talkie sqeaks).
      • Added trigger mode to SR FlipFlop, so it can now be edge or level triggered. The default mode is edge triggered for compatibility with old patches, However I also changed the workings a bit such that when a reset condition is present that will always overrule the set condition.
      • Implemented anti-aliasing for all audio rate oscillators. Algorithm based on this article about polyBLEP and the implementation of the HrastOsc, which uses a form of polyBLEP as well. I've added a band limiting level control, with a default level of about 1.5 — this will change the sound for existting patches — for better usually. For some special cases like modulating a delay line or a nicely whistling patch you may want to set the B-Limit control to zero. For high pitched voices you may want to nudge it up a bit from the default value.
      • Some stability issues with the anti aliasing code, had to mod the code a bit for that — copied from HrastOsc. The BLEP stuff did not like phase accu bound over/under-flows at all.
      • Added a 'friendly' label field in the designer for value controls, so the text in popups can be a bit more descriptive — filled in some, not all yet.

      in version 2015.1.18.0

      • Moved TerraGen module from Osc tab to FX tab. Reorganized LFO tab a bit. Made a couple of modules a tad smaller.
      • Changed the Debug Screen [F5] and Settings Screen [F3] a bit so they only have the buttons needed locally in the right pane.
      • Clipped all PWM to be in an interval of [ 0.01, 0.99]
      • I renamed a 'reset' input pin to 'res' on one of the sequencers, on reloading a patch with that you may loose connections — I will not fix that, and will keep the patch version at 2 as well — sorry about that.
      • Experimenting a bit with Talkie. And … we have liftoff — Wren speaks! Now I need to think about how to select what to speak from the 1200 or so letters / numbers / words / phrases available. When Talkie grows up it may look something like:



        I settled on that FTTB. Phrase selection is messy, but for random phrases its ok now. I like this module :-) Frame speed is liniarly modulatable between 0 anf 80 Hz, sample rate is liniarly modulatable between 0 and 16 kHz.
      • Would like xfade on seq16 module … it would need to calculate a time guess between steps … hmm … it would act one step late then on tempo changes. Ok, it can actually calcultate a period estimate on each clock edge, and it can be made such that when the xfade factor is zero it would not delay. It can however produce large over and undershoots then when the actual period changes fast. This can be clipped though, such that the final value is just reached early (or late …).
        With that I think I found a reasonable implementation for the single sequencer case (it works on direction reversal too). Should check it to work for chained sequencers as well, which probably it does currently not, but this may be possible.
      • Experimenting with a Sequencer Sequencer now, to make chained seuencers more reliable and easier to set up. Especially with interpolated sequencing.



        This seems to work well for chained interpolated sequencing too (although there still is a reset related issue). The clock speed is very high, to not have to wait too long for a trace to be made.



        Top trace is clock in (trig), then clock out (trig, with bit of delay). The orange track is reset. Then the enable for the top sequencer (for 16 steps), purple is the enable for the bottom sequencers (8 steps). Green is the output of the top sequencer, blue the output of the bottom left one (not cross faded) and the the red trace is the 100% cross faded output of the bottom right sequencer. (The bottom two sequencers have the same step settings to be able to compare crossfaded and normal signals.)

        Only the last sequencer in chain should have the xfade turned up, it will handle the upstream sequeencers too then.

        An asside: It is interesting to see how close this is to multi-stage envelopes, only the sustain phase is not there. With a small mdification on the trigger LFOs this could be done too, they would need a hold input only. The sequencer inerpolation could easily be made exp or log as well, might do that anyway.



        Ok, that works … now the backwards stuff … seems to be working too :-)

        Except reset is not perfect yet when running backwards … when the last sequencer has less than 16 steps the sequencers before will not start on the last step.

        There seems to be no such thing as a perfect reset, I've added a couple of reset modes for the SeqSeq module each having a different effect on how on how patterns will be played.

      in version 2015.1.4.0

      • Removed vocoder startup glitch.
      • Made sliders, a 16 step sequencer would fit now.
      • Made an audio mixer with two busses, 8 mono inputs with pan control and two bus level output controls. Also added mute and solo buttons on the inputs. It is chainable for when more inputs are needed. The first solo button seen will be the effective one, and an active solo will suppress solo actions in a chained module.

      • Varous issues with clocks. Square oscillators and LFOs started with a low output instead of a high, divider module would start on a down going edge and the Counter had a wrong start state. Sequencer would not always reset on short reset pulses. Also there were some race conditions in the Divider and the Counter making reset give unexpected results. Also the Sequencer output was one step off, at least … after the other fixes … GateSeq needed some mods too to make sequencer sequencing working, and its reset did not work nice either.
      • Added random and clear buttons to sequencer, added an active input as well to allow for sequencer sequencing.
      • Added active input to GateSeq to allow for sequencer sequencing.
      • Added reset input to Divider module to be able to use it for sequencer chaining. The example patch here shows how to make a 16 step sequencer out of 11 step sequencers — this is scalable to 16 sequencers, and to different sequencer lengths as well.
      • Added lights for GateSeq steps, added Clear and Random buttons as well.
      • Added a button left of the control panel with the main volume controls to quickly hide and get back those controls (near the top).
      • Added a direction input for the GateSeq.

      • And there it is … added a seq16 module. This one can sequence notes or values, it can be used for sequenced sequencing. It has a direction input and a random and clear buttons.

      • Directional sequencing is not direcly compatible with sequencer sequencing as shown in the image to the right. You'd need more logic for that, try to use a GateSeq instead of the Counter.
      • Source code release.
      • so anyway … your typical 41 step sequencer with gates, trigs, notes, volumes and filter cutoffs would look like:

      in version 2014.12.30.0

      • Added a VU meter clear on audio stop option, the option is on by default. Also can double click on any VU to clear them all.
      • Some code refactoring for file selectors and display editors into a TKnobsTextControl widget.
      • Images for mute buttons
      • Increased maximal compresssor gain to 64 dB.
      • Color modulation for most noise modules was not working, fixed that.
      • Added a basic vocoder. Note: this needs the The FFTW DLL to be present.
      • Support for two template files, a save function in the file menu and two load buttons in the editor. Also added export to file for selected modules and import from file to addth modules in tha tfile to the current patch … however that still sucks as the added modules will not go into drag mode …

      in version 2014.12.22.1

      • Source code release.

      in version 2014.12.21.0

      • MidiPlayer needs reset input and done output, the system reset does not work on it properly either.
        Changed channel offsets, depending on midi file type, ch 1 will be the first usable channel, skipping the meta channel for type 1 MIDI files. Added reset and done, fixed reset issues.
      • Issue with channels on MIDI modules, fixed now.
      • Program crashes on exit with incoming MIDI it seems, put a gard on that.
      • Issue with MIDI command processing on other channels than ch 1 — thank you Steve for testing :-)

      in version 2014.12.20.1

      • Oh fuck … and now it does not start properly when an ini file is present, selected devices are forgotten. Ok, it will in Legacy mode, but not for PortAudio mode.
        Ok, seems to start now properly with and without ini file and it seems to remember the device selections for both legacy and PortAudio modes properly noww.

      in version 2014.12.20.0

      • Added 'lowest' and 'highest' value outputs to Median module. Also allowing now for even valued settings for the bin size — a binary or trinary sorter can be made this way. Note however that an even setting for the bin size results in the median being the average of the middle two values (after sorting) and thus that this needs not be a value that was actually present in the input stream. The lowest and highest values will always be values that were present in the input.
      • Working on a simple MIDI player thingie — implementation will likely change.
      • There was a memory allocation still left in the Median module's DoTick method, removed that one. It caused occasional runtime errors.
      • TransInv module could do an occasional division by zero, fixed.
      • SeqRandom does not recalculate the scale after a scale change, it needs the range to be changed or the transposition. A patch recompile also works. Fixed that.
      • The MIDI CC output module had no synth binding, making it unusable, fixed that.
      • 2014-12-19 : Need to review Reset behaviour, the response to the Reset button. It may not actually cause a change in output values for some modules?
        The envelope modules did not set their envelope values to zero after a global reset indeed, fixed now.
        This may not not be completely fixed yet … reset should last for 'system_rate / control_rate' periods I think.
      • When wren.ini is not present things will go wrong terribly … made it survive that situation.

      in version 2014.12.17.0

      • I've installed Asio4all … ever since the RME ASIO driver works too, and I have 8 in and 8 out channels available :-)
      • Not all channel dB labels were updated, fixed that.
      • Added an ASIO control panel button on the device selection screen.
      • Added an audio test button on the device selection screen.
      • Added ASIO channel selection on the device selection screen.
      • Some bug fixes in device selection, and a better reset after device changes … such that the device test function could actually work without restarting Wren.

      in version 2014.12.12.0

      • Better colors.
      • Bug in TimeToSeconds routine, the conversion produced an invalid index. Fixed it.

      in version 2014.12.11.0

      • Added a couple of new modes for the Constant module, one of them being Note mode, for easier note selection.
      • Changed LfoTrig Ready ouput to only fire after a cycle was ran, and not just when being idle.
      • Added a TransInv module for note Transposition or Inversion, it can do so with a modulo operation being applied.
      • Found a better way to color modules. In the Settings Screen [F3] you can set a default color and an opacity value which determines the color intensity.


      in version 2014.12.10.0

      • Added a GateSeq module, an event sequencer with per step 'off', 'trig' or 'gate' mode select.
      • Added a Pulses module, generates pulses with random intervals, either synced to an internal clock or free running. The 100th module type!
      • Added Exponential random distribution and Lambda control to RandomWalkLFO module, as a sort of jumpiness control.
      • Added Exponential random distribution and Lambda control to RandSig module, as a sort of jumpiness control.
      • Added a search option for un-connected modules (in the Edit menu, or use Ctrl+U).
      • Frequency range selector for RandomWalk LFO was not working, FM was not working either, fixed.
      • Put a guard on negative module top offsets to avoid ghost modules to be in the patch. This might solve bugs 2014-11-28 and 2014-12-08. Some old patches may look a bit strange after loading, as any ghost modules will be made visible now.
      • Changed the patch writer such that it will no longer write out modules with negative X or Y positions, it will instead shift all the modules by the largest offset it found.
      • Some bug fixes for sequencers and for the morse generator for division by zero and an undefined string index respectively, these were related to Port Audio and thread issues. Same sort of issue with XYScope, fixed too by making history an internal signal instead of a patch signal.








      in version 2014.12.6.0

      • Error in Delay module. When using PortAudio the setting of the delay length is from a different thread than the module execution. It did happen that way that the memory would be invalid at execution time. Fixed this.
      • Some issues with memory allocation for delay based modules and the EuclidianRhythm module. Memory was allocated and de-allocated form the audio thread. I changed that. Ah, and also the Under/Overflow debugging was a violation … moved those to the Lights updater (out of the audio thread). That way the normal memory manager can be used it seems — except maybe for debug messages — hmm … nope it can not.
      • Changed the implementation for multi channel such that it will open up to 8 input and output channels but never more than the Port Audio interface reports to be present. In theory this should give multi channel IO under ASIO (at least with my RME fireface UFX — except that ASIO refuses to work at all with it). Currently there is no way to specify which channels will be used though. I did some measurements on audio round trip times, see here for some results on my computer — not breath taking, but better than it used to be.
      • Device selection sucks … it is needed now to restart Wren when other Port Audio devices are selected — there is no need for that really, it is a bug. Changed things a bit, this seems to help. Also moved the buffer size selection to the wave device selection dialog.

      in version 2014.12.3.0

      • Improved XY scope a bit, it's not super but it found some bugs for me already.
      • Added a Compare module for signal comparisons, > = and < outputs. Equality holds when the inputs differ no more than the value set by the equality range control.



      • Added a 12 to one cross fading multiplexer.



      • Added a HardClip module for hard signal clipping, not really meant for audio distortion but more for signal conditioning.
      • Bug in delay module where the longest delay setting produces no signal output at all (on the variable delay time output). Fixed it, the interpolation code was wrong, every exact integral delay time (in terms of sample counts) would produce silence as the output on the variable delay time output.
      • Bug in the RandSig module, it should produce smooth glides from one random value to the next, but it has jumps in the output value. Ok, solved, it was smooth for the special case of non inverted full output swing signals only.
      • Bug in cents calculations, for oscillators a change of 25 cents amounted to a semitone … and for the Resonator module it was not working at all. Fixed now.
      • Error in the naming for the displays for cents, they were called 'fine' instead of 'cents' and could thus not be found back by the program — fixed.
      • I've made patch reset on render start optional, by default it will be on. When it is on the patch will be reset when rendering starts, when it is off rendering will continue from where the patch was. Setting can be changed from the Settings Screen [F3].
      • Changed the Rotator to map an input swing from zero to one to a rotation of 2 * PI radians, this was just PI. Old patches will rotate twice as fast now.
      • Changed the Median module to have a larger maximum on the number of bins, 99 now.
      • 2014-05-17 : The terraGen module has some issues to be solved. Seems fine now after adding input clipping, have been using it in couple of patches.
      • Added info popups to more valued control types, like mute buttons and mode selectors.
      • Added mouse wheel support for knobs, this is off by default which can be changed and configured from the Settings Screen [F3]. On my laptop's mousepad two finger click drag will result into mouse wheel actions, and with that one a sensitivity of 50 seems about right. For fine control use the arrow up down keys while the mouse is still in the control.
      • Added a 'use unfocus' option that is effective only when mouse wheel support is on. When active and the mouse moves out of a mouse wheel controlled control the focus will be set to the channel one output volume control. This option is on by default.
      • Changed the default width of the panel with the main volume controls to only show channel 1. This can be changed by using the splitter to the left of it. Still … for the time being only channel 1 will be working for audioio. Also made the volume controls and device selectors for the non-working channels invisible for now and hid the unusable I/O connectors on input and output module as well. Also all the non working multi channel code was removed, this will have to be done differently once using Port Audio. The device selector was changed to allow for only one input and one output device to be selected, for multi channel operation the devices will have to support multi channel operation.
        Added experimental support for Port Audio, this needs a portaudio.dll file to be present in the application directory or somewhere on the Windows path. It will not work properly for multi channel I/O yet (i.e. ASIO). For Port Audio the buffer size needs to be set smaller than for legacy mode, large buffers may perform worse.
      • Sped up calculations a bit by getting rid of some FModulo operations, and optimizing the remaining ones with some assembly code.
      • Removed the global Scala related settings, any future Scala support will be through the Scala module.
      • Added a Scala module, which can read in a Scala scale file (.scl) and a Scala keyboard mapping (.kbm). It translates incoming note values according to the Scala files loaded into a signal suitable to control FM inputs. For this to work as intended oscillator frequenciy should be set to 440 Hz, for filters likewise.
        Sofar I've tested this only for a trivial mapping using all keys 1:1 with a 12 TET scaling. This works, but there probably are some subtleties that I missed …
        And indeed some other scales I tested give output differing from what Scala computes. Anyways …still experimental.
      • Text sequencer bug, it does not work at all, and causes a division by zero. Ah no … it wants commas, and it does not like spaces … fixed the spaces issue, the commas are needed still. And the help was wrong, it said spaces where commas were meant. It still needs a new parser … as mentioned elsewhere.

        A couple of changes on it: values can be just values or notes, a modiefie like Hz or s can be part of the value when it is numeric. Values need be separated by commas and after a value a repeat count can be set separated by a colon (:) from the value. When there is no repeat count the implicit repeat count is one. Anything not understood will be interpreted as a rest. A rest or a repeat will not trigger the gate ouput (new to).

        An example string 'A1:2, 333 Hz:3, _, C1' first A1 will be output for two clock periods, then 333 Hz for 3 clock periods, then a rest for one clock period ( extending the 333 Hz signal for yet another clock time) and finally C1 for one clock period.

        Solving:
        2013-11-20 : Make durations for the text sequencer, and a more forgiving parser.
        2014-11-30 : For the text sequencer add a way to play rests, that is add a gate output and some special character to indicate that a rest should be played, e.g. a note time slot is to be skipped.

      2014.11.9.1

      • Added atan mode to TerraGen module, to be used as a soft clipping function. I've been complaining about the TerraGen a bit in the past, but it does not seem too bad now. I did add some input clipping to it, maybe that changed things. It did not get too much thought.
      • Had forgotten to turn on the MustSave flag for the display of the Notes module, so notes were not saved. Fixed now. Also text values were not quote escaped, so when a quote was added to the text the patch would not load anymore after a save. Fixed that too.

      2014.11.9.0

      • Instability issue with SVF when Q = 0, fixed. In older versions set Q no lower than 0.01 (1e-2).
      • Start of rendering should first issue a reset. The sequence F9 to stop the patch, then hit reset, then start rendering does not seem to work. Will have to look into this.
        Two things, FixZippers was not called on render start, meaning knob values would be stuck low for a while when a patch had not run before render start, and Reset was not issued either, meaning rendering would start off from where it was. Fixed that.

      2014.11.7.0

      • Bugfix xfade module ... and the same one in Pan module - had mixed up the knob and the control input
      • Bugfix pluck module, the mute button was not working.
      • Added random distribution controls to SeqRandom module, and removed the change all input from it. Also added random distribution to RandomWalk module.
      • Added color control modulation to Noise, NoiseTrig, NoiseLFO, NoiseLFOTrig and RandSig and modules.
      • Added modulation for the alpha parameter on the Average module (untested).
      • Added a phase detector / filter module, as a building block for PLL circuits.
      • Fixed the chart mode to work for non debug/profile builds again.
      • Pluck oscillator suffered from denormals .. fixed that.
      • Added a Morse generator.
      • Bugfix for the RandomWalk module, the random distribution stuff made the code essentially non working.
      • XYScope module, this is not functioning properly yet.




      2014.10.19.0

      • SeqRandom, a random notes module. A scale can be set with a base note and a lowest note and a highest note. A step count can be set and on each trigger a next random note fitting the set conditions will be played. When the last step is passed the sequence will repeat from the start. A pulse on the random input will select a new set of notes for the sequence. Sequences will not be saved with the patch.
      • Made the reverb module to scale with the sample rate, it should sound better at higher sample rates now.
      • Made new images for signal polarity selectors on LFO and Envelope modules.
      • Made a multi sample and hold module, one trigger input controls multiple sample and hold units in one module.
      • Added some extra in / out pairs for the multi multiplier module.
      • PluckOsc added, a Karplus-Strong model.
      • New mixer, T1to1, a one input chainable three channel mixer.
      • Logic divider forgot to clear the ResetFlag, so after one reset it would stay in reset mode - fixed that.
      • Fixed a bug in most of the sequencers .. had 'optimized' some code, they were not working at all anymore.
      • Added a new FX tab and moved some effect modules there. Also moved the wave player module to the OSC tab.
      • Added a zero crossing based frequency detector.
      • Added a resonating filter with decay instead of Q control.
      • Added a Bode frequency shifter module. The Bode shifter shifts all frequencies by an equal amount, meaning that harmonic relations between overtones willl be changed.
      • Added a running median filter. The median of a set of values is calculated as the middle value of that set after the set was ordered small to large (only odd sized sets are supported to a maximum size of 25). On each clock a new value is added to the set and the oldest value drops out, then the median is calculated and sent to the output.
      • Changed some initialization stuff, had to modify the HrastUnit a bit for that.


















      2014.9.23.0

      • A counter module, can count binary or sequentialy, up or down and it has a reset input too.
      • An ADConverter
      • A DAConverter
      • Fixed bug in pan module, the knob would go center to right only, not left to right.
      • Added a multmult module, where four inputs are multiplied by one common multiplier into four seperate outputs.
      • For BitCount = 1 I've changed the gate module back to it's old functionality. The boundary conditions were a bit odd with the new code.
      • Added level modulation to mixers MixM4to1 and MixS2to1.
      • Added position modulation level to Pan and XFade modules. The controls are fully open by default to be compatible with older patches.
      • Added control depth knob to formant filter. The control is fully opened by default to be compatible with older patches.
      • Made glyphs for output mode selector on some LFO and Envelope modules.
      • Made glyphs for wave shape selector on some OScillator and LFO modules.
      • Made a compressor, or actually it's an AGC more. It is feedback based in that it tries to maintain a set reference level at the output. In doing that it can both apply gain (for weak input signals, with a maximum of about 30 dB) or reduction (for strong input signals, also about 30 dB). Reaction speed can be set with an Attack control and fallback is controlled with a Release control. A pre-amp is included to be able to shift the set point easily.
      • Made a KleeBit module, which is 8 steps of a Klee sequencer. The bits can be chained to make a 16 or more steps Klee sequencer .. with some external glue.
      • Added a 3dB/octave (10db/decade) pink filter, to pinken up white noise.

      2014.8.23.0

      • Instability issue in Flanger/Chorus module solved.
      • Output types for all LFOs: 'Normal', 'Inverted', 'Positive Only', 'Negative Only', 'Positive Only Inverted' and 'Negative Only Inverted'.
      • Activity light on NoiseLfo was not working.
      • Output types for AHD and ADSR envelopes: 'Normal', 'Inverted', 'Normal Negative' and 'Inverted Negative'.
      • Looks like the knob popups can be hanging at times ... made a breakout for it F8 will work.
      • Colored border on modules, user selectable.
      • Slow fall off on the display module (VU meter) .. instead of drop to zero immediately ... which sorta worked with the old lights update regime but not at all with the current one.
      • Finally found a nice compact form for an Euclidean rhythm generator (a variation on Bresenham's line drawing algorithm, read more about that here), and turned that into a new module. [On the sequencer tab, 1205]
      • Added a fast mode to the display module to have the meters react faster. This sometimes better fits the data to be displayed.
      • Added a CSV data module, it can read a Comma Separated Values file with up to 11 columns of data. The data is being clocked out with a trigger input, it can play forwards or backwards and there is a reset input. There is an option for playing the file data once or looped. When the mode is set to once the data sequence will start again after a reset signal on the reset input (or the global reset button being clicked on). Comments in the CSV file start with a # character, when a comment is on a non-data line it is ignored when the file is read, when it is at the end of a data line it will be displayed in the module for that step in the sequence. [On the sequencer tab, 1206]
      • Added digitizing to the logic modules, they used to convert the input into a single bit value (which is still an option) but they can now digitize to longer bit vectors as well. The logic function is then executed on the vectors instead of the single input value. Also changed the XOR and XNOR functions to perform odd and even parity respectively. Added two new functions ONE and NONE that behave like the old XOR and XNOR functions did, the output going active / inactive respectively when precisely one input is active. The bit vector stuff will not work on these two new functions.

      2014.6.4.0

      • 2014-04-08 : Floating point overflows in places ... some input clipping is needed, but not sure why signals get so large in the first place.
        Okay .. it was SVF instability ... probably fixed now.
      • There was still debug info present in the release build, removed that, shrinking the exe size quite a bit.
      • Changed the way rendering works .. it does not generate live audio anymore. The thread's priority level is set to 'idle' so it wont hog a complete CPU. A limit can be set for the maximum recording duration, or it can be set to zero (or blank, or any string value that can not be translated into a float value) to make it record till the file reaches a size of 2GB. At any time the rendering can be stopped which will close the file. Likewise, leaving the program will close the file too .. or when an exception was raised .. the file may be shorter then than expected.

      2014.6.3.0

      • Set all floating point exceptions to be masked for release version. Also clearing any exceptions after Tick executed (so errors wont propagate).
      • Added a property selector utility to set the value for the ControlType property on knobs more easily. This is a module design time feature only, it changes nothing for the synth itself ... although ... for some odd reason this halved the size of the executble tho o_O .. for the curious, it's in the knobs2013.pas unit.
      • There seem to be some numerical instability issues in one or more of the modules ... the program crashed on me last night. This may have to do with FPU exception masking and how windows deals with those, when the masking is set different from the windows masking even something simple like Abs( reasonable_value) my trigger a floating point exception.
      • Added sum output for scaler module, it gets the sum of the other four outputs.
      • Made 'inverted' output for envelop module, this one get the difference between the peak value of the normal output and the current value of the normal output. The idea being that with this output it is easy to make something get louder when something else gets softer. Using the peak value will prevent the inverted ouput from going negative, but it will take some time to settle. Also added a peak decay option on this with selectable time.
      • 2014-06-02 : Render to file option. Rolled my own RIFF writer for this .. may do a RIFF reader too now .. it seems not too hard ... anyway, did some tests and the WAV played in VLC, WMP and CoolEdit here, so guess they are fine ... no file length checks tho ... so be careful when it goes over 2 or 4 GB, the code could do 4 I think.
      • Had to split the knobs2013 componenents into a runtime and a designtime package. Turns out that in order to be able to make design time property editors on has to specify an extra compiler option -LUDesignIDE (or elese Delphi will not find it's design interface ... ), but this causes the program to be linked with runtime packages ... which then in turn causes users to complain ... Anyways, when you want to compile your own you need to uninstall the knobs2013 knobspackage and then install the new Knobs2013Design package. Also added a couple of missing icons to the DCR file. This explains the file size halving too.

      2014.5.29.0

      • Made popup menu's for selectors, so you can now right click on say an Lfo speed selector or a mute button to select a value directly instead of clicking to cycle through the values. Selectors currently are indicated by a yellow border.
      • Working to port over a FlangeChures and a PitchChanger I had laying around since the Turbo Pascal days .. or was that Borland Pascal ... old anyway .. from the days one could directly make interrupt code in Pascal. There seem to be some overflow issues to be sorted out. Some issues still with negative rates for the frequency shifter.
      • Removed profiling code for releases, this makes the program run a bit faster.
      • Fixed hint / popup window for knobs to keep displaying when the value is changed with the mouse. F8 will show all knob popups .. not too useful actually.
      • After patch recompile dezippers are set to the final value immediately now to stop the slow glide-in that happened.

      2014.5.24.0

      • Changed the module designer a bit, such that the module's PageName property will be automatic if the module happens to be on a TTabSheet with a non-empty Caption.
      • Changing some signals for AHD and ADSR modules to control rate to make them more efficient.
      • Changed the trigger lights on AHD and ADSR modules, they are on now when the envelope is in some active state, i.e. they now indicate envelope activity and no longer the presence of a trigger signal. This works better for very short trigger pulses taht would not be visible otherwise.
      • Removed the denormalized exceptions from the floating point exception mask to be able to find cases of denormalized numbers. As a result of that I've added Normalize() calls in a couple of places (Including the HrastUnit).

        This code will only be active in debug compiles of the program, to help find execution speed issues.

        All of this seems to have sped things up a bit.
      • Made update rate for lights user settable (settings page - press F3).

      2014.5.17.0

      2014.5.12.0

      • Interpolating random signal generator. Moving from current value to random value at a rate determined from the frequency it runs at - smoothly.
      • Mute was working the wrong way around on Noise and TrigNoise modules. And for LFOs dito.
      • Made a built in rectifier for the intdif dif output, so it can be used for trigger on signal change operations more easily.
      • Square thingies not working unless PWM modulation is being opened up - fixed.
      • Envelopes still act strange ... seems better now, removed some code

      2014.5.5.0

      • 2014-05-01 : HrastOsc vintage knob must not be in the knob map - fixed that.
      • User selectable sample rate: 44k1, 48k, 88k2 or 96k. Also changed the control rate from being 'sample rate' / 4 to 'sample rate' / 8.
      • Moved intdif module from control page to filter page and changed it's type ID from 312 to 1003. When an old patch will not load anymore please change the type ID for all intdif modules (type = 312) to 1003 - this can be done with any text editor (like notepad).
      • Removed lights handling from audio loop and made it timer driven instead.
      • Removed some synchronization code that did nothing.
      • Some more LFO range issues fixed, forgot range for SquareLfoTrig.
      • Added Lin range for LFOs, the FM will work linear then too. For trig LFOs this means that they may never finish their sequence.
      • 2014-04-30 : AHD envelope has clicks it should not have. Had A and D shapes reversed, looks like a click on the attack phase is more acceptable than one at the end of the D phase. This may need a bit more work later.
      • Added exception handlers for synth engine crashes. This will stop audio processsing and issues a message about that .. instead of the usual four ...

      2014.4.30.0

      • Fixed square LFO speed range selection, I had a typo.
      • Made the quantizer working again, also it displays note fractions now instead of arbitrary numbers. To do that I moved the rationals source module from the project itself to the knobs2013 package.
      • Fixed LFO out lights, another typo.

      2014.4.29.0

      • Major overhaul in how knobs are handled internally. The patch version has to be changed as a result, and current patches will not be compatible with this.
      • Made a popup menu for connectors - this sort of works .. break is not quite what I'd like yet - it should break the downstream connections, but currently also breaks the upstream one. Delete deletes the whole connection tree where the connector is on. Disconnect removes this one connector from the tree.
      • Made a module popup menu too, with cut copy and delete options.
      • Made a knob popup menu as well, added default values for knobs and the default can be set from the popup. Knobs can be locked and unlocked from the popup too. When an editable display is associated with a knob editing the value through the display will lock the kob to prevent the edited value to be changed by knob movements. The lock can be undone by unlocking the knob or by setting it to it's default value.
      • For 'File Save As ...' cut out the path in the save dialog to only show the file name there.
      • Changed the connector coloring a tad.
      • Had messed up oscillator frequency calculations, they were two octaves too low, fixed now.
      • 2014-03-03 : It happens on module insertions that the lights will not be updated (properly) anymore. It can also happen that a knob on a module controls something on another module. So it looks like the patch compiler has some issues. This seems fixed now.
      • 2014-03-28 : When an envelope of type AHD or ADSR is in fast mode and the patch is then saved the values will not always be properly set after reloading the patch. The same thing happens when such a module is copied and pasted. This seems fixed now.
      • 2014-04-01 : There is an issue with Knobs and setting values ... like an oscillator frequency by default is 440.00 Hz but after some messing with the mouse on that knob it is impossible to get that value set again. Only way to get it back is to drag the knob all the way to one of it's ends, then use the cursor up/down keys to try to get past that end, then use the cursor keys to step all th way back to the value ... yuck. This seems fixed now.
      • Defaults, stepcounts and ranges for several modules were changed.
      • Sequencer chaining would crash things on a floating point overflow, fixed.
      • Adding lookup tables, my earlier conclusion that they were faster only marginally was wrong. This will limit modulations to foreseen ranges though, and some value clipping will be needed. See previous point tho .. this would be needed anyway.
      • Cleaning up code, there are duplicates all over the place and bits of unused code too.
      • Adding speed ranges for LFOs, Slow, Medium, Fast and BPM.
      • Selectable waveforms for LFOs and oscillators to reduce the amount of modules a bit. Sine, Saw, Tri and Square.
      • Changed peak level indication for main in and output displays to slowly fall off, also added clip indication with a highlight color on those.
      • Reversed knob direction for Average filter. So now the cutoff frequency get higher when the knob is turned right, like how a filter works.
      • Removed the logic gates And .. XNor and replaced those by one Gate module with a selectable logic function. The same functions are available still.
      • Removed variable input count stuff, it had been disabled anyway.
      • Fixed bug in rectifier module, full wave mode did not work.
      • removed linear LFO and OSC stuff .. need to rethink that.
      • Repeats on the up / down knobs under knobs work just once and then never again. Ah .. forgot MouseDown := False in MouseUp handler, that fixed it.
      • Added HrastSVF 12 / 24 dB resonating filter.
      • Added cents control to HrastOsc
      • Frequency fine control for oscillators added, in cents. Range -50 to +50.
      • Added dB / Linear control selection to mixers, changed some attenuaters to dB mode here and there, added some level controls here and there. Renamed some stuff now that the patch versions are incompatible anyway.
      • De-zippering added for knobs on modules, inputs to be de-zippered can be added to a knobmap (at compile time) and the process will then be automatic.
        This will not work on mute buttons that use the SignalToLogic function to decide what to do, best to use SignalToMute( FInCache[ x]) * OutLevel or somthing alike instead of an if then else thingie.
      • Added exponential FM control for wave player. To use this the speed input must be connected to a signal source unequal to zero.
        Could have made the speed input to default to 1 to solve this , but then the position input would need the speed input to be set to zero ... compiled patches ideally would know if an input is connected to solve this issue.
      • Added color to random walk module
      • Added attenuators to square LFO and OSC modulation inputs.
      • Added time modulation for AHD and ADSR envelopes.
      • Fixed bug in AR and ARretrig envelopes that became visible after adding the dezipper code, it would try to dividde by zero.
      • Fixed bug in triggered LFO and OSC modules, they did not stop running always.
      • 2014-04-02 : Module paste can still mess up the module layout, and also can get modules at negative offsets still it seems.
        Looks like I finally nailed the the problem where the module lights stop working after a new module got inserted, or rather it would stop after a module was moved in the editor ... this was partly treated as a patch change and partly as a no change, resulting in the editor modules to be renamed and the patch not being recompiled - I've deleted the editor name changing line.
      • Repeats on the up / down knobs under knobs work just once and then never again. Ah .. forgot MouseDown := False in MouseUp handler, that fixed it.
      • 2014-04-01 : Unit interpretation in displays for knobs is not correct.
        I think this is not relevant anymore.
      • Fixed some graphics stuff that got broken over the months.

      2014.4.1.0

      • Window state saved in ini file, when the window was maximized on exit it will be set maximized again when the program is restarted. Minimized state is forgotten though.
      • Added a reset button which resets some module state on click, there are likely issues with this as reset is not as trivial as it may sound.
      • Added mutes per input on MixM4to1 and MixS2to1 modules.
      • Solved issues with output module, it does not need to be connected anymore and there can be as many as you like. The AudioOut module now gets compiled as any other module, removing the need for special stuff in the main program. TAudioOut is now treated as special in the synth engine itself. All inputs from aydio outs will be added there and the result is then copied over to the output terminals of the synth patch. The output mapping stuffthat was used is no longer needed.
      • Solved issues with input module, it does not need to be connected anymore and there can be as many as you like. The AudioIn module now gets compiled as any other module, removing the need for special handling in the main program. It is now treated as special in the synth engine itself where values from the engine's input queue are copied over to the outputs of all the AudioIn modules present in the patch. The input mapping stuff that was used is no longer needed.
      • Solved issues with knob default values of zero to not be used.
      • HrastProgrammer contributed a HrastOsc bandlimited oscillator module, thanks Hrast!
        I Changed the module layout a bit for this one to make it fit better into the scheme, and also added a little code to it to make sure that disconnected cables on control inputs will be reset to zero.
      • Fixed the situation where knob values zero could not be a default, changed some default settings for some modules.
      • Added the program icon to the source tree.
      • Fixed the project's DPR file, Delphi had put some crap in it.

      2014.3.30.0

      • A little speed up for filters and oscillators, changed some signals to control rate. FM stuff may sound a bit different now, however I did not change the linear OSCs.
      • A patch changed warning on program exit. This is on by default but can be turned off in the settings screen.
      • Added a debug indication in the title bar for the debug version. A debug compile is less efficient and should not be released by me, but I might do so by accident.

      2014.3.29.0

      • Removed dependency on TLed component. New Source code (2014.3.29.0, build 57) published.

      2014.3.28.0

      • Stereo wave players. Wave players still need to be 44k1 samples/second 16 bit wav files, but now both mono and stereo files can be loaded. For a mono file the L and R outputs will have the same signal, for a stereo wave the mode can be set to stereo or mono. When set to mono L and R will both have the sum (divided by 2) of the left and right channels from the wave. In stereo mode the L output will have the wave's left samples and the R output will have the wave's right samples. Added an indicator to show wheter the wave itself is stereo or mono.
      • Chainable 6x6 mono matrix mixer module.
      • Source code for 2014.3.28.0 (build 56) is made public, see the Downloads section. The customif components have changed, so they will need to be recompiled too (before recompiling the new application).
      • Search shortcut changed to CTRL+F

      2014.3.14.0

      • Bugfix - some patches could not be read, and sometimes modules could not be copied because the patch reader would not accept values in scientific notation (like 1E-12).

      2014.3.9.0

      • Search function on module title, highlights found modules, F7 shortcut.
      • Support for netMIDI / tangle, MIDI over TCP.
        This got implemented by using the Overbyte ICS TWSocket component. When you want to compile WREN yourself you will need to install that component. It can be downloaded from here, look for ICS.
        A zipped up netMIDI executable is available for download from here - see the Downloads section (netmidi.zip). Will make source code available at some later stage - it is old Delphi code and it needs to be ported to Delphi XE5 first. The old code is available on request though.
        Note that MidiTangle can probably be used as well http://jcfmusic.com/miditangle.htm
      • Rectifier module, MinMax module, Integrator/Differentiator module, MIDI note receiver module, MIDI CC receiver module, MIDI note transmitter module, MIDI CC transmitter module.

      2014.2.25.0

      • Horizontal and vertical knob change modes, in addition to the circular one used now. Built in a treshold for movements as well, such that after the click a minimum distance has to be moved with the mouse before the value will change.

        Ok .. it sorta works .. except for knobs near the edge of the screen ... would have to make the mouse cursor invisible .. jump to screen center then handle the moves, then jump back to start location and make the pointer visible again .. that is for later.

        Hit F3 to go to the settings.

      2014.2.23.85

      • Made a 2D vector rotator.
      • Made a ready output on the triggered LFOs, and a sync output on the other LFOs.
      • Made a file open dialog on the wave player and now display only the file name and not the full path anymore. Old patches will still load OK.
      • Added control knobs to xfade and pan modules.
      • Added sequencer step outputs that go active when the step is active.
      • Added sequencer chain input.
      • Added some mixers, 4 to 1 chainable mono and 2 to 1 chainable stereo.
      • Fixed the problem where loading a new wave player into a running patch would crash the synth.

      2014.2.9.6

      • Made oscillators and LFOs with linear frequency control - not quite happy with those yet.
      • Ratio control module to multiply a signal by some ratio, like by 5/8 for example.
      • Added D and RS flip flop types.

      2014.2.7.3

      • Combined WavePlayer and WaveStorage modules into a new WavePlayer module that both has speed and position control. When a patch with a WaveStorage module is loaded it will be replaced by a WavePlayer module.
      • Added duration ranges (speed) to AHD and ADSR envelope modules.
      • Logo and some looks changed.
      • Help system changed so that it talks about the modules as they appear in a patch rather than as how they are seen by the synth execution engine. The help text for the modules is now set from the module designer rather than from code.
      • When F1 is pressed and a module is selected in the patch editor the help will try to directly move to the help for that module.
      • Added images to the hint / tooltip windows popping up from the module selector.

      2014.1.26.0

      • Some scrolling / panning issues .. it still sucks, but less so.
      • VU meter looks changed.

      2014.1.25.0

      • 2013-11-23 : Look at notes / octave setting and the 440 Hz reference setting, does it really have to affect LFOs too?
        No ... made LFOs independent of that mechanism and based on 12 notes / oct and a reference A of 440 Hz.
      • A wave player with variable speed playback and made a wave storage unit too, that one has a position input meant to be controlled from a sawtooth wave. The storage module seems more flexible, as it is easier to set begin and end points on the wave by constraining the saw amplitude and offset, and also by FM modulating the saw there is a form of pitch control. When the saw is inverted it can still play the wave backwards.
      • Changed the looks a bit again, new knobs mainly, shifted around knobs, texts and connectors here and there, fill color for envelope graphs added, clearer connectors.

      2014.1.11.0

      • Fixed the issue with moving selected modules being way too slow. However when a bunch of modules are dragged too high up module restacking may change the order of some modules still.
      • 2013-11-21 : in TConnector.MouseMove make the wire panel scroll when the mouse goes out of its visible area, but do not scroll beyond the current size (as defined by its module content).
        2013-11-22 : Autoscroll needed for when modules get dragged out of view and when wires are dragged out of view. Ths scrollbox should keep the point where the mouse is in view in those cases.
        Implemented "follow mouse" for cable drawing and module placement such that when the patch editor has scroll bars it is still possible to patch with it.
      • Semi fixed the arrow icons on the 'noknobs' (as used for instance for note slection on sequencers). This will need a better soluition at some stage.
      • Started implementing mousewheel messages to perform scrolling. Vertical scrolling works OK now, horizontal not quite yet.

      2013.12.31.0

      • Fixed crashing popup editors.

      2013.12.28.0

      • Ported application from Delphi 2009 to Delphi XE5.
      • Fixed delay control knobs

      2013.12.17.1

      • 2013-12-17 : S&H bug, it acts like T&H. Fixed now.

      2013.12.17.0

      • Made the lights update a factor two slower, gives room for about 10% more modules it is a bit more sluggish now tho, light wise. was about 86 ms, now about 12 ms or just a tad slower than 6 Hz.

      2013.12.16.1

      • 2013-12-16 : Locale issue - patches saved in a locale that uses a comma for the decimal point will save patches with that comma, but on read back the program insists on a dot. Ah .. and that went wrong on internal representations too. Looks like fixed ... global locale settings needed to be set OK. Reported as fixed too now. too.

      2013.12.16.0

      • Added focus visibilty and keyboard arrow handling for TKnobsValuedButton(s)
      • Sped up sine oscs by 25% or so.
      • Made the bar indicators display dB's instead of arbitraty units, the Display module also works now.
      • Got rid of the TKnobsValuedButton)s), made a new TKnobsSelector component which is smaller and looks better.
      • Added mute buttons to a lot of modules, about 30 in total, tested most of 'm. The envelopes have a three mode mute function, it can set the envelopes to pass through the signal evenwhen no trigger comes in ( pass mode, the other two modes being unmuted and muted).
      • Profiler gives some more detail, like wire performance and overhead. The lights on the modules are nice, but it seems to be like 25% overhead comes from them.
      • Changed some colors.
      • Streamlined text to value conversions, so they work the same everywhere now. It also accept both note notation styles A#4 and A4# now, and even A#4# .. oh well.

      2013.12.12.1

      • Lil fuckup with text sequencer and optimization of initialization code - it crashed the text sequencer with a division by zero ... anyway, fixed now. It needs a small modification to the TKnobsDisplay component .. didn't reflect that in the published source code yet.

      2013.12.12.0

      • Fixed tab order on modules and added tab stops on some controller widgets that didn't have it yet.
      • Made all value displays editable (so values can be set with better resolution than is possible with the knobs). It should also be possible this way to enter different modifiers from the default one's - like use note names for an oscillator.
      • Value displays can be 'tabbed to' as well now.
      • A new way added to open an editor window - tab to the value display or click on it and then hit enter.
      • Several small optimizations in the drawing routines, and less unnecessary screen and synth updates.
      • 'Move final' behaviour on knobs changed - this mostly affects the delay lines where new memory will only be allocated when the total time had not been changed in the last 739 ms.
      • Added offset parameters for the editor, so modules can have a fixed small border on the left and top, making it easier to select modules near the left or top.
      • Changed contact details in the about box, and in this file, to point people to the electro-music forum.
      • Added a RandomWalk module - or brownian noise as some also call it. In this one a virtual particle performs a random walk in a confined D space, when it hits a wall it'll bounce off. X, Y and Z outputs are available as outputs.
      • Made the lock mechanism on the scaler modules work, in lock and antilock modes the knobs movements are synchronized. This way it is easier to to scale a value and offset tit at the same time. See it as a modulation depth control.
      • Some visual details changed, like LEDs a bit bigger, symbols on modules lined up better
      • Envelope shapes in documentation are better now, some preset display types added for the TKnobsDataViewer component. Mainly a 'design time' item.
      • 2013-11-23 : DEL key not always working for module deletion, and then ctrl+DEL does not seem to work either. As if the patch thinks deletions are not possible. This seems fixed now.
      • 2013-11-19 : Get knob changes into undo history. Did it.
      • 2013-11-19 : Compile less often. Did that too.
      • 2013-11-18 : on edits of the text in the text sequencer the synth is reported crashable, prolly related to the one below. Sofar I've not been able to reproduce this on various 7, Vista and XP machines. Unreproducible.
      • 2013-11-18 : someone reported an OSC module disappearing - leaving some wires to go nowhere, prolly related to the one above. Sofar I;ve not been able to reproduce this on various 7, Vista and XP machines. Unreproducible.
      • 2013-11-18 : there is a bit much latency from input to output. Maybe start using directx instead of legacy audio., such would prolly improve device name displaying as well in the audio device selector. DirectX will not solve this for Vista or later ... maybe look at ASIO later, or the underlying mechanism used by ASIO.

      2013.12.9.0

      • There was a problem when pasting multiple modules with the mouse capture keeping stuck on all but one module, fixed this.

      2013.12.8.0

      • Some new modules, some bug fixes, renamed all controls, old patches will not load anymore (but forgot to change the patch version). Old patches can be fixed in a text editor BTW.

      2013.11.29.0

      • Ran into some float denormalization issues making some patches about 15 times as slow as needed. Added undenormalization on many outputs and also reconsidered the antirunaway code a bit. This now prevents absolute signal levels from both getting too high and too low (too close to zero). erm .. this could be formulated better ... the anti runaway code now also prevents float denormalization to ripple through.
      • Added some profiling code, so that one can see now how many processor clocks are needed for the tick and slowtick module methods. Run a patch for a while, then hit the profile button. This will make a file profile.html in a data subfolder of the application folder. So one can see the computational bottlenecks.

      2013.11.27.0

      • The keyboard shortcuts got some more attention, seems ok now.
      • Added a fixed delay output on delay modules - this one gives the maximum delay as set by the delay knob, it is not modulated.
      • Changed the output name for Avreage filter to LP and added an HP out. Also changed knob response for this module to give better resolution at the high end.

      2013.11.25.1

      • 2013-11-25 : New envelopes have clicks that don't belong there, ah no .. it's a gain issue ... the published version has non working gain, and on trying to fix that I got the clicks. So ... gain on the new envelopes does not work.
        Fixed now, gain works, no clicks.

      2013.11.25.0

      • Added two new envelope modules, AHD and ADSR with them nice envelope displays that respond to the knobs :-0

      2013.11.23.3

      • 2013-11-23 : Divider indicator not working, and some more. Fixed various little issues for this release, enough to be able to actually do my first noodle with it :-)
      • Source code for 2013.11.23.3 is made public, see the Downloads section. The customif components have changed, so they will need to be recompiled too (and before recompiling the new application).

      2013.11.23.2

      • 2013-11-23 : LFOs run a factor 2 too slow. Fixed.
      • 2013-11-23 : Look at filter tuning, needs rescaling like the OSCs had it and it seemed off before. Filter tuning did not work at all, fixed now and tuning seems to be about right.
      • Changed the Looks a bit
      • Display editors can handle ENTER now inside text, use CTRL+ENTER to close a display editor.

      2013.11.23.1

      • Had forgotten to convert the trigger OSC and LFO stuff for expo control. Also trigger lights on those modules did not work. also had forgotten the SVF.

      2013.11.23.0

      • 2013-11-18 : Exponential frequency control. That, and rescaling of knobs for frequency control on oscillators and LFOs. Also removed the quantizing to knob steps, so that once editors are available for values all arbitrary values could be set (within the resolution of an IEEE double float).
      • Implemeted a setting for notes / octave, not sure how useful that is as it is.

      2013.11.22.2

      • Various changes in the user interface, added an about page, recent file history, patch name editor, added some keyboard shortcuts (F2 will show the editor, F3 the settings).

      2013.11.22.1

      • Name changed from 'modules' into 'WREN'.

      2013.11.22.0

      • 2013-11-21 : When a new version runs and F1 is pressed the help files should be regenerated - did it.
      • 2013-11-20 : it was reported that when scrollbars appear displaying the visible area starts to behave odd, sofar I've not been able to reproduce this on various 7, Vista and XP machines. Ok, I see what was meant now, working on it. Seems fixed.

      2013.11.21.1

      • 2013-11-18 : SVF seems to lock up for (very?) high or low FM values. Added clipping for the sum of frequency and fm to a range 0, 1.
      • 2013-11-18 : Feedback delay loop seems to lock up under positive feedback conditions. Added cliping to range -16, 16 to input.

      2013.11.21.0

      • 2013-11-20 : trig lights on AR modules not working, the names are wrong - changed the names.
      • 2013-11-20 : Note number to signal and signal to note number do not work correctly for 'negative' octaves - (i.e. A-1) this needs a mathematical modulo calculation and floored division to make it work correctly. Introduced two new functions Remainder and FlooredDiv to perform modulo and division for this case.
      • 2013-11-20 : Make a logic NOT module - did it.

      2013.11.20.0

      • 2013-11-18 : Pressing DEL in an editor :: Changed the DEL behavior a bit, removed it as a menu shortcut and instead let the application handle it. the application will first ask the editor if modules can be deleted, and if so it will do that and mark the key as being handled (so it will not be passed on to anything else). When the editor is not in a state where it can delete modules the key will not be handled by the application and be passed on to the control that has keyboard focus (i.e. a LabelEditor (for module labels) or a DisplayEditor (for the notes editor in the TextSequencer). This way the DEL key can still be used for both functions, delete modules when possible and delete text from an editor otherwise.
        For another way to solve this see http://embarcadero.newsgroups.archived.at/public.delphi.vcl.components.using/201009/1009246070.html

      2013.11.19.0

      • 2013-11-18 : pressing DEL in text sequencer editor will delete the module while the editor is still open, crashy stuff from that
        'Solved' with a bit of a kludge - module deletion is not possible when there is an editor open - either on a text sequencer or on a module title (which has the same issue).
      • 2013-11-19 : The resource files customif.dcr and bitmaps.res are missing in the source zip - made them seperate downloads for now, they go into the customif project folder.

      2013.11.19.3

      • 2013-11-19 : Get some unused stuff out - diddit.
      • 2013-11-19 : Show input buffer over and under flows in debug screen - diddit.
      • 2013-11-19 : Fix error with quotes on version number - diddit.

      2013.11.19.2

      • 2013-11-19 : Make version numbers visible in the program - on the settings page.

      2013.11.19.1

      • 2013-11-18 : A shorter delay - made it.
      • 2013-11-19 : Random picks from text sequencer, as a random lookup table - added a robsol mode.
      • 2013-11-19 : Introduce patch versioning, the proposed change from lin to exp frequency control will make patches incompatible - current patch version is 1.
      • 2013-11-19 : Globals.pas in the customif stuff should be renamed, two times the same filename is troublesome (there is a globals.pas in the main project too) - it is glowballs.pas now.

      2013.11.18.0

      • 2013-11-18 : color on SVF filter outs is wrong - blue instead of red - changed that
      • 2013-11-18 : audio in does not work - it works, but the level display is wrong - changed that
      • 2013-11-18 : audio in does not work, the input values are garbage, this needed buffering - added buffering