linuxsampler Subversion History
* Sampler::Reset() no longer unloads instrument editor plugins, this is a
workaround for the issue that instrument editor plugins were no longer
available after sending a LSCP "RESET" command (probably due to a race).
Bumped version (2.2.0.svn16).
* SFZ engine: Fixed wrong velocity for release triggered samples: if and
only if note-off velocity is exactly zero (which means MIDI keyboard
does not have release velocity sensors) then use previous note-on
velocity as note-off velocity for release triggered samples instead
(regression of SVN r4013).
Gig engine: Fixed wrong velocity for release triggered samples: if and
only if note-off velocity is exactly zero (which means MIDI keyboard
does not have release velocity sensors) then use previous note-on
velocity as note-off velocity for release triggered samples instead
(regression of SVN r2879).
Bumped version (2.2.0.svn15).
* SFZ engine: Automatically reload .sfz files on file changes
(e.g. by some external text editor).
Bumped version (2.2.0.svn14).
* sfz.h: Add Instrument::GetFile() method.
Bumped version (2.2.0.svn13).
* sfz.h: Add File::checkFileModified() method allowing to detect file
changes (e.g. by other apps).
Bumped version (2.2.0.svn12).
* sfz.h: Add File::filename() method.
Bumped version (2.2.0.svn11).
* SFZ engine: Fixed wrong velocity of release triggered samples (most
hardware MIDI keybaords send note-off with velocyity zero, hence the
previous note-on elocity should be used for release triggered samples
Bumped version (2.2.0.svn10).
* Additional more verbose error output in case an appropriate
instrument editor could not be found (if there is not any
editor at all then say so, if there is one but not capable
to handle the instrument, then make this case clear to the
user; in both cases print the expected location for instrument
Bumped version (2.2.0.svn9).
* Show a more detailed error message on terminal if an appropriate editor
could not be found for a .gig instrument.
Bumped version (2.2.0.svn8).
* Fix compiler error with release tarball if no Bison installed
(SVN version still requires Flex and Bison being installed).
Bumped version (2.2.0.svn7).
* AbstractEngineChannel: fix CCs not being forwarded to all
Bumped version (2.2.0.svn6).
* VirtualMidiDevice: release all notes on MIDI CC #120 and CC #123.
* VirtualMidiDevice: add method Reset() which is e.g. intended to be used
in "panic" / MIDI "all sound off" / MIDI "all note off" situations.
* Fix: Do not share compiled instrument scripts among multiple engine
channels (sampler parts) as this can lead to crashes and would allow the
same global script variables to be accessible from multiple engine
channels which would not be the expected behaviour by instrument script
Bumped version (2.2.0.svn5).
* gig engine: Use libgig's gig::File::GetInstrument() method with method
gig::File::CountInstruments() instead of now deprecated
gig::File::GetFirstInstrument() / gig::File::GetNextInstrument() pair.
Bumped version (2.2.0.svn4).
* gig engine: Use libgig's new method gig::Instrument::GetRegionAt() with
method gig::Instrument:CountRegions() instead of now deprecated
gig::Instrument::GetFirstRegion() / gig::Instrument::GetNextRegion()
Bumped version (2.2.0.svn3).
* gig engine: Use libgig's new method gig::File::GetSample() with method
gig::File::CountSamples() instead of now deprecated
gig::File::GetFirstSample() / gig::File::GetNextSample() pair.
Bumped version (2.2.0.svn2).
* gig engine: use libgig's new IO-per-thread feature to avoid file I/O
concurrency issues with .gig file.
Bumped version (2.2.0.svn1).
* Preparations for new release (2.2.0).
* Fixed crash on certain MIDI RPN and NRPN messages that occurred if no
real-time instrument script was loaded.
Bumped version (2.1.1.svn71).
* NKSP VM: Fixed dead note events not been removed from user's event groups
(i.e. causing incorrect behaviour of built-in NKSP functions by_marks()
and set_event_mark() after max. size of event group list was exhausted).
Bumped version (2.1.1.svn70).
* ScriptVM: Fixed crash when handling array results of built-in
functions (e.g. "num_elements(by_marks($MARK_1)").
Bumped version (2.1.1.svn69).
* ScriptVM: Fixed incorrect polyphonic data transfer from wrong "note"
handler to "release" handler; which also fixes no "release" handler
being executed sometimes, and due to the latter it also fixes potential
crashes as some polyphonic script events were never released and the
engine hence was running out of free script events.
Bumped version (2.1.1.svn68).
* Allow EffectChain::InsertEffect() as alternative to
EffectChain::AppendEffect() (i.e. with index equal to current chain size).
Bumped version (2.1.1.svn67).
* NKSP parser: fixed memory leak; string tokens were allocated as C
strings and never freed.
Bumped version (2.1.1.svn66).
* SFZ: Fixed internal opcode 'xfin_hivel' falsely being set by user
opcode 'xfin_lovel' (patch by Christian Czezatke).
Bumped version (2.1.1.svn65).
* NKSP VM: Fixed the "release" handler being executed too often under
certain situations if polyphonic data was passed from "note" handler to
Bumped version (2.1.1.svn64).
* NKSP parser: Fixed crash if unary '-' operator was used on a non-number
NKSP parser: Raise parser error if either unary '-' or '+' operator was
used with a non-number data type.
Tests: Added test cases for the fixed issues described above.
Bumped version (2.1.1.svn63).
* Test Cases: Fixed deadlock of Condition test on Linux.
NKSP: Fixed built-in exit() function to behave as return statement.
VM API: Introduced new signal STMT_RETURN_SIGNALLED.
NKSP exit() function: signal STMT_RETURN_SIGNALLED instead of
NKSP AST: Introduced common base class 'Subroutine' for 'EventHandler'
and for new 'UserFunction' class.
NKSP parser: Use 'UserFunction' class instead of 'Statements' class
for user declared NKSP functions.
ScriptVM: Handle new STMT_RETURN_SIGNALLED signal by unwinding the
stack to previous, calling subroutine.
NKSP tests: Added test cases for exit() acting as return statement.
Bumped version (2.1.1.svn62).
* Fixed rare crash when switching between instruments that had instrument
Bumped version (2.1.1.svn61).
* NKSP language: emit warning if an array variable was declared with bigger
array size than amount of initial values been assigned, and initialize the
missing array elements with zero in this case.
Bumped version (2.1.1.svn60).
NKSP: Relaxed array variable declaration.
NKSP: Just throw a warning, not an error if an array variable of
size zero was declared.
NKSP: Allow omitting explicit array size on array variable declaration
if combined with immediate value assignment
(e.g. declare %foo := ( 1, 2, 3 ) ).
Bumped version (2.1.1.svn59).
* Fixed compilation error with Bison >= 3.6.0.
Bumped version (2.1.1.svn58).
* NKSP: Fixed crash when undefined variable was referenced.
Bumped version (2.1.1.svn57).
Ref<> smart pointer class is now thread-safe.
Require C11 compliant compiler.
Ref<> class: Implemented lock-free & wait-free thread-safety.
Ref<> class: Use portable format specifier %p for pointers.
Bumped version (2.1.1.svn56).
* Ref<> class: prevent compiler error if T == T_Base
(due to method signature duplicate).
Bumped version (2.1.1.svn55).
Fixed deadlocks (e.g. when restarting engines).
Individual thread implementations (e.g. disk thread, etc.):
Disable thread cancellation on critical sections, e.g. when holding
mutex locks, to prevent deadlocks if thread is stopped and/or
Added TestCancel() calls to thread implementations if missing.
No need to wrap Thread::TestCancel() calls into
CONFIG_PTHREAD_TESTCANCEL macro conditions (since TestCancel() is
already a stub on systems which don't have pthread_testcancel()
If compiled for debugging: give each thread a human readable name
to simplify debugging of multi-threading issues.
DiskThreadBase: TestCancel() and pthread_testcancel() calls are
per-se redundant, so only call TestCancel().
Added missing override keywords to silent compiler warnings.
Bumped version (2.1.1.svn54).
Mutex class: Implemented bug detection and deadlock debugging features.
Bug detection: By enabling macro DEBUG_MUTEX at compile time and
calling new method setDebugEnabled(true) at runtime, automatic bug
detection features are activated which e.g. raise an assertion fault
if a thread attempts to Unlock() a thread it does not own a lock on,
or when locking more than once while not using mutex type RECURSIVE
and much more.
Deadlock debugging: Also if these features were activated like
described above, the most recent mutex lock is recorded by capturing
the name of the thread and the precise call stack which caused the
mutex lock. This information can be used to identify the exact
situation that lead to a dead lock efficiently with a debugger.
Bumped version (2.1.1.svn53).
Thread class: Added new methods (POSIX implementation only yet):
Added methods pushCancelable() and popCancelable() for allowing to
prevent thread being terminated on critical sections.
Added methods name(), nameOfCaller() and setNameOfCaller() to allow
assigning threads human readable names for debugging purposes.
configure: Always check for availability of pthread_testcancel()
and use it if so (previously it was only used if explicitly enabled
by configure script option).
Raise a compiler warning if pthread_testcancel() is not available.
Bumped version (2.1.1.svn52).
* Implemented global backtraceAsString() function for debugging purposes
(POSIX systems only, no Windows implementation yet).
Bumped version (2.1.1.svn51).
* NKSP: Fixed re-entrant issue with function calls which caused wrong
result values if the same function was called multiple times in a term
(specifically if metric prefixes were used).
Tests: Added NKSP core language test cases to guard this fixed issue.
Bumped version (2.1.1.svn50).
* NKSP: Fixed intermediate function result values never having reflected
any standard measuring unit type.
Tests: Guard this fixed NKSP issue by test cases.
Bumped version (2.1.1.svn49).
* NKSP: Fixed incorrect EG times if standard measuring unit was
passed to built-in functions "change_attack()", "change_decay()"
Bumped version (2.1.1.svn48).
* Added configure checks whether C++ compiler supports so called
Bumped version (2.1.1.svn47).
NKSP: Added support for 'patch' variables.
NKSP language: Added support for 'patch' variable qualifier
(as new dedicated keyword 'patch').
NKSP parser: capture locations of 'patch' variable declarations
in script's source code.
ScriptVM: Allow patching 'patch' script variables by replacing
their default assignment expression with a supplied replacement
variable initialization expression by optional 2nd argument when
ScriptVM: Allow retrieval of default initialization expressions
of all 'patch' variables by optional 3rd argument when calling
loadScript() (i.e. for instrument editors).
gig engine: Implemented support for loading real-time instrument
scripts with 'patch' variables bundled with gig instruments.
Bumped version (2.1.1.svn46).
NKSP parser: track code locations also by raw byte position and length.
NKSP VM API: Added member variables 'firstByte' and 'lengthBytes' to
NKSP Editor API: Added methods firstByte() and lengthBytes() to
NKSP VM language parser: track all positions also by raw byte offset
and length (along to the already existing tracking by line/column).
NKSP editor syntax highlighting scanner: track all positions also by
raw byte offset and length (along to the already existing tracking by
Bumped version (2.1.1.svn45).
NKSP: Reduced code for parsing NKSP variable declarations:
Use 2 generalized grammar rules with optional components (i.e. optional
value assignment and optional variable qualifiers) instead of previous
linear combinations of grammar rules, which also fixes some edge case.
Bumped version (2.1.1.svn44).
Fixed potential crash with high pitch at end of RAM playback:
AbstractVoice: variable 'cachedsamples' is already in sample points,
so the previous division by amount of audio channels, allowed RAM
playback to exceed beyond the amount of samples being cached.
Bumped version (2.1.1.svn43).
* Fixed playing noise at the end of a disk stream under certain
Bumped version (2.1.1.svn42).
* Fixed crash when editing key groups (a.k.a. exclusive groups)
with an instrument editor during playback.
Bumped version (2.1.1.svn41).
* gig engine: If minimum cutoff is defined, remap cutoff controller CC
values to really span the entire possible cutoff range (to avoid a
dead controller zone).
Bumped version (2.1.1.svn40).
* gig engine: Fixed potential crash with polynomial interpolator
and max. pitch.
Bumped version (2.1.1.svn39).
* NKSP: Removed upper value constraint for 2nd argument of built-in
functions "change_amp_lfo_freq()", "change_cutoff_lfo_freq()",
"change_amp_lfo_depth()", "change_cutoff_lfo_depth()" and
"change_pitch_lfo_depth()", to allow e.g. passing value 2000000
to double the LFO frequency / resonance / cutoff frequency.
Bumped version (2.1.1.svn38).
NKSP: Fixed crash with built-in functions returning an array.
Calling built-in functions returning an array type was broken and
caused a crash when built-in function's NULL (supposed to be array)
result value was used by the script VM.
Bumped version (2.1.1.svn37).
Fixed compile errors with C++17:
std::ptr_fun was removed from STL in C++17,
use C++11 lambda expression instead.
std::mem_fun and std::bind2nd were removed from STL in C++17,
use C++11 lambda expression instead.
Bumped version (2.1.1.svn36).
* Added support for 'null function RPN/NRPN' (which is RPN/NRPN
parameter MSB=127 and LSB=127, and which is disabling subsequent
data entry/increment/decrement CC messages.
Bumped version (2.1.1.svn35).
* Added support for MIDI CC #96 (data increment).
Added support for MIDI CC #97 (data decrement).
Bumped version (2.1.1.svn34).
Implemented support for compressed RPN/NRPN message sequences:
Allow processing MIDI data entry messages without having to be
preceded strictly always by RPN/NRPN parameter selection messages
prior to each value change (i.e. data entry CC).
Bumped version (2.1.1.svn33).
* NKSP: Fixed certain built-in variables having returned
some (seemingly random) metric unit factor (instead of none).
Bumped version (2.1.1.svn32).
* NKSP: Implemented built-in script function "set_rpn()".
NKSP: Implemented built-in script function "set_nrpn()".
Bumped version (2.1.1.svn31).
NKSP: Added support for RPN and NRPN event handlers:
NKSP language: Added support for RPN event handler
("on rpn ... end on" in instrument scripts).
NKSP language: Added support for NRPN event handler
("on nrpn ... end on" in instrument scripts).
Added built-in read-only variables "$RPN_ADDRESS" and "$RPN_VALUE" which
may be read from the new RPN/NRPN script handlers to get the (N)RPN
parameter that had been changed and its new value.
Added built-in const variables "$NI_CB_TYPE_RPN" and "$NI_CB_TYPE_NRPN"
which are identifying the new (N)RPN handlers as such at script runtime.
Bumped version (2.1.1.svn30).
Added support for MIDI CC #38 (data entry LSB):
Combine data entry MSB and data entry LSB events' values to one 14-bit
value, which allows higher resolution (N)RPN value handling.
Handle now hard coded RPN events in separate method
Handle now hard coded NRPN events in separate method
Bumped version (2.1.1.svn29).
EngineChannel: Overhaul of RPN / NRPN related methods:
Added new *Rpn*Parameter*() methods as replacement for previous
*Rpn*Controller*() methods and marked the old ones as deprecated.
Added new *Nrpn*Parameter*() methods as replacement for previous
*Nrpn*Controller*() methods and marked the old ones as deprecated.
The new GetMidiRpnParameter() and GetMidiNrpnParameter() methods
return their result as common (in MIDI world) 14 bit representation
of sender's MSB and LSB values, instead of the uncommon 16 bit
representation of the old GetMidiRpnController() and
Bumped version (2.1.1.svn28).
* Event:Init(): memset() entire Event::Param union to zero instead of trying
to do that for its individual members; the latter became error prone due
to the union's growing complexity meanwhile.
Bumped version (2.1.1.svn27).
* NKSP: Added built-in script functions "msb()" and "lsb()".
Bumped version (2.1.1.svn26).
* gig engine: Fixed cutoff controller handling for new filter types.
Bumped version (2.1.1.svn25).
* gig format extension: Support for additional filter types:
lowpass 1/2/4/6-pole, highpass 1/2/4/6-pole, bandpass 2-pole,
Bumped version (2.1.1.svn24).
* Using now cubic interpolation as resampling algorithm by default; and
linear interpolation is deprecated now.
Bumped version (2.1.1.svn23).
* gig format extension: Added support for different LFO wave forms
(currently either sine [default], triangle, saw or square).
gig format extension: Added support for LFO phase displacement
gig format extension: Added support for flipping LFO polarity on LFO 3
(in the original gig format this was only available for LFO 1 and LFO 2).
Bumped version (2.1.1.svn22).
* Gig engine: Changed default wave form for all 3 LFOs to sine
(instead of triangle; see discussion "GigaStudio LFO
compatibility" on mailing list from 2019-09-26 for details).
Bumped version (2.1.1.svn21).
* Gig engine: changed LFO start levels; LFO1 and LFO2 both to mid,
LFO3 to max. start level (see discussion "GigaStudio LFO
compatibility" on mailing list from 2019-09-26 for details).
Bumped version (2.1.1.svn20).
Refactored LFO class names and their header file names:
Renamed PulseLFO -> LFOPulse, LFOSawIntMath -> LFOSawIntMathNew,
SawLFO -> LFOSawIntMathOld, SineLFO -> LFOSineBuiltinFn,
LFOSine -> LFOSineNumericComplexNr, SquareLFO -> LFOSquarePulse.
Separated LFOSquarePulse (previously "SquareLFO") to its own
Renamed type LFOSigned -> LFOTriangleSigned.
Renamed type LFOUnsigned -> LFOTriangleUnsigned.
Bumped version (2.1.1.svn19).
Added new LFO implementations:
Added int math square LFO implementation.
Added int math saw LFO implementation.
Added numeric complex nr sine LFO implementation.
Added public API C++ class "LFO", which is a cluster class
encapsulating all the sampler's LFO implementations to be used by
3rd party applications (e.g. by Gigedit).
Marked class LFOTriangleDiHarmonic as deprecated
(will be removed in future).
Added LFOAll.h which includes all LFO implementation's header files.
Fixed benchmarks/triang.cpp falsely having favoured "int math abs"
algorithm (since result of 2nd run was not accumulated).
Added benchmark for saw wave (benchmarks/saw.cpp).
Added benchmark for sine wave (benchmarks/sine.cpp).
Added benchmark for square wave (benchmarks/square.cpp).
Increased amount of benchmarks runs by factor 6 to achieve benchmark
times which are large enough on modern systems.
Cleanup of LFO APIs.
Bumped version (2.1.1.svn18).
* LFOTriangleIntMath and LFOTriangleIntAbsMath: Fixed FlipPhase=true
behaviour for start_level_mid.
Bumped version (2.1.1.svn17).
* Fixed compile errors with Clang 4.0
* Fixed compiler errors with GCC 8.x.
Bumped version (2.1.1.svn16).
* SFZ format engine: fixed support for regions with loccN/hiccN
conditions on more than one MIDI controller.
* NKSP language: Allow unary '+' operator.
Test cases: Added NKSP tests for unary '+' operator.
Bumped version (2.1.1.svn15).
NKSP: Implemented common real number math functions.
Added built-in real number functions "round()", "ceil()", "floor()",
"sqrt()", "log()", "log2()", "log10()", "exp()", "pow()", "sin()",
"cos()", "tan()", "asin()", "acos()", "atan()".
Added built-in script real number constant "~NI_MATH_PI".
Added built-in script real number constant "~NI_MATH_E".
Added NKSP test cases for built-in functions "round()", "ceil()",
"floor()", "sqrt()", "log()", "log2()", "log10()", "exp()", "pow()",
"sin()", "cos()", "tan()", "asin()", "acos()", "atan()".
Bumped version (2.1.1.svn14).
NKSP: Built-in instrument functions fixes & hardening:
Fixed the following built-in functions having misinterpreted values given
with unit type (for their 2nd argument) as if they were relative values
(that is as if they were passed without a unit type): "change_attack()",
"change_decay()", "change_release()", "change_cutoff_attack()",
Fixed the following built-in functions having applied completely wrong
'final' values: "change_sustain()", "change_cutoff_sustain()" (since the
respective EGs being their modulation sink assume uint data type with
value range 0..1000 instead of 0.0..1.0.
Added individual parse-time checks of function arguments for the following
built-in functions: "play_note()", "note_off()", "set_event_mark()",
"delete_event_mark()", "by_marks()", "change_cutoff()", "change_attack()",
"change_decay()", "change_release()", "change_cutoff_attack()",
"change_pitch_lfo_freq()", "change_vol_time()", "change_tune_time()" and
Don't abort function call if unit type was used and at the same time
'final' operator was omitted for the primary value argument of the
following built-in functions: "change_cutoff()", "change_attack()",
"change_decay()", "change_release()", "change_cutoff_attack()",
"change_pitch_lfo_freq()", "change_vol_time()", "change_tune_time()",
"change_pan_time()", instead imply 'final'ness at runtime and raise an
appropriate parser warning at parse time.
Bumped version (2.1.1.svn13).
NKSP: Real number support for core instrument built-in functions.
NKSP: Built-in function "play_note()" accepts now real numbers and
seconds as unit type as well for its 3rd and 4th function arguments.
NKSP: The following built-in functions accept now real numbers as well for
their 2nd function argument: "change_vol()", "change_tune()",
"change_cutoff()", "change_attack()", "change_decay()",
"change_release()", "change_sustain()", "change_cutoff_attack()",
"change_vol_time()", "change_tune_time()", "change_pan_time()",
"fade_in()", "fade_out()", "change_play_pos()".
NKSP: Fixed built-in function "change_play_pos()" not having accepted
metric prefixes at all.
Bumped version (2.1.1.svn12).
* NKSP language: Fixed assignment to array variables which was
broken by floating point support introduction (svn r3573).
Test cases: Added NKSP int array and real array tests for value
assignment and initialization of arrays.
Bumped version (2.1.1.svn11).
NKSP: Cleanup regarding multiple data types for built-in function args.
NKSP VM API cleanup: Get rid of legacy method
VMFunction::argType(vmint iArg) which was already superseded by its new
replacement VMFunction::acceptsArgType(vmint iArg, ExprType_t type).
NKSP parser: if wrong argument type was passed to a built-in function and
that built-in function accepts more than one data type for the argument,
then show all supported data types as parser error message.
Bumped version (2.1.1.svn10).
* NKSP VM API: Added 4 overridden methods to class VMNumberExpr:
as convenient methods for automatically converting values to expected
metric value basis.
NKSP built-in function "wait()" accepts now both integers and real numbers
Bumped version (2.1.1.svn9).
NKSP: Allow more wider support of standard measuring units & 'final'ness.
Raised compiler requirement to be C++14 compliant (due to severe
restrictions regarding C-style aggregate initializer lists in C++11
which are now massively used throughout the code base).
NKSP VM API: Allow units and 'final'ness to be returned as result from
built-in functions (added methods VMFunction::returnUnitType() and
VMFunction::returnsFinal() for that purpose which must be implemented by
built-in function implementations).
NKSP language: Allow metric unit prefixes of numeric scalar and array
variables to be changed freely at runtime (unlike unit types like Hz etc.
which are still sticky parse-time features of variables which cannot be
changed at runtime for the intentional sake of determinism).
NKSP language: 'final' values are prohibited for array variables for now
(attempt causes a parsers error).
NKSP language: expressions with unit types (e.g. Hz) are prohibited for
conditions of runtime control structures like if(), while(), select()
(attempt causes a parser error).
NKSP VM API: Allow built-in functions to perform their own, individual
parse time checks of arguments going to be passed to the function at
runtime (added method VMFunction::checkArgs() for that purpose).
NKSP language: raise parser warning if only one operand of binary
operators (like logical 'or' comparison) contain a 'final' value (because
it would always yield in a 'final' result in such cases).
NKSP language: Allow comparison (=, #, <, >, <=, >=) of values with
different metric unit prefixes, which will behave as expected (e.g.
result of expression '1000us < 2ms' is true).
NKSP language: Allow adding values with different metric unit prefixes
(e.g. result of expression '100Hz + 5kHz' is '5100Hz').
NKSP language: Allow subtracting values with different metric unit
prefixes (e.g. result of expression '1ms - 20us' is '980us').
NKSP language: Allow multiplying with any metric unit prefixes
(e.g. result of expression '2k * 3ms' is '6s'), however multiplications
with unit types on both sides (e.g. '2s * 2s') is still prohibited since
we don't have any considerable practical use for a term like '4s^2'
(hence any attempt multiplying two unit types still causes parser error).
NKSP language: Allow dividing by any metric unit prefixes and allow
division of same unit type on both sides (e.g. expression '8kHz / 1000Hz'
yields in unit free result '8'). So this is now a way to cast units away
e.g. for passing the result to other expressions, certain function calls
or variables which are not accepting any units (or that specific unit).
NKSP language: integer arrays and real number arrays can now be converted
to strings (e.g. for dumping their content with message() calls for
script debugging purposes).
NKSP language: expressions and variables with units are now correctly
casted to strings (e.g. with message() calls).
NKSP language: comparing real numbers for equalness (e.g. '~foo = 3.1') or
unequalness (e.g. '~foo # 3.1') is now less strict and takes the expected
floating point tolerances into account.
NKSP VM API: Added methods VMScalarNumberExpr::evalCastInt() and
NKSP VM API: Added base class 'VMNumberArrayExpr' for classes
'VMIntArrayExpr' and 'VMRealArrayExpr'.
NKSP VM API: replaced all unitPrefix() (parse time) methods by
unitFactor() (runtime) methods.
Built-in function "exit()" supports now returning units and 'final'ness
exclusively for test cases.
The following built-in functions support now units as well: "abs()",
"random()", "inc()", "dec()", "in_range()", "min()", "max()",
"real_to_int()", "int()", "int_to_real()" and "real()".
Built-in functions "array_equal()", "search()" and "sort()" support now
real number arrays (correctly) as well.
Added individual parse time checks of arguments to be passed to built-in
functions "random()", "inc()", "dec()", "in_range()", "min()", "max()",
"array_equal()" and "search()" specific for their individual purposes.
Test cases: Added massive amount of NKSP test cases for standard
measuring units and 'final' operator usage cases.
Test cases: Added NKSP test cases for (floating point tolerance aware)
real number equalness / unequalness comparison.
Bumped version (2.1.1.svn8).
NKSP: Introducing variable return type for built-in functions.
Changed method signature VMFunction::returnType() ->
VMFunction::returnType(VMFnArgs* args) to allow built-in
functions to proclaim a different result value type depending
on the arguments to be passed to the function.
Built-in script function abs() optionally accepts and returns
Built-in script functions min() and max() optionally accept
real number arguments and return real number as result in that
Added real number test cases for the built-in abs(), min() and
Bumped version (2.1.1.svn7).
NKSP: Added some initial floating point test cases.
RTMath: Implemented floating point comparison methods
fEqual32(float,float) and fEqual64(double,double)
which take the expected floating point tolerances
NKSP: Allow built-in exit() function to potentially
accept real type argument as well.
NKSP: Added real number test cases for built-in
functions exit(), int_to_real(), real(), real_to_int()
and int(), as well as for the plus, minus and negate
NKSP: Cleanup of class inheritance scheme.
scriptvm/tree.h: Mark all relevant classes with C++11 'final' keyword.
scriptvm/tree.h: StringLiteral class has no need for virtually.
NKSP: Introducing floating point support.
NKSP language: Added support for NKSP real number literals and
arithmetic operations on them (e.g. "(3.9 + 2.9) / 12.3 - 42.0").
NKSP language: Added support for NKSP real number (floating point)
script variables (declare ~foo := 3.4).
NKSP language: Added support for NKSP real number (floating point)
array script variables (declare ?foo := ( 1.1, 2.7, 49.0 )).
NKSP built-in script function "message()" accepts now real number
argument as well.
Added built-in NKSP script function "real_to_int()" and its short
hand form "int()" for casting from real number to integer in NKSP
Added built-in NKSP script function "int_to_real()" and its short
hand form "real()" for casting from integer to real number in NKSP
Bumped version (2.1.1.svn6).
NKSP: Bug fixes regarding new measurement units feature:
Fix: Engine internal Fade of script synthesis parameters volume, pitch
and pan were not rendered at all.
Fix: Backward compatibility of built-in function arguments without a
metric unit prefix was broken (resulted in incorrect value
Fix: built-in script function change_play_pos() resolved wrong arguments.
Bumped version (2.1.1.svn5).
* NKSP script editor API: Added support for detecting standard unit tokens
and their potential metric prefix token.
NKSP: Added standard units support for numbers and final "!" operator:
NKSP strictness: Variable names, function names and preprocessor condition
names must start with a regular character (a-z or A-Z); starting them with
a digit or underscore is no longer allowed.
NKSP parser fix: equal comparison operator "=" and not equal comparison
operator "#" must only accept integer operands.
NKSP language: Implemented support for standard units like Hertz, seconds,
Bel including support for metric unit prefixes; so one can now e.g.
conveniently use numbers in scripts like "5us" meaning "5 microseconds",
or e.g. "12kHz" meaning "12 kilo Hertz", or e.g. "-14mdB" meaning
"minus 14 Millidecibel", or e.g. "28c" meaning "28 cents" (for tuning).
NKSP language: Introduced "final" operator "!" which is specifically
intended for synthesis parameter values to denote that the synthesis
parameter value is intended to be the "final" value for that synthesis
parameter that should explicitly be used by the engine and thus causing
the sampler engine to ignore all other modulation sources for the same
synthesis parameter (like e.g. LFO, EG); by simply prefixing a value,
variable or formula with this new "!" operator the expression is marked as
Bumped version (2.1.1.svn4).
* NKSP: Introducing 64 bit support for NKSP integer scripts
variables (declare $foo).
Require C++11 compiler support.
Autoconf: Added m4/ax_cxx_compile_stdcxx.m4 macro which is used
for checking in configure for C++11 support (as mandatory
requirement) and automatically adds compiler argument if required
Bumped version (2.1.1.svn3).
* Test cases: Fixed thread tests segfaulting on Linux.
* Added test cases for NKSP core language aspects and core built-in
NKSP: Added method ScriptVM::setExitResultEnabled() which allows
to explicitly enable the built-in exit() function to optionally
accept one function argument; the value of the passed exit()
function argument will then become available by calling
VMExecContext::exitResult() after script execution.
Bumped version (2.1.1.svn2).
* Fixed compiler error in Pool.h.
Fixed compiler errors in test cases.
Updated README for how to compile & run test cases.
Updated test case
MutexTest::testDoubleLockStillBlocksConcurrentThread() to latest
expected behaviour of the Mutex class implementation (recursive
Bumped version (2.1.1.svn1).
* Preparations for new release (2.1.1).
* "optional" class: Fixed comparison operators.
Bumped version (2.1.0.svn9).
* FX Sends: Provide more useful error messages on routing problems
(see bug #169).
LSCP reference doc: Be more clear describing the two distinct
approaches of using external vs. internal effects (see bug #169).
Bumped version (2.1.0.svn8).
* sfz opcode 'sample': Added support for built-in sample '*silence'
(fixes bug #310, patch by Jacek Roszkowski).
sfz opcode 'sample': Show warning message for unknown or unsupported
built-in sample types.
Bumped version (2.1.0.svn7).
* SFZ: Fixed potential crash when a sample is shared by more than one
region (fixes bug #308, patch by Jacek Roszkowski).
SFZ: Added OVERRIDEs to avoid bug #307 in future.
Bumped version (2.1.0.svn6).
* SFZ: Fixed memory leak when releasing samples
(fixes bug #307, patch by Jacek Roszkowski)
Bumped version (2.1.0.svn5).
* Fixed some compiler warnings
Fixed compilation error when cross-compiling to Mac
* Fixed potential endless recursion introduced by SVN r3444
(patch by Ivan Maguidhir).
Bumped version (2.1.0.svn4).
* Gig format extension: If requested by instrument then don't play
release trigger sample on note-off events.
Bumped version (2.1.0.svn3).
* Only play release trigger samples on sustain pedal up if this behaviour
was explicitly requested by the instrument (otherwise only on note-off).
Bumped version (2.1.0.svn2).
* NKSP: Fixed behavior of built-in functions change_sustain(),
change_cutoff_attack(), change_cutoff_decay(), change_cutoff_sustain()
Bumped version (2.1.0.svn1).
* Preparations for new release (2.1.0).
* NKSP: Added built-in script function "change_cutoff_attack()".
NKSP: Added built-in script function "change_cutoff_decay()".
NKSP: Added built-in script function "change_cutoff_sustain()".
NKSP: Added built-in script function "change_cutoff_release()".
NKSP: Added built-in script function "change_cutoff_lfo_depth()".
NKSP: Added built-in script function "change_cutoff_lfo_freq()".
Bumped version (2.0.0.svn77).
* Debian: Added config file /etc/ld.so.conf.d/linuxsampler.conf instead
of fiddling directly with /etc/ld.so.conf by postinst and postrm
scripts as before.
* linuxsampler binary fix: option --create-instruments-db ignored
subsequent optional argument due to glibc's implementation oddity
which expects a "=" sign, but no space between them.
Debian: Added build dependency to libsqlite3-dev for building
linuxsampler with instruments DB support.
Bumped version (2.0.0.svn76).
* Debian: Fixed packaging error about invalid "Source-Version"
Debian: Raised Debian compatibility level to Debian 9 "Stretch".
* Fixed compilation error with clang libc++.
* NKSP: Added built-in script function "change_pan_time()".
NKSP: Added built-in script function "change_pan_curve()".
Bumped version (2.0.0.svn75).
* NKSP script editor syntax highlighting API: catch all fatal lexer
errors, to avoid the editor app to crash on ill-formed text input.
Bumped version (2.0.0.svn74).
* gig Engine: Added support for controlling whether the individual
EGADSR stages may be aborted (as LinuxSampler extension to the
original GigaStudio 4 format).
Bumped version (2.0.0.svn73).
* NKSP: Implemented built-in script function "change_sustain()".
Bumped version (2.0.0.svn72).
* NKSP: Added built-in preprocessor condition NKSP_NO_MESSAGE,
which can be set to disable all subsequent built-in "message()"
function calls on preprocessor level.
Bumped version (2.0.0.svn71).
* NKSP script editor API: Fixed app termination due to a lexer start
condition stack underrun.
NKSP preprocessor: Fixed wrong behavior on nested USE_CODE_IF() and
USE_CODE_IF_NOT() preprocessor statements.
Bumped version (2.0.0.svn70).
* Fixed Note object leak when triggering notes on keys which did
not have a valid sample mapped (fixes bug #252).
Fixed compilation errors when compiling with CONFIG_DEVMODE
Bumped version (2.0.0.svn69).
* NKSP: Removed max. value limitation of built-in functions
"change_attack()", "change_decay()" and "change_release()" to
i.e. allow passing 2000000 for doubling the respective time.
Bumped version (2.0.0.svn68).
* Got rid of resembling an ancient GSt misbehavior which did not pitch at
all if an up-pitch of more than 40 semi tones was requested (I don't
think there is any stock gig sound that requires this misbehavior to
resemble its original sound).
Bumped version (2.0.0.svn67).
* Added built-in script function "callback_status()".
Added built-in constant $CALLBACK_STATUS_TERMINATED.
Added built-in constant $CALLBACK_STATUS_QUEUE.
Added built-in constant $CALLBACK_STATUS_RUNNING.
Bumped version (2.0.0.svn66).
* NKSP: Added built-in script function "fork()".
NKSP: Added built-in array variable %NKSP_CALLBACK_CHILD_ID.
NKSP: Added built-in variable $NKSP_CALLBACK_PARENT_ID.
NKSP: Fixed potential crash when accessing dynamic built-in
Bumped version (2.0.0.svn65).
* sfz parser: allow missing space between header and opcode
* Revised fundamental C++ classes "Thread", "Mutex" and
"Condition" which fixes potential undefined behavior
(note: this addresses mainly the POSIX implementation,
Win32 is untested yet and would also need an update).
Bumped version (2.0.0.svn64).
* NKSP: Print a time stamp along to each call of built-in function
ScriptVM API: Added VMParserContext::preprocessorComments() which
allows to retrieve all code blocks filtered out by the
Bumped version (2.0.0.svn63).
* RT Instrument Scripts: Fixed potential memory access bug
and potential undefined behavior of "init" event handlers.
Bumped version (2.0.0.svn62).
* NKSP: Implemented built-in script function "abort()" which allows
to abort another script handler by passing its callback ID.
Bumped version (2.0.0.svn61).
* NKSP language: Added support for "synchronized .. end synchronized"
Bumped version (2.0.0.svn60).
* NKSP language fix: Unknown characters were not handled correctly.
Bumped version (2.0.0.svn59).
* NKSP language: Added support for user declared const array variables.
NKSP language: Raise parser warning if array variable is accessed with
an index that exceeds the array's size.
Bumped version (2.0.0.svn58).
* NKSP: Implemented built-in script function "change_play_pos()".
Bumped version (2.0.0.svn57).
* NKSP: built-in "play_note()" function now accepts -2 for its fourth
argument (note duration) which means the life time of the note shall
be sticked to the requested note number of argument 1.
NKSP Fix: built-in "play_note()" function now returns 0 as result
value if -1 was passed for its fourth argument (note duration) and
the respective parent note is already gone.
NKSP: Built-in array variable %KEY_DOWN is now a read-only
Built-in variable $EVENT_NOTE is now a read-only variable.
Built-in variable $EVENT_VELOCITY is now a read-only variable.
Bumped version (2.0.0.svn56).
* NKSP: built-in "play_note()" function now supports a sample playback
start offset with argument 3, where special value -1 means to use the
regular sample offset as defined by the instrument file.
Bumped version (2.0.0.svn55).
* NKSP: Implemented built-in script function "change_vol_curve()".
NKSP: Implemented built-in script function "change_tune_curve()".
NKSP: Added built-in script constant "$NKSP_LINEAR".
NKSP: Added built-in script constant "$NKSP_EASE_IN_EASE_OUT".
Bumped version (2.0.0.svn54).
* Implemented built-in script function "same_region()" (currently only
available for gig format engine).
Bumped version (2.0.0.svn53).
* NKSP Fix: Never suspend "init" event handlers.
NKSP: Implemented built-in script function "array_equal()".
NKSP: Implemented built-in script function "search()".
NKSP: Implemented built-in script function "sort()".
Bumped version (2.0.0.svn52).
* NKSP Fix: built-in script function "change_note()" did not
(re)select the correct expected region.
NKSP Fix: built-in script function "change_velo()" did not
(re)select the correct subregion/dimension region
(whatever term you are using for the sampler format of
Bumped version (2.0.0.svn51).
* NKSP: Adjusted behavior of "change_vol()" and "change_tune()" to a more
intuitive behavior if used in combination with "change_vol_time()" or
"change_tune_time()" respectively: now tuning/volume changes are only
assigned (without delay) immediately to a new note if the respective
timing function has not been called before, otherwise the volume/tuning
changes are automatically faded (before, only the event's time stamp was
Bumped version (2.0.0.svn50).
* NKSP: Implemented built-in script function "change_velo()".
NKSP: Implemented built-in script function "change_note()".
Bumped version (2.0.0.svn49).
* NKSP: Built-in "ignore_event()" function: argument is now optional,
like with built-in function "ignore_controller()".
* NKSP: Fixed polyphonic variables not being reset to zero
Bumped version (2.0.0.svn48).
* Fixed invalid (note-on) event ID being assigned to new Note
Fixed a bunch of scheduler time related bugs.
Bumped version (2.0.0.svn47).
* NKSP: Added built-in script function "get_event_par()" and implemented
some of its possible parameter selections.
NKSP: Added built-in script function "set_event_par()" and implemented
some of its possible parameter selections.
NKSP: Fixed (removed) artificial value limit for duration argument of
built-in script functions "change_vol_time()" and "change_tune_time()".
Fixed compile error with pre-C++11 compilers.
Bumped version (2.0.0.svn46).
* NKSP: Implemented built-in script function "change_vol_time()".
NKSP: Implemented built-in script function "change_tune_time()".
NKSP: Implemented built-in script function "fade_in()".
NKSP: Implemented built-in script function "fade_out()".
NKSP: Fixed acceptance of wrong data type of parameters passed to
built-in script functions "change_vol()", "change_tune()",
"change_pan()", "change_cutoff()", "change_reso()",
"change_attack()", "change_decay()", "change_release()",
"change_pitch_lfo_depth()" and "change_pitch_lfo_freq()".
Bumped version (2.0.0.svn45).
* NKSP: Fixed crash when using built-in script array variable "%ALL_EVENTS".
NKSP: Added built-in function "change_amp_lfo_depth()".
NKSP: Added built-in function "change_amp_lfo_freq()".
NKSP: Added built-in function "change_pitch_lfo_depth()".
NKSP: Added built-in function "change_pitch_lfo_freq()".
Bumped version (2.0.0.svn44).
* Instruments DB: Fixed undefined DB transaction behavior.
Fixed general compiler warnings.
Bumped version (2.0.0.svn43).
* SFZ: Fixed unintended volume fade-in of voices under certain
Bumped version (2.0.0.svn42).
* SFZ engine: Implemented opcode set_ccN
(initial patch by Giovanni Senatore).
SFZ engine: print a warning if a CC related
opcode uses an invalid MIDI controller number.
Bumped version (2.0.0.svn41).
* Instruments DB: Added support for scanning SFZ (.sfz) files.
Instruments DB: Added support for scanning Sound Font (.sf2) files.
Bumped version (2.0.0.svn40).
* Cleanup of instruments DB file creation and opening code.
The instrument DB path of linuxsampler's --create-instruments-db argument
is now optional, if it is missing, then a default location is used.
Bumped version (2.0.0.svn39).
* SFZ Engine: Just fixed a false warning about allegedly
unsupported sfz opcode "script", which is obviously not true.
Bumped version (2.0.0.svn38).
* Added support for sfz extension opcode 'script' which may be used to
load real-time instrument script file (NKSP script language).
Removed code duplication in SFZ file loading code.
Bumped version (2.0.0.svn37).
* NKSP: Implemented built-in script function "in_range()".
Bumped version (2.0.0.svn36).
* NKSP: Implemented built-in script array variable "%ALL_EVENTS".
Bumped version (2.0.0.svn35).
* Gig Engine: Fixed clicks and pumping noise with Lowpass Turbo filter
on very low cutoff settings.
Bumped version (2.0.0.svn34).
* RT Instrument Scripts: Fixed crash when using built-in script function
LSCP Server: Fixed client connection not being closed after network error.
Fixed some more few compiler warnings.
Bumped version (2.0.0.svn33).
* Fixed numerous compiler warnings.
Bumped version (2.0.0.svn32).
* Instruments DB: Fixed memory access bug of general DB
access code which lead to undefined behavior.
* Check compiler for supported pragma diagnostics to avoid
* Fixed a bunch of minor issues (mostly compiler warnings).
Bumped version (2.0.0.svn31).
* windows, 32-bit: fixed potential crashes by making sure the stack in
sub threads is 16-byte aligned
* Added new C++ API method
Bumped version (2.0.0.svn30).
* Follow-up fix regarding aftertouch handling.
Bumped version (2.0.0.svn29).
* gig/sf2/sfz: Fixed aftertouch channel pressure events being processed
properly and thus were ignored for certain uses.
Bumped version (2.0.0.svn28).
* NKSP: Fixed NKSP parser warning "Not a statement" when assigning an
initializer list to an array variable.
Bumped version (2.0.0.svn27).
* NKSP: Provide more user friendly error messages on syntax errors.
Bumped version (2.0.0.svn26).
* ScriptVM: Implemented automatic suspension of RT safety
Bumped version (2.0.0.svn25).
* NKSP Fix: "init" event handler was not always executed when a script
NKSP built-in wait() script function: abort script execution if
a negative or zero wait time was passed as argument (since this is
a common indication of a bug either of the script or even of the
engine, which could lead to RT instability or even worse).
Bumped version (2.0.0.svn24).
* NKSP: Implemented built-in script function "min()".
NKSP: Implemented built-in script function "max()".
Bumped version (2.0.0.svn23).
* NKSP: Implemented built-in script function "sh_left()".
NKSP: Implemented built-in script function "sh_right()".
Bumped version (2.0.0.svn22).
* All engines: Increased ramp speed of volume smoother and pan smoother
(while slow rate of crossfade smoother is preserved) to allow quick
volume and pan changes by instrument scripts for instance.
Bumped version (2.0.0.svn21).
* NKSP: Fixed all change_*() built-in script functions to apply their
synthesis parameter changes immediately in case the respective note
was triggered at the same time, instead of scheduling the parameter
change, especially because it would cause some parameter types's
changes either to be ramped (i.e. change_vol()) or other types even
to have not effect at all (i.e. change_attack()).
Bumped version (2.0.0.svn20).
* NKSP: Implemented built-in script function "change_attack()".
NKSP: Implemented built-in script function "change_decay()".
NKSP: Implemented built-in script function "change_release()".
Bumped version (2.0.0.svn19).
* fixed C++11 compilation error
* NKSP language: Added support for user defined script functions.
Bumped version (2.0.0.svn18).
* NKSP: Implemented built-in script function "stop_wait()".
NKSP: Implemented built-in script variable "$NI_CALLBACK_ID".
NKSP: Implemented built-in script variable "$NI_CALLBACK_TYPE".
NKSP: Implemented built-in script variable "$NKSP_IGNORE_WAIT".
NKSP: Added support for read-only built-in variables
(respectively handled by the script parser).
NKSP: Added built-in script constant "$NI_CB_TYPE_INIT".
NKSP: Added built-in script constant "$NI_CB_TYPE_NOTE".
NKSP: Added built-in script constant "$NI_CB_TYPE_RELEASE".
NKSP: Added built-in script constant "$NI_CB_TYPE_CONTROLLER".
Bumped version (2.0.0.svn17).
* NKSP language correction: allow empty statements in entire language
(i.e. "if end if").
Bumped version (2.0.0.svn16).
* NKSP: Implemented built-in script function "inc()".
NKSP: Implemented built-in script function "dec()".
NKSP language fix: division expressions were evaluated too often.
NKSP language fix: string concatenation operator was right
associative instead of left (to right).
Bumped version (2.0.0.svn15).
* NKSP: Implemented built-in script variable "$KSP_TIMER".
NKSP: Implemented built-in script variable "$NKSP_REAL_TIMER".
NKSP: Implemented built-in script variable "$NKSP_PERF_TIMER".
NKSP: Implemented built-in script variable "$ENGINE_UPTIME".
Bumped version (2.0.0.svn14).
* Fixed behavior of built-in instrument script functions play_note()
and note_off(), which must be distinguished engine internally
from "real" MIDI note on/off events in order to avoid
misbehaviors like hanging notes.
Bumped version (2.0.0.svn13).
* NKSP: Added & implemented built-in script function "change_cutoff()".
NKSP: Added & implemented built-in script function "change_reso()".
NKSP: Added & implemented built-in script function "event_status()".
NKSP: Added built-in script constants "$EVENT_STATUS_INACTIVE" and
"$EVENT_STATUS_NOTE_QUEUE" both for being used as flags for
built-in "event_status()" script function.
NKSP language: Added support for bitwise operators ".or.", ".and."
NKSP language scanner: Fixed IDs matching to require at least one
character (i.e. when matching function names or variable names).
NKSP language scanner: disabled unusued rules.
Bumped version (2.0.0.svn12).
* Implemented built-in instrument script function "change_vol()".
Implemented built-in instrument script function "change_tune()".
Implemented built-in instrument script function "change_pan()".
Bumped version (2.0.0.svn11).
* Fix: Release trigger voices were not spawned on sustain pedal up
(CC #64) events.
Fix: Release trigger voices can now also distinguish correctly between
note-off and sustain pedal up events.
Bumped version (2.0.0.svn10).
* NKSP language grammar correction: allow empty event handler bodies
like "on note end on".
Bumped version (2.0.0.svn9).
* Reload instrument script automatically after being modified by an
Bumped version (2.0.0.svn8).
* Added new C++ API class "ScriptVMFactory".
Instrument Scripts: extended parser issues to provide not only first
line and first column, but also last line and last column of issue
(thus marking the precise span of the issue within the source code).
Bumped version (2.0.0.svn7).
* Instrument Scripts: Fixed line numbers on parser error/warning messages.
Instrument Scripts: Added output of precise column on parser
Shut up some irrelevant errors of parser generating shell scripts.
Bumped version (2.0.0.svn6).
* Instrument script classes now exported with the liblinuxsampler C++ API.
Added new API method ScriptVM::syntaxHighlighting() which provides
a convenient syntax highlighting backend for external instrument
script editor applications.
Bumped version (2.0.0.svn5).
* Automake: set environment variable GCC_COLORS=auto to allow GCC to
auto detect whether it (sh/c)ould output its messages in color.
Fixed behavior of built-in script function "ignore_event()".
Bumped version (2.0.0.svn4).
* All engines: Active voices are now internally grouped to "Note" objects,
instead of being directly assigned to a keyboard key. This allows more
fine graded processing of voices, which is i.e. required for certain
instrument script features.
Built-in script function "play_note()": Added support for passing
special value -1 for "duration-us" argument, which will cause the
triggered note to be released once the original note was released.
Bumped version (2.0.0.svn3).
* All engines: Implemented scheduler for delayed MIDI events and for
suspended real-time instrument scripts.
Real-Time instrument scripts: Implemented support for built-in "wait()"
function's "duration-us" argument, thus scripts using this function are
now correctly resumed after the requested amount of microseconds.
Real-Time instrument scripts: Implemented support for built-in
"play_note()" function's "duration-us" argument, thus notes triggered
with this argument are now correctly released after the requested amount
Real-Time instrument scripts: Fixed crash which happened when trying to
reference an undeclared script variable.
Real-Time instrument scripts: Script events were not cleared when
engine channel was reset, potentially causing undefined behavior.
All engines: Attempt to partly fix resetting engine channels vs.
resetting engine, an overall cleanup of the Reset*(),
ConnectAudioDevice(), DisconnectAudioDevice() API methods would still be
desirable though, because the current situation is still inconsistent
and error prone.
Bumped version (2.0.0.svn2).
* Removed unnecessary dependency to libuuid (originated by libgig's usage
Debian packaging: Updated build dependencies and description, and
assigned firstname.lastname@example.org as maintainer of this
Bumped version (2.0.0.svn1).
* sfz engine: added support for <global>, <master> and #define (patch
by Alby M)
* use unique_ptr instead of auto_ptr when building with C++11
* fixed printf type errors (mostly in debug messages)
* Preparations for new release (2.0.0).
* CoreMIDI: fixed auto bind feature to CoreMIDI ports that go online
CoreMIDI: fixed minor memory leak
Bumped version (1.0.0.svn61)
* Instrument editor interface: Changed instrument editor plugin interface,
providing additional informations like the EngineChannel for which the
instrument editor was spawned for. This allows the instrument editors to
interact more actively with the sampler.
Bumped version (1.0.0.svn60).
* Fixed compilation error that occurred with some compilers, triggered by
recent libgig changes.
Bumped version (1.0.0.svn59).
* sfz engine: added support for float and 32 bit sample files
* gig engine: fixed behaviour of filter LFO
* Fixed MIDI program change messages being ignored if quickly executed
after each other (fixes #231).
* Another fix regarding virtual MIDI device event import.
Bumped version (1.0.0.svn57).
* Fixed virtual MIDI device event import (which caused i.e. the
events from the virtual keyboard of gigedit to be ignored by the
Bumped version (1.0.0.svn56).
* Fixed crash which happened if instrument without
instrument script was loaded (fixes #227).
Bumped version (1.0.0.svn55).
* RT instrument scripts: Pass/preserve polyphonic variable data
from respective "note" event handler to "release" event handler.
Fixed theoretical memory leak regarding instrument scripts.
Bumped version (1.0.0.svn54).
* Implemented built-in instrument script function "set_event_mark()".
Implemented built-in instrument script function "delete_event_mark()".
Implemented built-in instrument script function "by_marks()".
Added built-in instrument script int const variables $MARK_1 to $MARK_28.
Built-in instrument script functions "ignore_event()", "note_off()" and
"gig_set_dim_zone()" now also accept an array of event IDs as argument
(i.e. return value of new script function "by_marks()").
Bumped version (1.0.0.svn53).
* Implemented built-in instrument script function "note_off()".
Bumped version (1.0.0.svn52).
* Implemented built-in instrument script function "abs()".
Implemented built-in instrument script function "random()".
Implemented built-in instrument script function "num_elements()".
Disabled debug mode of RefPtr template class.
Bumped version (1.0.0.svn51).
* Fixed execution of "init" instrument script handler.
Fixed further crashes.
Bumped version (1.0.0.svn50).
* Fixed silence and another crash.
Bumped version (1.0.0.svn49).
* Implemented built-in script int array variable $KEY_DOWN.
Bumped version (1.0.0.svn48).
* Fixed crashes when exiting the sampler.
Bumped version (1.0.0.svn47).
* Fixed crash when loading an instrument script.
Fixed "init" script handler only to be executed once:
when the script was loaded.
Fixed aftertouch script event which always had value zero
and controller number was set to aftertouch value instead.
gig Engine: Fixed handling of "smartmidi" dimension, which
was recognized as "unknown" dimension.
Fixed script function gig_set_dim_zone(): was accessing
ls_instr_script command line tool: is now not limited to
core language scripts, but can now also parse sampler format
dependent instrument scripts, with the respective specific
built-in script variables and functions.
ScriptVM: Fixed runtime behavior of "and" and "or" binary
script expressions, which also evaluated the right hand side
of the expression even if the left hand side already failed
the overall expression semantic to become true.
Bumped version (1.0.0.svn46).
* removed usage of c++11 initializer that caused compilation errors on
* Implemented built-in instrument script function "set_controller()".
Fixed built-in script functions "ignore_event()" and
Added extended instrument script VM for the Gigasampler/GigaStudio format
sampler engine, which extends the general instrument script VM with Giga
format specific variables and functions.
Giga format instrument scripts: added built-in script int constant
variables $GIG_DIM_CHANNEL, $GIG_DIM_LAYER, $GIG_DIM_VELOCITY,
$GIG_DIM_AFTERTOUCH, $GIG_DIM_RELEASE, $GIG_DIM_KEYBOARD,
$GIG_DIM_ROUNDROBIN, $GIG_DIM_RANDOM, $GIG_DIM_SMARTMIDI,
$GIG_DIM_ROUNDROBINKEY, $GIG_DIM_MODWHEEL, $GIG_DIM_BREATH,
$GIG_DIM_FOOT, $GIG_DIM_PORTAMENTOTIME, $GIG_DIM_EFFECT1,
$GIG_DIM_EFFECT2, $GIG_DIM_GENPURPOSE1, $GIG_DIM_GENPURPOSE2,
$GIG_DIM_GENPURPOSE3, $GIG_DIM_GENPURPOSE4, $GIG_DIM_SUSTAIN,
$GIG_DIM_PORTAMENTO, $GIG_DIM_SOSTENUTO, $GIG_DIM_SOFT,
$GIG_DIM_GENPURPOSE5, $GIG_DIM_GENPURPOSE6, $GIG_DIM_GENPURPOSE7,
$GIG_DIM_GENPURPOSE8, $GIG_DIM_EFFECT1DEPTH, $GIG_DIM_EFFECT2DEPTH,
$GIG_DIM_EFFECT3DEPTH, $GIG_DIM_EFFECT4DEPTH, $GIG_DIM_EFFECT5DEPTH.
Giga format instrument scripts: Implemented built-in script function
"gig_set_dim_zone(event_id, dimension, zone)", which allows to override
dimension zone(s) for new voices.
Bumped version (1.0.0.svn45).
* ScriptVM (WIP): Built-in script function "play_note()" now returns the
event ID of the triggered note.
ScriptVM (WIP): Implemented built-in script int variable $EVENT_ID.
ScriptVM (WIP): Implemented built-in script function "ignore_event()".
ScriptVM (WIP): Implemented built-in script function
"ignore_controller()" (accepts one and no argument).
Bumped version (1.0.0.svn44).
* ScriptVM (WIP): Implemented execution of script event
handlers "note" and "release".
ScriptVM (WIP): Implemented built-in script function
"play_note()" (only two of the max. four function
arguments are currently implemented yet though).
ScriptVM (WIP): Fixed incorrect handling of
Bumped version (1.0.0.svn43).
* ScriptVM (WIP): started to integrate real-time instrument script
support into the sampler engine implementations. The code is
shared among all sampler engines, however currently only the gig
file format supports storing instrument scripts (as LinuxSampler
extension to the original GigaStudio 4 file format).
gig engine: Added support for loading instrument scripts from .gig
ScriptVM (WIP): Implemented built-in script variables %CC, $CC_NUM,
$EVENT_NOTE, $EVENT_VELOCITY, $VCC_MONO_AT, $VCC_PITCH_BEND.
ScriptVM (WIP): Implemented execution of script event handler "init".
ScriptVM (WIP): Implemented execution of script event handler
Bumped version (1.0.0.svn42).
* ScriptVM: refactoring and fixes.
* Fixed compile error on Windows.
* (WIP) Implemented parser and VM for upcoming new real-time instrument
script support. It needs yet to be integrated into the sampler's
sampler engines. You can toy around for now with the command line tool
"ls_instr_script" and i.e. examples showing the core language features
Bumped version (1.0.0.svn41).
* fixed warning in configure script
* CoreMIDI: automatically connect to all input sources by default (driver
* Giga format: Fixed crash that happened with velocity split sounds
under certain conditions (see also previous commit on libgig).
Bumped version to 1.0.0.svn40.
* Aftertouch: extended API to explicitly handle channel pressure and
polyphonic key pressure events (so far polyphonic pressure was not
supported at all, and channel pressure was rerouted as CC128 but not
used so far).
Gig Engine: Fixed support for 'aftertouch' attenuation controller.
Bumped version (1.0.0.svn39).
* LSCP server: optimized server side processing of LSCP shell tasks (caused
a sluggish behavior, i.e. when using arrow up/down keys in LSCP shell).
LSCP shell: fixed crash on server disconnection.
LSCP shell: fixed trash printed on terminal for LSCP documentation
Automake: tried to address a compilation error with automake 1.9
(see bug #216), seems that it did not fix it though.
Bumped version (1.0.0.svn38).
* LSCP shell (WIP): Added initial support for built-in LSCP reference
documentation, which will automatically show the relevant LSCP reference
section on screen as soon as one specific LSCP command was detected while
typing on the command line.
Bumped version (1.0.0.svn37).
* sfz parser bugfix: generation of velocity curves etc should not be
done after each "#include", only after the main file is parsed
sfz parser bugfix: line numbers in error messages were wrong after
disabled build of LSCP shell on windows
* LSCP server: fixed crash caused by endless recursion in
LSCP shell grammar evaluation algorithm.
LSCP shell: quit shell app when TCP connection aborted.
Bumped version (1.0.0.svn36).
* LSCP shell: Added support for moving cursor left/right with arrow keys.
Bumped version (1.0.0.svn35).
* SFZ format: Added support for "#include" instruction (modified patch
which was originally posted by Sergey on LS mailing list).
Bumped version (1.0.0.svn34).
* LSCP shell: in case of multiple possibilities or non-terminal symbols,
show them right to the current command line immediately while typing
(no double tab required for this feature, as it would be the case in
LSCP shell: fixed sluggish behavior when doing tab auto complete
LSCP shell: fixed conflicting behavior between keyboard input and
LSCP server evaluation result, that caused an inconsistent screen
output (keybord input is now never printed directly on screen, only
the result returned from LSCP server)
* LSCP Server: Fixed bug in LSCP grammar definition which caused a
statement like "GET SERVER INFOasdf\n" to be accepted as valid
statement (was so far practically irrelevant, however it caused
problems with the following new LSCP shell's auto completion
LSCP shell: improvement of auto completion feature, which now
not only resolves the next LSCP command token, but the longest,
unique sequence of LSCP commands expected next. Accordingly it
can now auto complete an entire line.
Bumped version (1.0.0.svn33).
* VirtualMidiDevice: implemented support for program change, bank select
and pitch bend.
Bumped version (1.0.0.svn32).
* enabled automake 'subdir-objects' option and moved external source
references (vst, au, asio) from makefiles to cpp files, in order to
get rid of warnings from automake 1.14
* LSCP shell (WIP): added support for browsing the command
history with up / down keys.
LSCP server: fixed compilation error with Bison 3.x.
Bumped version (1.0.0.svn31).
* LSCP shell (WIP): show a prompt & welcome message
LSCP shell (WIP): fixed startup crash that happened
on some systems
Bumped version (1.0.0.svn30).
* WIP: LSCP Shell: implemented support for auto-correction of
obvious and trivial LSCP syntax mistakes, support for
auto-completion by tab key and visual completion suggestion
Bumped version (1.0.0.svn29).
* WIP: Introducing the LSCP shell: for now, providing color
highlighting while typing (indicating correct part bold white,
incorrect part red, and turning green when the command is
complete. The shell application is implemented as thin client,
that is the parser work is performed on sampler side and the
shell application is just providing output formatting.
Bumped version (1.0.0.svn28).
* JACK audio driver: return JACK server's current sample rate
as default value for audio device parameter "SAMPLERATE"
Bumped version (1.0.0.svn27).
* LSCP server: provide comprehensive error messages on LSCP
syntax errors (suggesting expected next non-terminal symbols)
Bumped version (v1.0.0.svn26).
* ASIO driver: be more verbose when no ASIO card could be found
ignore missing LADSPA paths without ignoring valid LADSPA paths
updated linuxsampler man page
* Bugfix: only process the latest MIDI program change event.
* Minor C++11 compliance fixes (caused compilation errors
on some recent compilers).
* Added support for multiple MIDI input ports per sampler channel (added
various new C++ API methods for this new feature/design, old C++ API
methods are now marked as deprecated but should still provide full
behavior backward compatibility).
LSCP Network interface: Added the following new LSCP commands for the new
feature mentioned above: "ADD CHANNEL MIDI_INPUT",
"REMOVE CHANNEL MIDI_INPUT" and "LIST CHANNEL MIDI_INPUTS". As with the
C++ API changes, the old LSCP commands for MIDI input management are now
marked as deprecated, but are still there and should provide full behavior
New LSCP specification document (LSCP v1.6).
AbstractEngine::GSCheckSum(): don't allocate memory on the stack (was
unsafe and caused compilation error with old clang 2.x).
Bumped version (1.0.0.svn25).
* Enabled automatic svn "Revision" macro expansion on certain files.
Bumped version to 1.0.0.svn24.
* fixed build error on newer MinGW
support building with older jack versions
support building with spaces in vst sdk path
* Mac OS X: added temporary hack allowing to spawn gigedit as callback
on the process's main thread.
Bumped version to 1.0.0.svn23.
* CoreAudio: fixed minor error handling bug.
Bumped version to 1.0.0.svn22.
* fix for building with bison 3.0 (#202)
* fixed building with C++11
build fix: ChangeFlagRelaxed.h was missing in makefile
build fix: libsndfile compiler flags were missing in some makefiles
* Added DoubleBuffer class, built on top of SynchronizedConfig, aiming to
reduce the amount of code for protecting shared data.
* lsatomic.h fixes: seq_cst load and store were suboptimal for x86 and
broken for ppc64. (Seq_cst loads and stores are actually not used in
LS, so the bug wasn't noticable.)
lsatomic.h: added ARMv7 support
* MME driver bugfix: driver wasn't closed properly
* Immediately apply scale tuning changes to active voices.
Exposed scale tuning to C++ API (along to the already existing standard
Bumped version to 1.0.0.svn21
* JACK driver: Use jack_on_info_shutdown() instead of the
deprecated jack_on_shutdown() callback mechanism.
* CoreMIDI re-fix: previous fix for handling multiple events in one packet
* Started to spread new C++ keyword "override" over the code base
(keyword introduced with C++11 standard).
* CoreMIDI fix: a MIDIPacket can contain more than one event per packet.
* Reverted yesterday's MME driver change for now (requires some
additional code in RTMath for being able to work correctly).
* code refactoring: added a lock guard class for exception safe mutex
handling and used it everywhere appropriate
* MIDI drivers: Implemented missing handling of MIDI "running status".
MME driver: pass time stamps to the sampler.
* fixed makefile for AU plugin, which was broken in previous commit
* removed usage of deprecated Automake variable INCLUDES
ASIO driver: removed compiler warnings
* Bugfix: update effects on sample rate & period size changes.
JACK: allow to register jackd shutdown listeners.
* Several fixes in JACK audio driver:
- React on sample rate changes.
- React on buffer size changes.
- jack_port_get_buffer() was cached and called
outside RT context.
* gig engine: fixed EG1 modulation when attack or release is zero
* sfz parser bugfix: lines starting with whitespace were ignored
sfz engine: added amplitude opcode
* sfz engine: added FLAC support (#191)
* Exclusive Groups: don't ever stop voices of the same note,
doesn't sound naturally with a drumkit.
* fixed compilation with Clang 3.2
* Bugfix in VirtualMidiDevice: process note on with velocity 0 as note off.
* Fixed variable underflow in VirtualMidiDevice, which caused graphical
virtual keyboards in frontends / instrument editors being stuck.
VirtualKeyboard: allow to dynamically adjust max. MIDI events.
RingBuffer: added resize() method
* all engines: add pan CC value to instrument pan parameter before
applying panning, instead of using two separate pan functions in
sfz parser: allow -200 to 200 for pan_oncc opcode (#182)
gig engine: handle special case when pan parameter in gig file has
max or min value
CoreMIDI: fixed memory deallocation error
* Added support for MIDI note on velocity filter
Bumped version to 1.0.0.svn20
* fixed linkage error when building with LDFLAGS="-Wl,--no-undefined"
* Various "const" and "restrict" optimizations.
* Added new C++ API method Sampler::GetGlobalMaxVoices().
Added new C++ API method Sampler::GetGlobalMaxStreams().
Added new C++ API method Sampler::SetGlobalMaxVoices().
Added new C++ API method Sampler::SetGlobalMaxStreams().
CoreMIDI: remove ports that disappeared on the OS from
the internal list of port bindings
Fixed erroneous piping of error message in
src/engines/common/VoiceBase.h (labelled "Disk stream not
available in time").
* VST: implemented retrieval and switching of programs using the
sampler's internal MIDI instrument mapping system
VST: reply to "canDo" plugin features we don't know as "don't know"
bumped version to 1.0.0.svn19
* CoreMIDI driver: implemented driver specific port parameter
"CORE_MIDI_BINDINGS", which allows to retrieve the list of CoreMIDI
clients / ports and to connect to them a la JACK, via the usual
CoreMIDI driver: added driver specific port parameter "AUTO_BIND", if
enabled the driver will automatically connect to other CoreMIDI
clients' ports (e.g. external MIDI devices being attached to the Mac)
* fixed configure mistake for mac
* fixed configure mistake in previous commit
* modernized configure script
* sfz engine: fixed crash when using lochan/hichan opcodes (#187)
* LV2: fixed save/restore of SFZ state (patch by David Robillard)
LV2: made LV2 plugin buildable on Windows and Mac
* LV2: use urid and atom extensions instead of deprecated uri-map and
LV2: lv2 package 1.0 is now required to build the LV2 plugin
LV2: changed number of output channels to 16 stereo, just like the
VST and AU plugins
* DSSI bugfix: it wasn't possible to change engine type. The MIDI port
and audio channel routing for DSSI plugins are now visible.
* fixed crash when a channel received a program change while playing a
note in a key group
* Mac OS X: fixed process hang when unloading 32-bit plugin (bug
introduced in previous fix)
* Mac OS X: fixed crash when unloading plugin on 10.7 and later
* VST: try to open Fantasia automatically on Linux and Mac too (on
Linux, the Fantasia jar should be placed in <prefix>/share/java)
VST: fixed crashes on Linux Ardour and EnergyXT
* fixed configure script error with old autoconf versions
LV2: use the new lv2 package if present
lsatomic.h: use gcc provided atomic functions if building with gcc
4.7 and C++11
added comments in lsatomic.h
* Update to latest LV2 state extension (by David Robillard).
* fixed compilation with gcc 4.7
* Introduced new C++ API method EngineChannel::InstrumentFileName(int index)
allowing to retrieve the whole list of files used for the loaded
instrument on an engine channel (a.k.a. part). Some GigaStudio instruments
for example are splitted over several files like "Foo.gig", "Foo.gx01",
Bumped version to 1.0.0.svn18
* sfz/sf2 engine: fixed crash when using small audio fragment size
* bugfix: instrument loading crashed for sfz and sf2 in Ardour (#176)
more thread safety fixes for the instrument loading thread
* plugin bugfix: instrument loading hang when the plugin was loaded a
second time (this time it's for Linux and Mac, previous similar fix
was for Windows)
thread safety fixes for the instrument loading thread
MME driver: removed compiler warning
LV2: fixed invalid realtime statement in plugin metadata
* bugfix: voice stealing didn't work for SFZ and SF2 engines
* sfz engine bugfix: looping was disabled if loop_start was set to 0
sfz engine: allow regions with end=-1 to turn off other regions
using the group and off_by opcodes (#168)
sfz engine: made end=0 play the whole sample
sfz engine: fixed support for lochan and hichan opcodes (#155)
bumped version to 1.0.0.svn17
* VST bugfix: instrument loading hang and crashed the host when the
plugin was loaded a second time (#174)
* sfz engine bugfix: only the first amp_veltrack definition in a file
* bugfix: LADSPA_PATH was not evaluated correctly when containing
multiple paths (#165)
* more LV2 "state" extension support fixes (patch by David Robillard)
sfz parser: allow double spaces in sample filenames
sfz parser: allow absolute paths for sample filenames
MME driver: fixed memory handling bug found with cppcheck
sfz/sf2 engines: use linear decay and release for filter and pitch
* fixed bug #162
* added command line option --exec-after-init
* LV2 "state" extension support fixes (patch by David Robillard)
bumped version to 1.0.0.svn16
* implemented opcodes eq1_vel2freq, eq2_vel2freq,
eq3_vel2freq, eq1_vel2gain, eq2_vel2gain, eq3_vel2gain
* implemented opcodes egN_eq1gain, egN_eq2gain, egN_eq3gain,
egN_eq1gain_onccX, egN_eq2gain_onccX, egN_eq3gain_onccX, egN_eq1freq,
egN_eq2freq, egN_eq3freq, egN_eq1freq_onccX, egN_eq2freq_onccX,
egN_eq3freq_onccX, egN_eq1bw, egN_eq2bw, egN_eq3bw, egN_eq1bw_onccX,
egN_eq2bw_onccX, egN_eq3bw_onccX, lfoN_eq1gain, lfoN_eq2gain,
lfoN_eq3gain, lfoN_eq1gain_onccX, lfoN_eq2gain_onccX, lfoN_eq3gain_onccX,
lfoN_eq1gain_smoothccX, lfoN_eq2gain_smoothccX, lfoN_eq3gain_smoothccX,
lfoN_eq1gain_stepccX, lfoN_eq2gain_stepccX, lfoN_eq3gain_stepccX,
lfoN_eq1freq, lfoN_eq2freq, lfoN_eq3freq, lfoN_eq1freq_onccX,
lfoN_eq2freq_onccX, lfoN_eq3freq_onccX, lfoN_eq1freq_smoothccX,
lfoN_eq2freq_smoothccX, lfoN_eq3freq_smoothccX, lfoN_eq1freq_stepccX,
lfoN_eq2freq_stepccX, lfoN_eq3freq_stepccX, lfoN_eq1bw, lfoN_eq2bw,
lfoN_eq3bw, lfoN_eq1bw_onccX, lfoN_eq2bw_onccX, lfoN_eq3bw_onccX,
lfoN_eq1bw_smoothccX, lfoN_eq2bw_smoothccX, lfoN_eq3bw_smoothccX,
lfoN_eq1bw_stepccX, lfoN_eq2bw_stepccX, lfoN_eq3bw_stepccX
* use different EQ effect instance for every voice
* implemented opcodes delay, delay_onccN, delay_random,
* fixed crash when trying to create an effect instance with controls
which min and/or max values depend on the sample rate
experimental support for per voice equalization (work in progress)
sfz engine: implemented opcodes eq1_freq, eq2_freq, eq3_freq,
eq1_freqccN, eq2_freqccN, eq3_freqccN, eq1_bw, eq2_bw, eq3_bw,
eq1_bwccN, eq2_bwccN, eq3_bwccN, eq1_gain, eq2_gain, eq3_gain,
eq1_gainccN, eq2_gainccN, eq3_gainccN
* LV2 State extension;
replaces LV2 Persist and LV2 Files extensions (patch by David Robilard).
* fixed handling of rapid bank select and program change messages sent
to the same sampler channel (patch from the Open Octave project,
* Bugfix: When creating MIDI instrument map entries with "PERSISTENT"
type, the instruments were uselessly precached with zero samples,
however it still took the full preloading time and on 1st program
change the respective instrument was completely reloaded again.
Bumped version to 1.0.0.svn15
* sfz engine: implemented opcodes volume_stepccN, pan_stepccN,
cutoff_stepccN, resonance_stepccN, lfoN_freq_stepccX,
lfoN_volume_stepccX, lfoN_pitch_stepccX, lfoN_pan_stepccX,
* sfz engine: implemented opcodes pitch_onccN,
pitch_curveccN, pitch_smoothccN, pitch_stepccN
* sfz engine: implemented opcodes fillfo_depthchanaft,
fillfo_freqchanaft, amplfo_depthchanaft, amplfo_freqchanaft,
* sfz engine: implemented opcodes resonance_onccN, resonance_smoothccN,
resonance_curveccN, cutoff_smoothccN, cutoff_curveccN
* sfz engine: *lfo_freqccN wasn't working when the respective *lfo_freq
was not set or was set to zero
sfz engine: lfoN_freq_onccX wasn't working when lfoN_freq
was not set or was set to zero
* sfz engine: implemented automatic aliasing *ccN <-> *_onccN
* sfz engine: implemented opcodes fileg_delay_onccN,
fileg_start_onccN, fileg_attack_onccN, fileg_hold_onccN,
fileg_decay_onccN, fileg_sustain_onccN, fileg_release_onccN,
fileg_depth_onccN, pitcheg_delay_onccN, pitcheg_start_onccN,
pitcheg_attack_onccN, pitcheg_hold_onccN, pitcheg_decay_onccN,
pitcheg_sustain_onccN, pitcheg_release_onccN, pitcheg_depth_onccN
* sfz engine: implemented opcodes amplfo_delay_onccN,
amplfo_fade_onccN, fillfo_delay_onccN, fillfo_fade_onccN,
* possibly fixes a compile error on Windows and Mac OS X
introduced in the previous commit
* sfz engine: use common pool of CC objects to minimize RAM usage
* bugfix: sfz engine was using enormous amount of memory
bumped version to 1.0.0.cvs14
* sfz engine: implemented opcodes pan_onccN, pan_smoothccN,
pan_curveccN, egN_pan, egN_pan_curve, egN_pan_onccX,
sfz engine: when failed to parse a sfz file
print the line number on which the error occurs
* sfz engine: implemented opcodes xfin_lokey, xfin_hikey,
xfout_lokey, xfout_hikey, xf_keycurve, xfin_lovel, xfin_hivel,
xfout_lovel, xfout_hivel, xf_velcurve, xfin_loccN, xfin_hiccN,
xfout_loccN, xfout_hiccN, xf_cccurve
* sfz engine: implemented opcodes egN_amplitude_onccX,
egN_volume, egN_volume_onccX, egN_cutoff, egN_cutoff_onccX,
egN_pitch, egN_pitch_onccX, egN_resonance, egN_resonance_onccX
* sfz engine: implemented opcode end
* sfz engine: implemented opcodes fillfo_depthccN, amplfo_depthccN,
lfoN_volume, lfoN_volume_onccX, lfoN_volume_smoothccX,
lfoN_freq_smoothccX, lfoN_pitch_smoothccX, lfoN_pan_onccX,
lfoN_pan_smoothccX, lfoN_cutoff_onccX, lfoN_cutoff_smoothccX,
lfoN_resonance_onccX, lfoN_resonance_smoothccX, lfoN_delay_onccX
* sfz engine: implemented opcode volume_smoothccN
* sfz engine: some group opcodes were not reset on next group
* sfz engine: implemented curves
sfz engine: implemented opcodes volume_onccN, volume_curveccN
* sfz engine: implemented opcodes ampeg_delayccN, ampeg_startccN,
ampeg_attackccN, ampeg_holdccN, ampeg_decayccN, ampeg_sustainccN,
ampeg_releaseccN, egN_timeX_onccY, egN_levelX_onccY
sfz engine: lfoN_* and egN_* opcodes defined
in group sections are now taken into account
* sfz engine: implemented opcodes fillfo_freqccN,
pitchlfo_freqccN, amplfo_freqccN, lfoN_freq_onccX
* sfz engine: implemented opcodes pitchlfo_fade,
fillfo_fade, amplfo_fade, lfoN_fade, lfoN_fade_onccX
* sfz engine: implemented opcodes lfoN_phase, lfoN_phase_onccX,
* implemented opcode pitchlfo_depthccN
* implemented sine LFO, pulse LFO and saw LFO
sfz engine: implemented opcode lfoN_wave
* sfz engine: implemented opcodes fileg_delay, fileg_start, fileg_attack,
fileg_hold, fileg_decay, fileg_sustain, fileg_release, fileg_vel2delay,
fileg_vel2attack, fileg_vel2hold, fileg_vel2decay, fileg_vel2sustain,
bumped version to 1.0.0.cvs13
* sfz engine: implemented opcodes pitchlfo_delay, pitchlfo_freq,
pitchlfo_depth, fillfo_delay, fillfo_freq, fillfo_depth,
amplfo_delay, amplfo_freq, amplfo_depth
* sfz engine: implemented opcodes ampeg_delay, ampeg_vel2delay
pitcheg_delay, pitcheg_start, pitcheg_attack, pitcheg_hold,
pitcheg_decay, pitcheg_sustain, pitcheg_release, pitcheg_vel2delay,
pitcheg_vel2attack, pitcheg_vel2hold, pitcheg_vel2decay,
pitcheg_vel2sustain, pitcheg_vel2release, pitcheg_depth
* sfz engine: implemented opcodes lfoN_delay,
lfoN_freq, lfoN_pan, lfoN_cutoff, lfoN_resonance
* sfz engine: use the newly introduced signal units model
* removed helper classes SignalUnitBase,
clean up sf2::Voice
bumped version to 1.0.0.cvs12
* sfz: added support for sample offset (offset)
* Mac OS X: Makefile fix for the install-strip target
* simplified the signal unit model
sf2: initial implementation of modulation LFO and cutoff filter
* Introduced Signal Units and Signal Unit Racks, which hopefully will meet
the demands of the new engines for flexible signal processing.
sf2: Initial implementation of vibrato LFO, fixes in modulation EG and
and volume EG (work in progress)
* sf2 engine: fine-tuned amplitude EG (by switching from gig to sfz EG)
sfz engine: added support for EG hold (ampeg_hold)
Mac OS X: made it possible to specify plugin installation dir to
* Fixed possible crashes due to corrupted MIDI/audio device list
after MIDI/audio device creation failure
* bugfix: LSCP command "REMOVE FX_SEND EFFECT" was broken
fixed a bug in FxSend::SetDestinationEffect
bugfix: parent was not set when effect instance is appended
bugfix: was able to remove effect chain while FX send is connected to it
bugfix: was able to remove effect instance from effect chain while
FX send is connected to that instance
* AU: changed number of output channels from one stereo to 16 stereo
VST: made it possible to build the VST plugin for Mac
AU: link AU plugin dynamically if --disable-shared isn't specified
minor Makefile fix for building lscpparser when build and source
directories are separate
* Added LSCP commands "SUBSCRIBE EFFECT_INSTANCE_COUNT",
"SUBSCRIBE EFFECT_INSTANCE_INFO", "SUBSCRIBE SEND_EFFECT_CHAIN_COUNT",
* Windows: disabled the previous thread fix on non-Mac systems, as it
caused hanging threads on Windows
* fixed compilation with gcc 4.6.1
another "make dist" fix, for LV2 plugin
made --enable-pthread-testcancel default on Mac OS X
Mac OS X: fixed hanging threads
* Mac OS X fixes: support the new dir for Core Audio SDK, fixed name
collision of enum in EffectControl, fixed building outside source
directory, fixed wrong name of destructor in
made sure all source files for hostplugins are included when doing
removed empty directories left from the cvs to svn migration
* sfz engine: added support for velocity effect on amplifier envelope
time (ampeg_vel2attack, ampeg_vel2decay, ampeg_vel2sustain and
* sfz engine: implemeted filters. Filter types: lowpass, bandpass,
bandreject and highpass. 1, 2, 4 and 6 pole filters. Opcodes:
fil_type, cutoff, resonance, fil_veltrack, fil_keytrack,
fil_keycenter, cutoff_cc, cutoff_chanaft.
sfz engine: bugfix: zero ampeg_sustain didn't work
gig engine: bugfix: pitch LFO controller "internal+aftertouch" was broken
gig engine: bugfix: filter keyboard tracking was broken
gig engine: filter performance fix (an unnecessary copy was made of
the filter parameters in each sub fragment)
ASIO driver: fixes for newer gcc versions (fix from PortAudio)
* plugin changes:
- LV2 Persist + Files support (patch by David Robillard)
* sfz engine: use loop markers from sample file if loop_start and
loop_end are not set in sfz file
* bugfix: calling SET VOICES (which Fantasia does on start and
refresh) could cause instruments to be unloaded
plugins: save engine type (gig, sfz or sf2) in plugin state
VST: when opening Fantasia, look for both 32 and 64 bit Java on
64 bit Windows
* bugfix: playing a note while changing the instrument could cause a
crash, or give "Handing back unknown region" error messages
* raised limit of program change queue from 100 to 512
(as suggested by Alex Stone)
removed limit of maximum amount of MIDI ports per MIDI device, since
there is no reason for this limit
minor syntax simplification regarding 2 new LSCP commands: changed
"SET FX_SEND SEND_EFFECT"" to "SET FX_SEND EFFECT" and changed
"REMOVE FX_SEND SEND_EFFECT"" to "REMOVE FX_SEND EFFECT", also changed
the respective category field of command "GET FX_SEND INFO" from
"SEND_EFFECT" to "EFFECT"
updated LSCP specification document
bumped version to 1.0.0.cvs10
* minor fixes regarding new LSCP effect commands
updated LSCP specification document regarding new effect commands
bumped version to 1.0.0.cvs9
* revised previously added new LSCP commands regarding effect handling:
renamed "master effects" to "send effects", since this is the actual
correct common term for those effects
also corrected the names regarding "send effects" in the respective
methods of the "FxSsnd" class and "AudioOutputDevice" class of the
sampler's C++ API, the old methods are still available but marked as
deprecated and scheduled for removal
added LSCP command "SET FX_SEND SEND_EFFECT <sampler_channel>
<fx_send_id> <effect_chain> <chain_pos>"
added LSCP command "REMOVE FX_SEND SEND_EFFECT <sampler_channel>
added a list of common known LADSPA paths (for Windows and POSIX) which
will be automatically checked for being used as LADSPA plugin directory
(if the user did not set the LADSPA_PATH environment variable explicitly)
bumped version to 1.0.0.cvs8
* added and implemented a set of 19 new LSCP commands for controlling
- added LSCP command "GET AVAILABLE_EFFECTS"
- added LSCP command "LIST AVAILABLE_EFFECTS"
- added LSCP command "GET EFFECT INFO <effect-index>"
- added LSCP command "CREATE EFFECT_INSTANCE <effect-index>"
- added LSCP command
"CREATE EFFECT_INSTANCE <effect-system> <module> <effect-name>"
- added LSCP command "DESTROY EFFECT_INSTANCE <effect-instance>"
- added LSCP command "GET EFFECT_INSTANCES"
- added LSCP command "LIST EFFECT_INSTANCES"
- added LSCP command "GET EFFECT_INSTANCE INFO <effect-instance>"
- added LSCP command "GET EFFECT_INSTANCE_INPUT_CONTROL INFO
- added LSCP command "SET EFFECT_INSTANCE_INPUT_CONTROL <effect-instance>
- added LSCP command "GET MASTER_EFFECT_CHAINS <audio-device>"
- added LSCP command "LIST MASTER_EFFECT_CHAINS <audio-device>"
- added LSCP command "ADD MASTER_EFFECT_CHAIN <audio-device>"
- added LSCP command
"REMOVE MASTER_EFFECT_CHAIN <audio-device> <effect-chain>"
- added LSCP command
"GET MASTER_EFFECT_CHAIN INFO <audio-device> <effect-chain>"
- added LSCP command "APPEND MASTER_EFFECT_CHAIN EFFECT <audio-device>
- added LSCP command "INSERT MASTER_EFFECT_CHAIN EFFECT <audio-device>
<effect-chain> <effect-instance> <effect-chain-pos>"
- added LSCP command "REMOVE MASTER_EFFECT_CHAIN EFFECT <audio-device>
bumped version to 1.0.0.cvs7
* fixed compile errors on windows
* fixed crash when deleting a sampler channel or changing engine type
while an instrument load was in progress
* fixed memory leak in the new internal effects code
* implemented support for internal LADSPA effects (work in progress)
* fixed crash which occured when changing an already deployed sampler
channel to a different engine type (e.g. from gig to sf2)
bumped version to 1.0.0cvs5
* implemented Roland GS NRPN 1ArrH which allows to set volume per note
implemented Roland GS NRPN 1CrrH which allows to set pan per note
implemented Roland GS NRPN 1DrrH which allows to set reverb send per
note (in this implementation of the sampler its simply hard routed to
the 1st effect send of the sampler channel, no matter what the actual
effect type is)
implemented Roland GS NRPN 1ErrH which allows to set chorus send per
note (in this implementation of the sampler its simply hard routed to
the 2nd effect send of the sampler channel, no matter what the actual
effect type is)
bumped version to 1.0.0cvs4
* sfz engine: fixed playback of 16 bit wav files on big endian CPUs
sfz engine: added support for Ogg Vorbis sample files
* sfz engine: added support for controller triggered regions
sfz engine: added support for loop_mode=one_shot
* sfz engine: improved support for exclusive groups (group, off_by and
minor valgrind fixes
* sfz engine: optimized sample lookup
sfz engine: fixed bug introduced in previous commit: sample lookup
returned wrong sample
* sfz/sf2 engines: RT-safeness: avoid malloc in audio thread
sfz/sf2 engines: fixed a bug that could cause voice stealing to fail
* sfz engine: reduced memory usage for sfz data
* sfz engine: added support for transpose
sfz engine: fixed crash when using sw_down/up
sfz engine: improved logic for sw_lokey/hikey/up/down/last
sfz parser: added more v1 aliases
fixed building with newer MinGW-w64
* sfz engine: added support for amp_veltrack and amp_velcurve_N.
Fine-tuned the default velocity curve.
* sfz engine: added support for random, seq_position, seq_length and
sfz parser: added v1 LFO opcodes (no support in engine yet)
* sfz engine: added support for off_mode=normal
* sfz engine: added support for trigger=release and rt_decay
* sfz/sf2 engines: fixed memory leak and memory handling errors
sfz engine: added support for sw_trigger=first, sw_trigger=legato
sfz parser: allow non-numerical key values ("C#4" for example)
sfz engine: "key" opcode now sets pitch_keycenter too
sfz engine: fixed error when unloading instrument with same sample
used by multiple regions
sfz parser: added some opcode aliases, like loopmode for loop_mode,
to be more compatible
* sfz engine: added support for v2 multiple stage envelope generators
sfz engine: added a fine-tuned v1 envelope generator instead of
using the one from the gig engine
* Introduced support for optional environment variable
"LINUXSAMPLER_PLUGIN_DIR" which allows to override the directory
where the sampler shall look for instrument editor plugins
(patch by Luis Garrido, slightly modified).
bumped version to 1.0.0.cvs3
* command line option '--profile' is currently disabled, since the
respective profiling code is currently broken
* VST bugfix: If the host called resume() before and after changing
sample rate or block size, the number of channels was incorrectly
set to two. This caused silence in Cubase 5.
removed compiler warnings
* gig engine: implemented the "round robin keyboard" dimension
gig engine: fixed round robin and random dimensions for cases when
number of dimension zones is not a power of two
gig engine: made round robin use a counter for each region instead
of each key
fixed building with libgig installed in a non-standard directory
* bugfix: release samples could cause loud noises
* sfz engine: support for exclusive groups
sf2 engine: support for exclusive groups
sf2 engine: manage presets only
sf2 engine: preset regions are now taken into account
* added support for sending MIDI CC messages via LSCP command
"SEND CHANNEL MIDI_DATA CC <sampler-chan> <ctrl> <val>"
* added support for sending MIDI CC messages via LSCP command
"SEND CHANNEL MIDI_DATA CC <sampler-chan> <ctrl> <val>"
bumped LSCP version to 1.5
* sfz engine: loop support
sf2 engine: 24bit support
sf2 engine: loop support
sf2 engine: instrument unloading
* SFZ format engine: implemented 24 bit support
* SFZ format engine: Implemented sfz version 1
Filter EG, Amplifier EG and Pitch EG
use SF2 file loader from libgig
* Refactoring: moved the independent code from gig::Voice to base classes
SoundFont format engine: implemented EG1 & EG2
* fixed compilation error in DSSI plugin
removed gig engine dependency in DSSI plugin
* Refactoring: moved the independent code from
the Gigasampler format engine to base classes
SFZ format engine: experimental code (not usable yet)
SoundFont format engine: experimental code (not usable yet)
Fixed crash which may occur when MIDI key + transpose is out of range
* bugfix: AU plugin hangs on some hosts if bound to loopback
* ALSA MIDI driver supports now "NAME" device parameter, for overriding
the ALSA sequencer client name
* bugfix: AU plugin failed to destroy its audio/MIDI devices
* preparations for release 1.0.0
* ASIO fixes: avoid initializing the device twice, avoid throwing
exception when getting parameters from a disconnected device
Windows: add the installation directory to the DLL search path when
loading an editor plugin (solves problems with VST and gigedit on
systems with other GTK versions installed)
fixed minor memory leak in ALSA MIDI driver
* code cleanup of the ASIO driver
minor Makefile fix for parallel make
* fixed instrument database recursive import, which was broken on
* bugfix: LinuxSamplerVst::resume() did not call AudioEffectX::resume().
This caused LinuxSampler VST not appearing in the out: dropdown menu
under Cubase. Thanks to Arne Scheffler for the tip!
* bugfix: don't allow to change the audio output device, MIDI input device
or MIDI input port when using a host plugin implementation
(e.g VST, AU, DSSI, LV2) as this would go terribly wrong
* bugfix: don't allow to create or destroy audio devices and MIDI devices
of host plugin implementations (e.g VST, AU, DSSI, LV2) on their own,
as they only exist in the context of the plugin instance and would
otherwise crash the application
* fixed low-level ConditionServer usage bug that caused lockups on
* when cross-compiling, don't try to create instruments.db
fix for new mingw-w64 version, which has usleep
* fixed vector optimization code in AudioChannel.cpp:
- application crashed when audio buffer(s) were not 16 byte aligned
(e.g. the case with some VST host applications)
- vector extension code was always to tried be compiled, even though the
compiler didn't support vector extensions
* VST: look for the Fantasia binary in liblinuxsampler.dll's directory and
in its parent directory (required for the next Windows installer which
allows to install the 64 bit and 32 bit version of LinuxSampler VST
* made program change handling in MIDI thread real-time safe by moving
the logic to a non-RT thread
* fixed crash happening when a pitch bend event arrived at the same
time a new instrument was loading
fixed building with sqlite installed in a non-standard directory
* added channel routing, fxsends and midi maps to the settings stored
in the plugin state
* hotplugins/vst/PluginVst.cpp: Removed the final & when
launching Fantasia java GUI which was interpreted as an
LSCP file to be loaded and hindered its correct launching
from within the VST plugin (patch of Grigor)
* VST: changed number of output channels from one stereo to 16 stereo
* AudioChannel.cpp: added GCC vector extensions code for the functions
copyTo() and MixTo() , gives 300% speedup
should reduce CPU usage with large FX sends setups
* Instruments DB on Windows gets automatically created if not present
* InstrumentsDB on Windows now works in both standalone and VST mode
DB is stored in %USERPROFILE%\.linuxsampler\instruments.db
removed stat() implementation as mingw already provides it
* Added Instruments DB on Windows.
Relative path support for DB file (stdalone and VST) not implemented yet
* bugfix: note off was ignored when EG was in decay stage (bug
* VST: avoid opening Fantasia more than once for each VST instance
VST: export main function as "main" on Linux too (fix for energyXT)
VST: prepare code for multiple output channels
work-around for missing fnmatch function on Windows to make
instrument database compilable
* The number of audio channels and MIDI input ports in plugin audio/MIDI
devices is now fixed and can not be changed once the device is created
* bugfix: sometimes, when playing a note twice fast, the second note
* configure script fix: removed unconditional use of SSE
* Windows: look for editor plugins and Fantasia using base directory
of liblinuxsampler dll
lscp bugfix: SET CHANNEL MIDI_INPUT_TYPE didn't work with the MME
* bugfix: two private structs had the same name, which could cause
problems if the linker chose the wrong constructor
* fixes for using large audio device buffers
VST: added support for sample rate and buffer size changes
VST: close editor (Fantasia) when the VST is removed
minor fix in configure for mmsystem.h detection on MinGW
removed warnings from gcc 4.4 and valgrind
* fixed crash which occured when max. voices / streams limits were altered
while voices were still active
* fixed a memory management error which could cause a crash when a
plugin was unloaded
minor fixes in ASIO and MME drivers for win64
* applied old fixes from Benno to the ASIO driver that were included
in the previous binary release but accidentally never committed to
CVS (fixes #117)
* bugfix: pitch bend wasn't working with JackMidi, VST, LV2, Mme,
CoreMidi or AU
theoretical fix: made SynchronizedConfig follow C++0x memory model
* CoreAudio: the default value for BUFFERSIZE is now 256
CoreAudio: use the internal 32-bit floating point rendering
* LSCP server: hard close of all sockets on exit
Load instruments in background when restoring plugin state
* Unlock the access to the instruments database while scanning a gig file
* atomic.h was accidently included in the liblinuxsampler C++ API header
files (fixes bug #122)
* added optional 3rd party user data parameter for following
liblinuxsampler C++ API methods: InstrumentEditor::Main(),
minor cosmetics regarding configure script summary
debian packaging: include DSSI and LV2 plugin binaries of the sampler
into the liblinuxsampler package
RPM packaging: include DSSI and LV2 plugin binaries of the sampler
into the liblinuxsampler package
bumped version to 0.5.1.12cvs
* bugfix: low-level lsatomic.h load function was broken on 64-bit
PowerPC, which probably could cause crashes on that platform
minor cleanups and optimization in lsatomic.h
* C++ API method InstrumentManager::LaunchInstrumentEditor() now returns
a pointer to the launched InstrumentEditor object
* allow gig files to use unlimited downward pitch shifting
added a limit check for upward pitch shifting
* added support for GS Reset SysEx message
* optimized the DSSI plugin: all plugin instances now share the same
disk streaming buffers
added support for the "fine tune" and "pitch bend range"
instrument-level gig parameters
fixed minor artifacts in pitch bend handling
* fixed hanging notes which occured when note-off event had the exact
same time stamp as the voice's note-on event and occured both in the
same audio fragment cycle (fixes bug #112)
bumped version to 0.5.1.11cvs
* fixed endless loop in Engine::SuspendAll() (bug #120)
AU plugin, work in progress: minor fixes in the build files
* fixed broken linuxsampler.spec RPM packaging file
(Luis Garrido, fixes #114)
* bugfix: on sample reference changes (instrument editor), only un-cache
the respective sample if it's really not used by any sampler engine
re-cache samples in case they were changed by an instrument editor, e.g.
when a sample was added while playing (#82)
bumped version to 0.5.1.10cvs
* fixed crash when a linuxsampler plugin is unloading
* close all connections when LSCPServer is deleted
* fixed crash when changing the audio output device of a sampler
channel with loaded instrument and start playing notes
* AU plugin, work in progress:
added build files
fixes in MIDI event handling
* AU plugin, work in progress: added the source files
* fixed crash when removing channel with active voices (#116)
* fixed orphaned pointers when setting maximum voices limit (bug #118)
* fixed building with libgig installed in a non-standard directory
* Adapted drivers/Plugin class to be used as a base class for the
AudioUnit plugin and fixed orphaned pointers when deleting PluginGlobal
Fixed possible iterator invalidations when resetting the sampler
Fixed memory leaks when issuing the following LSCP commands:
GET AUDIO_OUTPUT_DRIVER INFO
GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO
GET MIDI_INPUT_DRIVER INFO
GET MIDI_INPUT_DRIVER_PARAMETER INFO
Fixed possible compilation error when sqlite is not present
* CoreAudio: Improved hardware detection
CoreAudio: Added new driver parameter DEVICE
CoreAudio: Restart the audio queue when the device
is changed, for example when headphones are plugged
* automatic stacktrace mechanism is now turned off by default and can
be switched on by command line option "--stacktrace" (the automatic
stacktrace mechanism seems to be broken on most systems at the moment)
bumped version to 0.5.1.9cvs
* added (experimental) CoreAudio driver
* fixed termination caused by uncaught exception when adding MIDI
instrument with PERSISTENT load mode
* fixed a crash which occurs when removing a sampler channel with
instrument loading in progress (bug #113)
* fixed CPU feature detection on x86_64 (maybe fixes #108)
* fixed bug #109 (patch by Chris Cherrett, slightly modified)
* fixes for building with newer MinGW versions
fix for building with bison 2.4 (#111)
fix for crash when running gigedit as a plugin
* minor LSCP specification fix regarding LSCP command
"GET CHANNEL INFO" (fixes #18)
* maximum voices and disk streams can now be altered at runtime (added new
LSCP commands "GET VOICES", "SET VOICES", "GET STREAMS", "SET STREAMS"
and accordingly new LSCP events "GLOBAL_INFO:VOICES" and
bumped version to 0.5.1.8cvs
* let the GET FILE INSTRUMENT INFO command only return keyswitch range
if keyswitching is actually used (#106)
* fixed rpmbuild: config.h is no longer exported
(fixes #87, patch by Devin Anderson)
* fixed crash on x86_64, introduced in 2008-11-02 commit (#108)
fixed configure so it detects x86_64 (#107)
* fixes for building on OS X
* added memory ordering constraints to improve stability on multi-core
and multi-cpu systems
* notification events for stream/voice count statistics are now sent
only when there are actual changes
use atomic_t for stream/voice count statistics
* updated the lscp spec
code cleanup in InstrumentsDb
* Implemented option for adding instruments in separate directories
in the instruments database
(patch by Chris Cherrett & Andrew Williams, a bit adjusted)
* added experimental support for running LinuxSampler as a DSSI, LV2
and VST plugin
* don't retrieve key bindings and keyswitch bindings if
the instrument is not loaded in the instrument manager
notification events are now sent when sending MIDI
messages using SEND CHANNEL MIDI_DATA lscp command
fixed a bug in the keyswitch bindings retrieval
* added new LSCP command: SEND CHANNEL MIDI_DATA which can be used by
frontends to send MIDI messages to specific sampler channel
added two additional fields to GET FILE INSTRUMENT INFO command -
KEY_BINDINGS and KEYSWITCH_BINDINGS
InstrumentResourceManager::GetInstrumentInfo now scans the specified
instrument file only if it is not loaded in the instrument manager
* refactoring: extracted lscp notification from main() to a separate
added helper function MidiInputPort::DispatchRaw for midi device
implementations with raw byte data
fixed a win32 build error (atomic.h is working on windows too)
code cleanup: moved lscp classes into LinuxSampler namespace
* rewrote the ConditionServer class to make it possible to create
multiple sample channels when the audio thread isn't running
* Optimized the retrieval of the MIDI instrument mappings
* global volume sysex message can now be selected at compile time to be
only applied to the sampler channels that are connected to the respective
MIDI input port the SysEx message arrived on (by default global volume
SysEx messages apply globally to the whole sampler)
bumped version to 0.5.1.7cvs
* fixed a crash which occurs when removing a sampler channel waiting
to start instrument loading after another channel
* bugfix: the bank number provided by MIDI_INSTRUMENT_INFO notifications
* bugfix: process chromatic / drumkit mode sysex message only for
the respective engine channels that are connected to the MIDI
input port on which the message was received
* added support for chromatic / drumkit mode Roland GS Sysex message
which is usally used to switch a part between chromatic sounds and
drumkit sounds (as opposed to their common default setting of MIDI
part 10 being a drumkit part and all other ones chromatic parts), in
LS however one can switch between the first 16 MIDI instrument maps
of all ones defined for the sampler
bumped version to 0.5.1.6cvs
* bugfix: notes triggered at position 0 in the audio buffer were
sometimes wrongly killed in the same buffer, causing no sound to be
fixes for audio drivers with varying buffer sizes
Makefile fix: JACK_CFLAGS wasn't used
JACK driver: use jack_client_open instead of the deprecated
* added configure check for uuid library
* configure fix for libtool 2.2
(patch by Alexis Ballier)
* added support for handling lost files in the instruments database
added new LSCP commands: FIND LOST DB_INSTRUMENT_FILES and
SET DB_INSTRUMENT FILE_PATH
* more gcc 4.3 fixes
* added support for GM global device volume SysEx message
* allow pan control of engine channels on C++ API level
export denormals-are-zero mode feature to C++ API
* minor preparations for internal effects support
bumped version to 0.5.1.5cvs
* moved all OS dependent file operation to File class
* dispatch bank select as ordinary CC as well, the user might seriously
want to (mis)use it for some purpose ("fixed" in all current MIDI
input drivers: ALSA, CoreMIDI, JACK, MidiShare, MME)
minor fix: only mark FX sends as being modified if really the
respective FX send MIDI controller was used
* fixed compilation with gcc 4.3
* added partial support for the "Controller Triggered" MIDI rule,
enough for piano gigs with pedal noise samples
* added new LSCP event "DEVICE_MIDI" which can be used by frontends to
react on MIDI data arriving on certain MIDI input devices (so far only
Note-On and Note-Off events are sent via this LSCP event)
bumped version to 0.5.1.4cvs
* added new LSCP event "CHANNEL_MIDI" which can be used by frontends to
react on MIDI data arriving on certain sampler channels (so far only
Note-On and Note-Off events are sent via this LSCP event)
bumped LSCP compliance version to 1.4
bumped LS version to 0.5.1.3cvs
* fixed compilation error on systems which support JACK, but not JACK MIDI
* provide velocity information to instrument
editors now as well
* the promised "cleanup": rewrote virtual MIDI device's notification a bit
(using now a safe double buffer approach using "SynchronizedConfig"
instead of the Trylock() approach previously to synchronize the list of
virtual MIDI devices)
bumped version to 0.5.1.2cvs
* added support for triggering notes by instrument editors
(still some cleanup / refactoring ahead, but it should work)
bumped version to 0.5.1.1cvs
* added support for notifying instrument editors on note-on / note-off
events (e.g. to highlight the pressed keys on the virtual keyboard
fixed return value of recently added Thread::TestCancel() method
be verbose on DLL load errors (on Linux)
* added JACK MIDI driver
* Reverting to v1.7
* added a new config option --enable-pthread-testcancel, which uses
pthread_testcancel() instead of asynchronous canceling (needed for OSX)
* made it possible to load an instrument even if the audio thread
* fixed memory leaks that occurred when liblinuxsampler was unloaded
fixed a memory leak that could happen when a channel was deleted
while notes were playing
fixed memory management bug in ASIO driver
optimized the SynchronizedConfig class so it doesn't wait
unnecessarily long after an update
* OSX: Definition of ATOMIC_INIT is added
OSX: "~" in DB/plugin names are expanded to "$HOME"
OSX: MIDI device name are now "linuxsampler_in_%d" where %d=0,1,etc.
* autoconf bugfix: the PKG_CONFIG variable wasn't initialized properly,
causing e.g. the libgig test to fail when
"./configure --disable-jack-driver" was used
(patch by Alexis Ballier)
* bugfix: the SAMPLERATE parameter of some drivers (e.g. JACK)
reflected the wrong value
* bugfix: JACK audio driver did not offer a device parameter
"SAMPLERATE" as opposed to the LSCP specs which requires
all audio drivers to provide it
* avoid time consuming samples scanning when
adding instruments to the instruments database
* fixed endless loop which occured when loading an instrument editor
plugin DLL on Windows systems failed (note: completely untested yet :) )
* bugfix: on some POSIX systems instrument editor plugins refused to
load as we used a non-portable Linux specific struct field
(fixes bug #70, patch by Ronald Baljeu)
* removed the nonsense audio channel constraint (which was hard coded to
max. 100 audio channels) for most audio drivers
* minor code refactoring of win32 Condition code
preparations for release 0.5.1
* added -no-undefined in liblinuxsampler:la_LDFLAGS in src/Makefile
in order to avoid the lib getting built as static as opposed to dynamic
(happens in case of unresolved symbols).
* seems mingw has problems with accessing static variables from another
static (noinst) libtool library, at least it prevented it from producing
the liblinuxsampler.dll and just created a static archive
fixed Perl script which automatically updates our LSCP spec source file
(lscp.xml), it didn't remove multi line C++ code
* Added support for monitoring the total number of active disk streams
(new LSCP commands: GET TOTAL_STREAM_COUNT,
SUBSCRIBE TOTAL_STREAM_COUNT, UNSUBSCRIBE TOTAL_STREAM_COUNT)
* win32 port: common/Path.cpp :
- fixed missing drive letter in toLscp()
- added win32 support in VerifyFile()
* added index bounds check to quite new LSCP command
"GET FILE INSTRUMENT INFO"
* bugfix: The commands GET FILE INSTRUMENTS, LIST FILE INSTRUMENTS,
GET FILE INSTRUMENT INFO now return an error on fail
The field FORMAT_NAME returned by GET FILE INSTRUMENT INFO
is now FORMAT_FAMILY
* made signal handling a bit more robust
* global.h: - added macros to emulate usleep() and sleep()
by using Sleep() under WIN32
* compilation fix for ASIO (missing ASIOSDK_BASE_DIR prefixes)
* LSCP: added new LSCP commands: "GET FILE INSTRUMENTS <file>",
"LIST FILE INSTRUMENTS <file>" and
"GET FILE INSTRUMENT INFO <file> <index>" for retrieving informations
about an arbitrary instrument file on the system where the sampler is
running on (LSCP specs yet to be updated!)
bumped version to 0.5.0.1cvs
bumped LSCP compliance to LSCP version 1.3
* win32 port, work in progress: added autoconf checks for Windows
- win32 additions in linuxsampler.cpp
* win32 port, work in progress:
- added ASIO low latency audio output driver
MME MIDI input driver:
- fixed number of PORTS to 1 as the win32 MME MIDI API
allows to connect to only one MIDI port at time,
* LSCP: allow naughty liblscp to send non-string device parameters
within apostrophes as well
* win32 port, work in progress:
added MME MIDI Input driver
changed return type of getSample() from int to int32_t
* Stream.h: added a missing divide by BytesPerSample in GetWriteSpace()
since this function is currently only used in the stream's
qsort() compare function, it did trigger any bugs
cubic interpolation now works in 24bit mode too
faster method to read 24bit words on little endian machines (x86):
replaced 3 byte reads + shifts with a 1 unaligned 32bit read and shift
* win32 port work in progress:
- implemented win32 support in the following classes:
Thread, Condition, Mutex, Path, LscpServer
- lscp.y use DONTCARE instead of VOID
(a win32 symbol defined)
- completed win32 editor plugin loader
* fixes in Ringbuffer.h:
- fill_write_space_with_null() did not zero out all the space
- operator--() did not apply size_mask after decrementing the read_ptr
(might fix bug #48)
- DEFAULT_WRAP_ELEMENTS set to 0 in order to avoid problems with
the _NonVolatileReader functions.
* work in progress: win32 editor plugin loader
* LSCP server: added support for Windows style path / filenames, however
with forward slash path separators instead of backslash
* bugfix: the thread used by an editor plugin didn't die when the
* added autoconf checks for pthread library
added autoconf check for pthread bug found on certain NPTL-enabled
glibc versions (see Gentoo bug report #194076)
* code cleanup:
- global.h now only covers global definitions that are needed for the C++
API header files, all implementation internal global definitions are now
- atomic.h is not exposed to the C++ API anymore (replaced the references
in SynchronizedConfig.h for this with local definitions)
- no need to include config.h anymore for using LS's API header files
- DB instruments classes are not exposed to the C++ API
- POSIX callback functions of Thread.h are hidden
- the (optional) gig Engine benchmark compiles again
- updated Doxyfile.in
- fixed warnings in API doc generation
preparations for release 0.5.0
* slightly renamed recently added "EDIT INSTRUMENT <sampler-chan>" LSCP
command to "EDIT CHANNEL INSTRUMENT <sampler-chan>"
* _escapeLscpResponse now escapes backslashes
implemented new method Path::fromDbPath
* the following LSCP command return escape sequences in at least one
of their LSCP response fields: "GET ENGINE INFO", "GET CHANNEL INFO",
"GET MIDI_INSTRUMENT INFO", "GET MIDI_INSTRUMENT_MAP INFO",
"GET FX_SEND INFO", "GET SERVER INFO"
listed all LSCP commands in the LSCP specs which may use escape
sequences in at least on of their response fields
hide instrument editor related debug messages in the gig::Engine when
using the default debug level (which is 1)
bumped version to 0.4.0.8cvs
* the following LSCP commands now also support escape sequences for at
least one of their text-based arguments (i.e. name, description):
"ADD MIDI_INSTRUMENT_MAP", "SET MIDI_INSTRUMENT_MAP NAME",
"SET FX_SEND NAME", "CREATE FX_SEND"
the LSCP spec doc now lists all LSCP commands which support escape
sequences as one of their arguments
* The <name> argument of MAP MIDI_INSTRUMENT command
now supports escape sequences
* bugfix in LSCP parser: all comma separated lists of strings were treated
as being one string containing commas, this affected device parameter
LSCP commands (fixes #57)
minor code refactoring regarding DB paths in src/network/lscp.y
* code refactoring, moved the following files from
src/engines/ -> src/plugins/ :
* fixed egoistic --instruments-db-location command line switch ;-)
which caused all subsequent command line switches to be ignored
the default location of the instruments DB file can now be overridden
with ./configure --enable-default-instruments-db-location=/foo/bar.db
instruments DB feature can be disabled at compile time with
./configure --disable-instruments-db (i.e. for cross compilation)
in case instruments DB feature is disable at compile time, don't
actually compile the instruments DB source files and don't install the
instruments DB API header files either
* fixed buggy boolean --enable-foo / --disable-foo configure script
* added new LSCP command: FORMAT INSTRUMENTS_DB
* instruments db: slashes-in-names are now escaped with \x2f
* made sure that LSCP syntax is not affected by gigedit locale
* behavior fix: on MIDI CC# 65 (portamento on / off), 126 (mono mode),
127 (solo mode) only kill voices if the respective mode really changed
* added support for escape sequences to the instruments database
* bugfix: files with percent character ('%') in their path or filename
could not be loaded
* fixed a crash which occurs when starting an instrument editor on
a channel with assigned engine but with no instrument loaded
* bugfix: files with slash in their path or filename could not be loaded
* automake fix: don't throw an error on "make uninstall" just because the
plugin directory is not empty (fixes bug #54)
* added highly experimental code for synchronizing instrument editors
hosted in the sampler's process to safely edit instruments while playing
without a crash (hopefully) by either suspending single regions wherever
possible or - if unavoidable - whole engine(s)
disk thread: queue sizes are now proportional to CONFIG_MAX_STREAMS
instead of fix values
removed legacy Makefiles in meanwhile deleted src/lib directory and its
bumped version to 0.4.0.7cvs
* minor assembly fix in x86 features detection (don't use the PIC
register, to avoid relocations in the text segment at runtime)
* A notification event is now sent when the
instrument loading on a sampler channel failed
* added default min and max values to restrict the number of allowed
audio output channels and MIDI input ports
the connection to the PCM interface is now closed when destroying
an audio output device
* ensure that a notification event is sent when already
loaded instrument is assigned to another sampler channel
* bugfix: the active stream/voice count statistic was incorrect
* bugfix: The previous bindings were not been disconnected when
altering the ALSA_SEQ_BINDINGS parameter.
Introduced a NONE keyword for unsubscribing from all bindings
(e.g. SET MIDI_INPUT_PORT_PARAMETER 0 0 ALSA_SEQ_BINDINGS=NONE).
* fixed a crash which occurs when changing the number of ports of a MIDI
device connected to a sampler channel to number less then or equal
to the index of the port to which the sampler channel is connected
* fixed a crash which occurs when reassigning the same engine
on a sampler channel with connected MIDI device
* A notification event is now sent when altering
audio output channel on a sampler channel
* reenabled assembly features support, at the moment only for
enabling a fast denormal FPU mode (x86 platforms supporting SSE2)
bumped version to 0.4.0.6cvs
* A notification event is now sent when changing
the instrument map on a sampler channel
* LSCP server returns verbose syntax errors (line and column where
syntax error occured, the unexpected character and the actually
expected, possible character(s), the latter only if less than 5
* fixed some minor memory leaks
* filename arguments in LSCP commands now allow to use escape
sequences, that is directly literal as one of: \', \", \\, \n, \r,
\f, \t, \v, or as octal ASCII code value like \132, or as hex ASCII
code value like \xf2) (fixes bug #24)
parser now supports extended ASCII character set
(up to ASCII code 255, i.e. includes now umlauts and accents)
LSCP parser C++ files are now automatically regenerated when
yacc input source file (lscp.y) was modified
* fixed compile time error for old Bison versions
(i.e. v1.28 found on MacOS 10.4, patch by Toshi Nagata)
* minor fix in our automatic stack trace mechanism on crashes, the
main process did not wait for the stack trace process to finish
and thus killed the whole application before the stack trace was
completely shown on the console
* small fix for previous Thread change: don't try to change static
priority for non-RT threads
* fixed several issues in fundamental "Thread" class: set scheduling
policy and priority on thread level, set a minimum stack size for
thread (TODO: a reasonable value yet to be tested), bugfix: non-RT
threads simply inherited properties of starting thread instead of
setting their own policy and priority
updated and fixed test cases (haven't been touched in a while, but
are now all running successfully through all cases)
* minor Debian packaging fix: abort package build process when
Makefile.cvs failed (only relevant to CVS versions of LS)
* a pregenerated LSCP parser is no longer kept in CVS, from now on you
need to have bison (or another yacc-compatible parser generator)
installed to be able to compile LS from CVS
* added highly experimental support for on-the-fly instrument editing
within the sampler's process (by using instrument editor plugins),
you'll notice the new "Registered instrument editors:" message on
startup, the plugin path can be overridden at compile time with
added a new LSCP command "EDIT INSTRUMENT <sampler-channel>" to spawn
a matching instrument editor for the instrument on the given sampler
channel (LSCP command syntax might be subject to change soon)
config.h is not going to be installed along with liblinuxsampler's
API header files anymore (not necessary anymore)
take care of $(DESTDIR) when creating the instruments DB on 'make
install' rule (needed for packaging and cross compilation)
bumped version to 0.4.0.5cvs
* added --instruments-db-location command line switch
fixed bug regarding the scanning progress notifications
directories containing no instrument files are now not re-created
in the instruments databese when recursive scan is performed
* Implemented instrument scanning in background
and commands for monitoring the scan progress
* XCode project file(s) now capable of creating universal binaries for OSX
(patch by Toshi Nagata)
* updated instruments db support
added transactions for improving the db performance
added commands for copying and finding instruments and directories
* fixed compiler error when --enable-override-filter-type was
supplied to the configure script (fixes #46)
* added completely new XCode project files for Mac OSX which is now
capable to execute our autoconf environment, thus no need anymore
to maintain the compile time configuration file (osx/version.h) for
OSX manually (patch by Toshi Nagata)
* fixed OSX and cross compilation related error
(patch by Toshi Nagata)
* added check for the presence of sqlite3 program
* Implemented instruments database
* minor fix of EGDecay
fixed compilation errors regarding OSX
(patch by Toshi Nagata)
* fixed some more EG bugs that could cause noises or crashes
* Added new field - DEFAULT to the
GET MIDI_INSTRUMENT_MAP INFO command response
* Added new LSCP command - SET FX_SEND NAME
The default map is now the first available map
* Implemented new, improved notification system
* Added new notification events for tracking
effect send changes and global volume changes
* the ALSA audio output driver parameters now reflect the correct
parameter value ranges for the respective selected sound card
(patch by Till Wimmer, a bit fixed and extended)
bumped version to 0.4.0.4cvs
* by default now all "MAP MIDI_INSTRUMENT" LSCP commands (also the
"PERSISTENT" ones) block until the respective mapping is completely
established in the sampler, added a new argument though to allow
explicit mapping in the background ("MAP MIDI_INSTRUMENT NON_MODAL")
LSCP documentation updated
* EG fine tuning: when attack is zero the EG starts at a level above
max sustain level, which means that there is a decay phase even if
sustain is 100%
* for now just set all notes off when receiving a MIDI coarse tuning
message to prevent hanging notes when transposing while playing
* handle MIDI coarse tuning messages (MIDI RPN #0 MSB, #2 LSB),
currently lazy implementation, transpose value is simply added on the
note on/off values instead only at the mandatory places, thus when
altering transpose while playing, voices can unintendedly survive
* bugfix: sampler crashed when trying to persistently map a not existent or
corrupt .gig file ("MAP MIDI_INSTRUMENT ... PERSISTENT")
behavior fix: reset FX send levels i.e. when receiving a MIDI "reset all
bumped version to 0.4.0.3cvs
* EG fix: a release value of zero could cause noises or crash
fix of previous thread safety fix, which in some cases locked the
* playback is no longer disabled during instrument loading
all notes playing on a channel that changes its instrument keep
playing with the old instrument until they get a note off command
new thread safety fix for lscp "load engine" and "set channel audio
* bugfix regarding FX Sends: when more than one sampler channel used FX
sends, only the audio signal of the last sampler channel made it into the
final output signal
fixed small autoconf compilation issue on certain systems (complained
about missing AM_PATH_ARTS macro)
* extended response of LSCP command "GET FX_SEND INFO" to return the FX
Send's MIDI controller and current send level and added two new LSCP
commands "SET FX_SEND MIDI_CONTROLLER" and "SET FX_SEND LEVEL"
* create IDs for FX Send entities in a logical sequence on a per sampler
* Fixed a memory leak due to EngineFactory::Destroy() not doing it
as an actual destructor and just removing the engine instance from
factory stock and all instances allocated via EngineFactory::Create()
never got delete'd and thus their destructors never called. This bug
was evident while having many mapped instruments and querying the
instrument status via GET MIDI_INSTRUMENT INFO command, eating up
system memory very quickly and never let it go.
* further bugfixes regarding MIDI instrument LSCP commands
("LIST MIDI_INSTRUMENTS ALL" reflected same bug as the
previously fixed "LIST MIDI_INSTRUMENTS" command and
"GET MIDI_INSTRUMENT_MAP INFO" result was not
terminated by a "." line)
* delete all MIDI instrument maps when a sampler-reset is issued
(i.e. on a "RESET" LSCP command)
* bugfix: LSCP command "LIST MIDI_INSTRUMENTS" returned wrong bank number
* global volume can now be altered at runtime
(added two new LSCP commands for this, LSCP specs updated)
* fixed noise which occured while using effect sends
* implemented effect sends (also added new LSCP commands for this feature,
updated LSCP spec document along with this commit batch as well)
* bugfix: sampler was limited to load max. 200 instruments in the
background (replaced RingBuffer FIFO by a std::list FIFO)
* Added new notification events for tracking audio/MIDI device changes,
MIDI instrument map changes and MIDI instrument changes
* fixed bug on adding MIDI instrument maps
* revised and extended MIDI instrument mapping feature to allow managing
arbitrary amount of maps and assigning each sampler channel individually
to one map (this commit batch includes LSCP spec document update and
respective implementation on LS side)
* fixed crash occuring in conjunction with the new 'MAP MIDI_INSTRUMENT'
LSCP command (cause: RingBuffer was not able to do deep copies)
* fixed crash occurring on certain LSCP scripts (Bug 39)
* store volume for each MIDI instrument mapper entry individually instead
of managing the volume as shared setting with the respective instrument
entry of its InstrumentManager
* if a filter is used and EG2 finishes before EG1, let the voice die
when EG2 has finished (this fixes a problem with clicks and voice
starvation for some gigs)
* implemented MIDI instrument mapping according to latest LSCP draft
* updated LSCP specification: added new command set for
managing MIDI instrument mappings, bumped LSCP spec
version to v1.2
(not implemented on server side yet)
* preparations for release 0.4.0
* fixed mutex initialization bug
* fixed crash when instrument loading failed previously on the same
sampler channel (fixes bug #36)
* small fix of LFO1 behaviour (dampening from max volume instead of
amplifying from 0)
added checks for bad MIDI data
* little configure.in fix for PPC
(patch by Ebrahim Mayat)
* The engine names are again encapsulated
into apostrophes as is said in the specification
* Commands returned by LinuxSampler in echo mode
are now terminated with <CR><LF> instead of <LF>
* MIDI driver API extension for MIDI drivers which already supply exact
time stamps for events (i.e. for offline rendering based MIDI drivers)
* real support for 24 bit samples - samples are not truncated to 16
support for aftertouch (channel pressure, not polyphonic aftertouch)
* src/Sampler.h, src/Sampler.cpp: allow 3rd party applications to
retrieve available drivers and sampler engines
src/linuxsampler.cpp: show available engines on startup (on the console)
* various fixes to allow liblinuxsampler to be used
(as a native C++ library)
* new filter implementation, which is more accurate and supports all
filter types including bandreject and lowpass turbo
* packaging changes:
- changed deprecated copyright attribute to license; added ldconfig
to post-(un)install steps; added devel package for liblinuxsampler;
to linuxsampler.spec (RPM)
* gcc 4.1 compilation fix
* sample loop parameters are now taken from the DimensionRegion
instead of the wave chunk
fixed keyswitching for v3 gigs with a number of keyswitch splits not
equal to a power of two
* added compile time options to allow disabling the various audio and MIDI
drivers (./configure --disable-foo-driver)
* added synthesis benchmark for gig::Engine
* added compile time option to disable processing of All-Notes-Off
* more thread safety fixes: another fix for lscp "load engine" and
midi thread. Sysex midi protected against lscp. Instrument loader
thread protected against lscp thread.
* fixed concurrency problems between the main thread doing
lscp notifications and the lscp thread
bug fix: the LFOs were not properly initialized
* fixed some concurrency problems between the lscp thread and the
audio/midi threads for these commands: load engine, set channel
audio output device, set channel midi input device/port/channel and
remove channel. Thanks to Vincent Bongiorno for bug reports and
removed an autotools warning
fixed an iterator bug
minor code clean-ups
* added aRts audio output driver (by no means RT safe)
* fix of silly bug introduced in recent memory fix: all devices were
destroyed instead of just the one asked for in the Sampler::Destroy
* fixed some invalid iterator errors
* fixed some memory management errors
* added smoothing of volume changes caused by control change messages
fine tuning of the crossfade volume curve
* fixed global pan (CC10) which hasn't been working for a while
fine tuning of the curves for volume (CC7) and pan (CC10 and gig
added support for the "attenuation controller threshold" gig
* added linear interpolation of volume modulation inside a
subfragment; this prevents clicks during voice stealing. Can be
switched off with the --disable-interpolate-volume configure option.
* implemented portamento mode and solo mode (a.k.a 'mono mode'):
all modes can be altered via standard GM messages, that is CC5 for
altering portamento time, CC65 for enabling / disabling portamento
mode, CC126 for enabling solo mode and CC127 for disabling solo mode
fixed EG3 (pitch envelope) synthesis which was neutral all the time
configure.in: do not automatically pick optimized gcc flags if the user
already provided some on his own (as CXXFLAGS)
* bugfix in LSCP parser which was confused by space(s) within device
(e.g. "SET AUDIO_OUTPUT_CHANNEL_PARAMETER 0 0 SOMEPARAM='foo bar'")
changed version to 0.3.3cvs
* src/common/optional.h: fixed '=' operator which did not return anything
* Bug-fixes: pitch changes larger than one octave didn't work. Looped
samples small enough to fit in RAM didn't work.
* minor EG fine tuning: attack time now has a minimum value to prevent
* fixed voice stealing - stolen voices weren't killed
* fixed the notification messages delay due to lack of
network activity (fixes bug #26)
* Filter tuning: calculation of cutoff frequency and bandwidth
improved. Removed use of "BasicBPFilter". Changed bandpass filter
from constant peak to constant skirt. Use gig parameter Resonance if
no resonance controller is set. Removed keyboard tracking influence
* EG fixes: the length of "attack hold" stage was wrong. Release stage
can now start before attack stage ends. Cancel release didn't work
when sustain was zero.
* fixed event handling bug which was introduced by the recent synthesis
optimizations (events were only processed for the first active voice)
added global volume attenuation of -9 dB (0.35f) to prevent clipping
which can be overridden with --enable-global-attenuation
* Added new LSCP commands: GET TOTAL_VOICE_COUNT,
GET TOTAL_VOICE_COUNT_MAX, SUBSCRIBE/UNSUBSCRIBE TOTAL_VOICE_COUNT
* Added support for sostenuto pedal
* src/drivers/MidiInputPort.cpp: fixed legacy SysEx code which caused
dispatching of MIDI SysEx messages several times instead of once
src/engines/gig/Engine.cpp: fixed bug in SysEx handling
(patch by Juan Linietsky)
* synthesis core optimizations
* fixed endless loop which occured on MIDI control change
and pitch bend events
* bug fixes for the new EG implementation
* extensive synthesis optimization: reimplementation of EGs and LFO(s),
removed synthesis parameter prerendering and the synthesis parameter
matrix in general, splitting each audio fragment into subfragments now
where each subfragment uses constant synthesis parameters
(everything's still very buggy ATM)
* Added CHANNEL_INFO notification when engine is assigned to
sampler channel with no midi and audio device set (Fixes bug #22)
* improved filter cutoff calculation by adding support for the
following gig parameters: Cutoff freq (used when no cutoff
controller is defined), Control invert, Minimum cutoff, Velocity
curve and Velocity range. The keyboard tracking now also scales
cutoff frequency, not just resonance.
* fixed little inconsistency: LSCP commands 'LIST AVAILABLE_ENGINES' and
'GET CHANNEL INFO' returned different names for the gig::Engine,
returning now only 'GIG'
* Added configure option --enable-process-muted-channels
which can be used to enable the processing of muted channels
* Fixed app exit on Broken pipe error (Fixes bug #20)
* support for muting sampler channels and solo mode of the same, two new
LSCP commands ("SET CHANNEL MUTE" and "SET CHANNEL SOLO") and two new
fields ("MUTE" and "SOLO") for command "GET CHANNEL INFO" were
introduced for this (patch by Grigor Iliev, a bit adjusted)
* install necessary development header files for allowing 3rd party
applications to link against liblinuxsampler
liblinuxsampler's API documentation can be generated with 'make docs'
* fine tuning of the EG modulation parameters
* preparation for bugfix release 0.3.3
* if period time of chosen audio device is too small (< MIN_RELEASE_TIME)
then simply show a warning about possible click sounds and reduce the
volume ramp down appropriately instead of cancelling the audio device
* minor efficiency fix (LFO preprocessing was performed even though the
respective LFO was disabled by the instrument patch)
* gcc 4.0 compilation fixes
* final preparations for bugfix release 0.3.2
* update MIDI channel info on program change
* don't reset volume, pan, pitch and MIDI controller values on instrument
or audio output device change
send 'CHANNEL_INFO' LSCP event on MIDI program change messages
* fixed minor issue with null/silence samples
(those stole voices even though they don't need a voice at all which
resulted in "voice stealing didn't work out" messages)
* fixed a key group bug which caused undefined behavior in conjunction with
stolen voices (this case was usually followed by a "killed voice
survived" or "voice stealing didn't work out" error message)
* added cmdline options for lscp address and port
* another voice stealing fix
(endless loop occured when voices were stolen from other engine channels)
* LSCP server: fixed LSCP event "CHANNEL_INFO" notification
(e.g. did not notify on volume changes)
* don't reset scale tuning on instrument or audio output device change
* fixed 'make dist' build rule to include all necessary files
* revised voice stealing (fixes crash caused by voice stealing)
* RPM .spec script added to repository.
* volume of release triggered samples now depends on note-on velocity,
note length and gig parameter "release trigger decay" instead of
* fixed some crashs in LSCP server
(patch by Grigor Iliev, fixes #19)
* hand-crafted assembly optimization code can be disabled with
'./configure --disable-asm' (definitely not recommended)
* support for the gig parameters for "release velocity response"
curves, which means the decay and release times now depends on
velocity. The softer velocity, the longer release.
fine tuning of the envelope curves. Decay1 and release now have two
parts, first linear and then exponential at the end.
* updated autotools build files for conditional compilation of CoreMIDI
(OS X) and MidiShare (Linux, OS X, Windows) drivers
* multiport and control file fixes
* altered and fixed debian packaging
* src/network/lscpserver.cpp: fixed segfault
(patch by Grigor Iliev, fixes #17)
added man page
final preparations for the first official release (which will be 0.3.1)
* (re)implemented voice stealing algorithm "oldestvoiceonkey" and made it
the default voice stealing algorithm
added new LSCP command "GET SERVER INFO" which currently returns
description and version about this sampler
added some API documentation comments
* Little LSCP API change: renamed events "CHANNELS" -> "CHANNEL_COUNT" and
"INFO" -> "CHANNEL_INFO" to be more meaningful (patch by Grigor Iliev).
* tiny fix in LSCP parser; returned prefix "Err" instead of "ERR" on syntax
errors (patch by Grigor Iliev)
* All compile time options are now centrally alterable as arguments to the
./configure script. All options are C Macros beginning with CONFIG_
prefix and will be placed into auto generated config.h file.
* Implemented MIDI program change as general, engine independant solution.
The program number will determine the sampler channel to which the MIDI
device will be connected to and the given MIDI channel defines on which
MIDI channel that sampler channel should listen to. Also the program
change will disconnect probably established connection from the previous
program change event.
* ALSA driver: fix of previous ALSA fix ;-)
* [bug #9] Fixed for a LSCP command syntax convention
consistency, regarding the enumeration of available
sampler engines, Audio and MIDI drivers; this has
affected the semantics of the following commands:
which are now returning an integer count of engines
and drivers, respectively, while the following
new commands are now being introduced:
taking on the previous functionality, returning
a comma separated list of names.
LinuxSampler version bumped to 0.3.1.
* implemented progress indicator for loading instruments
(can be polled with "GET CHANNEL INFO", field "INSTRUMENT_STATUS")
* ALSA audio driver: don't block when trying to create audio device
* autotools build fixes for PPC architecture
* removed statically included libgig sources from the LinuxSampler code
base - you now have to compile and install libgig separately
added -Wreturn-type gcc switch to avoid bugs with no returns on non void
functions in future
* updated unit tests
* little correction in LSCP specification document (patch by Grigor Iliev)
* fixed bug in MMX/SSE(1) implementation of the sample loop code (caused
RAM-only voices to crash when entering the sample's loop section under
* removed some build warnings
fixed a bug with hanging notes when using sustain pedal
release samples are not triggered anymore when sustain pedal is down
* fixed couple of mistakes in the LSCP specification document
* fixed MIDI GS scale tuning (via SysEx Message)
* remove quotation marks from driver parameters
* ALSA audio driver: don't block for retrieving sound card parameter infos
* JACK audio driver: fixed handling of channel parameter 'JACK_BINDINGS'
fixed parser bug of multiplicity parameters
* fixed a compilation error in Pool.h (gcc 3.4.3)
* ALSA MIDI driver: added MIDI port parameter 'ALSA_SEQ_ID' which reflects
the ALSA sequencer ID of a port (read only)
* fixed segmentation fault on "GET CHANNEL INFO" commands which occured
when an engine type was selected but no audio device connected yet to
the sampler channel (fixes bug #4)
* fixed event leak (events sent to inactive keys were not freed)
implemented MIDI channel mode messages "All Sound Off", "Reset All
Controller", "All Notes Off" (fixes bug #5)
* fixed another crash under heavy load which was accidently introduced with
the previous commit - events have to be processed completely on all
engine channels before audio is rendered (fixes bug #7)
* spawning layered voices now within a loop instead of recursively (fixes
segmentation fault under heavy voice count load and reduces stress on the
voice stealing operates on all engine channels now
limit voice stealing to MAX_AUDIO_VOICES thefts per audio fragment cycle
fixed keygroup handling (layered voices could kill each other)
* 24-bit decompression now supports the 20 and 18 bit formats
support for "random" and "round robin" dimensions
removed a warning printout for empty samples during instrument
* fixed a bug that sometimes caused clicks at the beginning of samples
added denormal number elimination for CPUs with SSE2 support
* implemented MIDI Control Change 7 (Volume)
implemented MIDI Control Change 10 (Panpot)
* fixed some segfaults (which occured on EngineChannel destruction)
InstrumentResourceManager: recache small samples if their current
number of silence sample points are not sufficient enough for the used
audio output device
src/linuxsampler.cpp: voice / streams statistics on the console is back
again (can be turned on with command line switch --statistics)
* fixed a bug in the low-level thread synchronizing code, that made
loading of very small gig files sometimes fail
* gig::Engine: fixed silence (engine channels' events were not imported
into the engine, fixed undesired creation of new gig::Engine instances
(and disk threads)
AudioOutputDevice: reverted behavior to render per Engine instance (and
not per EngineChannel instance)
* design change: using now one sampler engine instance and one disk thread
instance for all sampler channels that are connected to the same audio
output device (and are using the same engine type of course)
added EngineFactory / EngineChannelFactory to remove the annoying build
dependencies e.g. of the lscpserver to the actual sampler engine
bumped version to 0.3.0 (current CVS state is still quite broken,
previous, stable CVS version was tagged as "v0_2_0" and is also available
as source tarball)
* added support for sample parameter 'attenuation'
* JACK driver: fixed channel parameter 'JACK_BINDINGS' which did not work
for a multi JACK device setup
* fixed build failure if libsqlite3 is not installed
* Added first cut of instrument database query support.
* fixed a bug that made some release triggered samples too short
(envelope went directly from attack to release)
* fixed a bug that caused noise at end of samples
* fixed possibility that memory got not locked
immediately set instrument status when calling LOAD INSTUMENT NON_MODAL
* fixed segfault and freeze of LSCPInstrumentLoader thread
* lscpserver: we now only use one instrument loader thread; commands for
loading instruments in the background wait in a queue to be processed one
by one to avoid possible race conditions and to improve I/O efficiency
fixed possible race condition while streaming with multiple disk threads
by using an own decompression buffer for each disk thread
libgig: fixed some memory leaks caused by non virtual base constructors
* small fix for building with old JACK versions (0.94 and earlier)
* updated spec for INSTRUMENT_NAME
* Added INSTRUMENT_NAME to GET CHANNEL INFO command result set
* added Debian packaging files
* JACK audio driver: added device creation parameter 'NAME' which can be
used to assign an arbitrary name to the JACK client, it's now possible to
create multiple JACK audio output devices simultaniously for LS
src/network/lscpserver.cpp: fixed little bug in
'SET CHANNEL AUDIO_OUTPUT_CHANNEL' (altering of audio routing)
implementation, cleanup of error messages
* libgig: Fixed mono decompression.
* some fixes regarding the filter (fixes the "silence" bug which occured
occasionally, caused by random biquad parameters which lead to unstable
filter equation and thus to infinit filter output results)
* libgig: Support for compressed mono samples. Experimental support
for compressed 24 bit samples. Fixes for decompression on big-endian
CPUs. Fix for bug that truncated end of compressed samples.
* bunch of fixes for OSX (patch by Stephane Letz)
* Updated implementation for real time notify messages:
VOICE_COUNT, STREAM_COUNT, BUFFER_FILL
* Added implementation for NOTIFY:CHANNELS event
* Removed mentioning of UDP from event unsubscription section.
* libgig: another memory leak and memory (de)allocation fix
(patch by "Gene" a.k.a Anders Alm)
* support for keyswitching
ignore if no sample was defined for region(s) or dimension region(s)
(patch by Andreas Persson)
* fixed some memory leaks (patch by Gene Anders)
* another crossfade fix (honoring AttenuationController for case 0,0,0,0,
fixed cases in_start = in_end = CrossfadeControllerValue, fixed curve for
cases out_start < CrossfadeControllerValue < out_end, honoring
support for up to 8 dimensions as introduced by Gig V3
(patch by Andreas Persson)
* libgig: fixed vcf_type_lowpassturbo value, fixed crossfade points order
gig::Voice: fixed special crossfade case 0,0,0,0 which actually means no
* Fix for a core. SET CHANNEL AUDIO_OUTPUT_CHANNEL needs
to check if audio output device exists.
* Fixed a bug in assembly that cause crashes in some cases
* Fixed pitch calculation. FineTune needs to be taken as is
without multiplying it by 10.
* Fix a basic diskthread multichannel issue.
* Initialize the synthesis mode bitmask properly
* Fixed bug with mixed channel creation
* fixed endless loop at the end of sample playback
(patch by Andreas Persson)
* Fixes for engine reloading. Fixed streaming bugs in some
cases only, most probably not all yet.
* architecture independence fixes, should now compile again for non x86
tiny fix of command line switch --version
* Added some profiling capabilities, bugs.
* Applied patch from Andreas Persson and made a few other small
changes to fix a bug in the filter code.
* fixed bug which caused samples not to be played back to their actual end
(patch by Andreas Persson, added a small extra fix)
* fixed CalculateBiquadParameters() to set parameters for
both right and left, not just left.
* introduced 'synthesis mode' to reduce the amount of code and conditionals
for the current synthesis case in the main synthesis loop
support for MMX and SSE(1) in the core synthesis algorithms (CPU feature
detection at runtime, only x86 so far)
* introduced 'synthesis mode' to reduce the amount of code and conditionals
for the current synthesis case in the main synthesis loop
support for MMX and SSE(1) in the core synthesis algorithms (CPU feature
detection at runtime, only x86 so far)
* libgig: experimental support for Gigasampler v3 format; 64 bit file
offsets are truncated to 32 bit, 24 bit samples are truncated to 16 bit
and additional articulation informations are ignored at the moment
(patch by Andreas Persson)
* libgig: applied patch by Andreas Persson which improves accuracy of all
three velocity response curves
* gig::Engine: changed way how events make it from the input event queue
into the engine's process chain (fixes forced segfault in EGADSR)
Event.h: using signed type for fragment position for easier
differentiation if event might happened before or after current fragment
* applied patch from James Klicman which fixes some issues in configure.in
* Quoted warnings to avoid unmatched single quote.
* LinuxSampler was badly broken with last commit, fixed that
using now James Klicman's proposol to fix the reported linker problem
Mutex.cpp: try to force UNIX98 compatibility (if not already supported)
Makefile.cvs: generate (and clean) all necessary autotools files
* configure.in: added check for UNIX98 compatibility, check if there's at
least one supported MIDI input and audio output system available, added
conditionals for ALSA and JACK
src/drivers/audio/Makefile.am: ALSA and JACK drivers are only compiled
respectively if they're supported by the system
MidiInputDeviceFactory.cpp, AudioOutputDeviceFactory.cpp: little
workaround for reported linker problem
removed autotools generated files from CVS
* fixed segfault which occured whenever a voice stole a voice and was in
turn killed in the same audio fragment, to fix that the MIDI key
informations are now updated only after all voices were processed
* bunch of bugfixes (e.g. segfault on voice stealing)
* compatibility fixes for old gcc 2.95.4
* MidiInputPort: fixed dispatching of MIDI events to engines which are
listening to all MIDI channels
switched MIDI channel indexing to low level indexing (means 0..15 now)
* libgig: fixed panorama value in DimensionRegion (invalid conversion
from signed 7 bit to signed 8 bit)
src/linuxsampler.cpp: stacktrace is now automatically shown on fatal
errors (that is segmentation faults, etc.), gdb should be installed for
this to work
gig::Voice: tiny accuracy fix of pan calculation
replaced old pool classes by completely new ones which now offer
* gcc-c++ 3.4.1 compability fixes.
* Fixed a hang in stage_fadeout
* fixed another bug in EGADSR which caused clicks when voices were killed
near the audio fragment end
* changed curve type from exponential to linear in stage 'end' of
EGADSR (fixes click sounds at the end of voices)
* added first two experimental voice stealing algorithms ('oldestkey' -
which just steals the oldest voice on the oldest key and 'keymask' - which
tries to pick the oldest voice on the same key where the new voice should
be spawned, if it fails it behaves like 'oldestkey'), the desired algorithm
can be selected at compile time (see Engine.h) will be configurable via
LSCP soon though
* Small fix to pan coeff. calculation.
(LS was silent with gigs where pan was 0).
* support patch panorama info
* added support for scale tuning via MIDI GS system exclusive message
* added support for release trigger dimension (that is voices which are
spawned when a key was released)
libgig: bugfix in dimension region switching
* implemented key groups (a.k.a exclusive groups) which is important for
drum patches and monphonic instruments
src/engines/gig/Engine.cpp: bugfix in ProcessNoteOn() - did not always
stick the note on event to the respective key's own event list although
e.g. the EGADRS expects it to find there
* Fixed a crash in EGADSR::Process()
* added support for crossfades
support sample playback start offset
* added support for layers
fixed initial pitch calculation which did not honor the sample's own
* libgig: fixed / improved accuracy of all three velocity to volume
transformation functions (a.k.a. 'nonlinear','linear','special')
* src/engines/gig/Voice.cpp: dimension region selection takes current
MIDI controller values into account
* src/network/lscp.y: fixed symbol 'midi_input_channel_index' to allow
keyword 'ALL' for the respective LSCP commands
* ALSA audio driver: bugfix in device parameter 'CARD' which caused an
error message if used in conjunction with 'CREATE AUDIO_OUTPUT_DEVICE'
JACK audio driver: fixed minor JACK port name issue and the device was
not activated by default on creation which caused it to render solely
src/network/lscpserver.cpp: retry to bind socket for 3 minutes if bind
* ALSA MIDI driver: create one MIDI port by default, implemented parameter
info for parameter 'ALSA_SEQ_BINDINGS'
ALSA audio driver: implemented parameter info for driver parameters
'FRAGMENTS' and 'FRAGMENTSIZE'
JACK audio driver: fixed creation of channels on device creation, channel
parameter 'NAME' now actually updates the respective JACK port name,
implemented channel parameter 'JACK_BINDINGS' (as well as its parameter
src/network/lscpserver.cpp: fixed commands
"GET MIDI_INPUT_DRIVER_PARAMETER INFO" and
"GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO", fixed backward compatibility
for "SET AUDIO_OUTPUT_TYPE" and "SET MIDI_INPUT_TYPE" commands
src/networ/lscp.y: added comma character (',') to symbol 'char'
src/drivers/DeviceParameter.cpp: fixed methods RangeMin(), RangeMax() in
class DeviceCreationParameterInt which returned wrong values
* set default volume to 1.0 in Gigasampler engine (was 0.0)
implemented "SET CHANNEL AUDIO_OUTPUT_CHANNEL" LSCP command
fixed "GET ENGINE INFO" LSCP command
fixed "GET CHANNEL INFO" LSCP command
src/network/lscp.y: fixed 'stringval' rule (returned string with formal
apostrophes), fixed 'dotnum' rule (ignored position after decimal point)
* bug fixes in LSCP server (returned '1'/'0' instead of 'true'/'false' for
binary fields, spuriously created new elements in maps while trying to
find map members)
* src/drivers/midi/MidiInputDeviceAlsa.cpp: implemented port parameter
"NAME" which now updates the registered ALSA seq port name as well, fixed
port parameter "ALSA_SEQ_BINDINGS" to allow more than one binding
src/network/lscp.y: fixed symbol STRINGVAL (that is strings encapsulated
into apostrophes) which didn't allow space characters
changed all driver names and driver paramaters to upper case
fixed typo in LSCP documentation
(section 5.3.12, was: "SET MIDI_INPUT_PORT PARAMETER",
should be: "SET MIDI_INPUT_PORT_PARAMETER")
* completely removed the lex scanner and replaced it by pure yacc rules
for all terminal symbols (that is command keywords and variables) to
avoid misunderstandings while parsing (e.g. recognition of command
keywords in string arguments)
src/drivers/audio/AudioChannel.cpp: changed channel parameter 'Name' to
'NAME' as defined in the LSCP documentation
* src/drivers/DeviceParameter.cpp: fixed return values for
classes 'DeviceRuntimeParameterString' and 'DeviceCreationParameterString'
which returned their values without being encapsulated into apostrophes,
fixed return values for 'DeviceRuntimeParameterBool' and
'DeviceCreationParameterBool' to be returned in lower case (as defined in
the LSCP documentation)
src/network/lscp.y: key value pairs now also allow strings (without
spaces) to be not encapsulated into apostrophes (e.g. foo=bar instead of
src/linuxsampler.cpp: show on the console which TCP port the LSCP server
* introduced and implemented new LSCP command "RESET" which resets the
whole sampler instance
src/drivers/audio/AudioOutputDeviceAlsa.cpp: parameter 'card' now
returns all available sound cards as possibility, added dependency to
parameter 'card' to parameters 'fragments' and 'fragmentsize'
src/drivers/DeviceParameter.cpp: fixed return value(s) for classes
'DeviceCreationParameterString' and 'DeviceCreationParameterStrings'
which returned the default value(s) not encapsulated into apostrophes
src/network/lscpserver.cpp: fixed implementation of LSCP commands
"GET MIDI_INPUT_DRIVER_PARAMETER INFO" and
"GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO"
* src/linuxsampler.cpp: tidied up a bit, "initialization completed"
message shown only after the server is actually running
src/testcases/: print the name of each test suite before running the
tests of the suite, added first tests against the LSCP server using a
socket connection to the LSCP server (tests for the following LSCP
commands: "ADD CHANNEL", "GET CHANNELS", "REMOVE CHANNEL")
* implemented "SET ECHO" LSCP command
* src/Sampler.cpp: changed sampler channel index allocation from consistent
channel index allocation to incrementing channel index allocation, that is
it doesn't fill channel index gaps anymore (to avoid race conditions)
implemented "LIST CHANNELS" LSCP command
* src/linuxsampler.cpp: print out LinuxSampler version and show all
registered MIDI input drivers
renamed class 'InputOutputDevice' -> 'Device'
* moved directory '/src/audiodriver' -> '/src/drivers/audio'
moved directory '/src/mididriver' -> '/src/drivers/midi'
* Get rid of the timeout on select()
* GET MIDI_INPUT_PORT_PARAMETER INFO command
* Added MISCELLANEOUS event to help debugging client/server
interaction. It spits out every line received by the server.
* Reworked the infrastructure to allow for parameter
registration and creation
Changed alsa audio output and midi drivers
to work with new infrastructure
* moved ToString to common
Implemented handling of multiple connections
Implemented guts for event subscription/unsubscription
Illustrated event notification sending by sending MISC events
when connections are established or terminated.
* Do not use accessor operator for the map unless
the element accessed already exists
* Small enhancement to mutex class to support Trylock()
* Unconsolidaded MIDI input related channel commands are back:
SET CHANNEL MIDI_INPUT_DEVICE <chan> <midi-device>
SET CHANNEL MIDI_INPUT_PORT <chan> <midi-port>
SET CHANNEL MIDI_INPUT_CHANNEL <chan> <midi-chan>
Still useful for compability with legacy clients, an almost
deprecated command gets re-implemented:
SET CHANNEL MIDI_INPUT_TYPE <chan> <midi-driver>
Optional parameter list on MIDI input device creation fixed,
but not quite fully effective yet:
CREATE MIDI_INPUT_DEVICE <midi-driver> [<key>=<val>...]
* Removed/cleaned up some left over stuff
Fixed midi port name parameter (no longer static)
* Updated parser, lscp server and sampler class for new MIDI_INPUT
Minor fixes (and major new bugs) here and there
Consolidated 3 SET CHANNEL MIDI_xxx commands into one:
SET CHANNEL MIDI_INPUT
* Fixed object deletion
* Updated MIDI infrastructure similar to what was previously
done with the AUDIO
Implemented Alsa driver using new infrastructure
TODO: MacOS drivers!
* added directory 'Documentation'
network protocol document now under CVS, converted from latest document
into XML (Documentation/lscp.xml), lscp.xml is compliant to RFC 2629 and
can be converted into HTML or RFC common ASCII format by using 'xml2rfc'
* SET CHANNEL AUDIO_OUTPUT_TYPE <chan> <driver> command is back!
creates an audio output device instance of the given driver type
('Jack' or 'Alsa') with default parameters if none exists,
otherwise it just picks the first available device and assign
it to the intended sampler channel.
The AudioOutputDevice class get's a new pure virtual method,
Driver(), which is implemented on both of the existing inherited
classes, AudioOutputDeviceAlsa and AudioOutputDeviceJack, with
the sole purpose to return the driver type name as a String
('Alsa' and 'Jack', respectively).
The quoting on the filename argument for the LOAD INSTRUMENT
command has been made optional; you can have both ways, with
single quotes or none, keeping compability with older LSCP
An additional sanity check is made on LOAD INSTRUMENT, whether
the sampler channel has an audio output device assigned, thus
preventing the server from crashing on instrument file load.
The GET AUDIO_OUTPUT_DEVICE INFO now includes the missing
'driver' item, as predicted by the draft protocol document.
* Added implementation for SET CHANNEL AUDIO_OUTPUT_DEVICE
* LOAD INSTRUMENT NON_MODAL
* Fixes and hacks to make CREATE AUDIO_OUTPUT_DEVICE work
* Fix for CREATE_AUDIO_OUTPUT_DEVICE with all default params
Fix for GET AUDIO_OUTPUT_DEVICES resultset
Support for BACKGROUND loading
* Changed LSCPServer::LoadInstrument() signature, which adds a new
boolean argument (bool bBackground) where the loading mode maybe
selected, whether modal (the default), or modeless (in background).
* Update audiodriver to supply parameters in compliance
with the latest LSCP spec
* Update parser to comply with the latest spec
* small but important typo fix in optional.h
* Load Instrument patch applied; this patch makes the
LOAD INSTRUMENT command to return immediately,
almost/always with an OK response, while spawning
the proper instrument file loading in the background.
New INSTRUMENT_STATUS field on GET CHANNEL INFO result
set; the instrument status value holds the load progress
percentage if positive, otherwise a negative value is
evidence of a load exception error.
VERSION is now set to 0.2.
* Remove calls to pure virtual from constructor of base class
to avoid runtime failure. InitWithDefault() will have to be called
from the constructor of the class where virtuals are implemented.
* src/common: added template class 'optional<>' which can be used e.g. as
return type whenever a value might be returned, but don't has to; this
template class pretty much acts like a pointer of the given type, but is
much more safer than a simple pointer
src/audiodriver: added static class AudioDeviceFactory to create audio
devices at runtime by using a string and to obtain driver informations
of drivers at runtime, driver classes should simply use the macro
REGISTER_AUDIO_OUTPUT_DRIVER(DriverName,DriverClass) in their cpp file
to register the driver to LinuxSampler (no changes needed anymore in the
LS code to add a new audio output driver)
src/drivers: added classes to dynamically manage driver parameters; there
are two different kinds of parameters: parameters which are need to
create a new device (DeviceCreationParameterX) used to e.g. create an
audio output device or a MIDI input device and parameters which are only
available at runtime, means when a device is already created
(DeviceRuntimeParameterX) which will be e.g. used as audio channel
parameters and MIDI port parameters
src/linuxsampler.cpp: all registered audio output drivers will be shown
on the console on startup
src/network: implemented configuration of audio output devices via LSCP
* Error handling in resultset class, rewrite lscpserver to use resultset.
* Added LSCP command GET CHANNEL INFO
* Added methods for CHANNEL_INFO command
* LSCP allows now comment lines, that is lines starting with a hash ('#')
src/engines/gig/Voice.cpp: fixed "SET CHANNEL VOLUME" bug
* Do polynomial interpolation computation in float
* src/engines/gig/Voice.h: fixed bug which caused to hear only one audio
* Correct KeyOn with velocity = O bug
* New type_core_midi and type_midishare types
* First import of MidiShare device
* biquad filter parameters are now calculated outside the interpolate
loop for better performance
couple of loop unroll optimizations
filter is now enabled by default
cubic interpolation is now enabled by default
reduced debug level to 1 to lower verbosity
raised default limit for voices to 128
raised default limit for streams to 150
added some compiler optimization flags (-ffast-math -march -mcpu)
* Fixed SET CHANNEL MIDI_INPUT_CHANNEL lscp command.
* Adding LSCP command SET CHANNEL MIDI_INPUT_PORT. First attempt.
* src/audiodriver/AudioOutputDeviceJack.cpp: fixed another stupid bug that
caused a segmentation fault when the Jack audio driver was loaded
* src/Sampler.cpp: fixed 3 stupid but fatal bugs that left in the rush (in
method SamplerChannels(), CreateAudioOutputDevice() and
src/network/lscpserver.cpp: implemented LSCP command
'SET CHANNEL MIDI_INPUT_CHANNEL'
src/Sampler.h: moved enums 'audio_output_type_t', 'midi_input_type_t'
and 'engine_type_t' into the respective base classes
('AudioOutputDevice', 'MidiInputDevice', 'Engine')
* src/common/Thread.cpp: threads are now stoppable even if they are
waiting for a condition
src/common/Condition.cpp: fixed little misbehavior of Set() method,
which locked the Condition object on return
src/testcases: added a couple of new unit tests (against classes
'Mutex', 'Condition' and 'Thread')
* src/common/Thread.cpp: method StartThread() now blocks until thread
actually runs, mlockall() will only be applied for realtime threads
initiated automatic unit tests against the LinuxSampler codebase
(see src/testcases): already added a couple of tests for the Thread and
Mutex classes, you have to explicitly compile the unit tests by running
'make testcases' (you need to have cppunit installed though) and then you
can run the console version of the test runner by calling
src/Sampler.h: added API documentation
* completely restructured source tree
implemented multi channel support
implemented instrument manager, which controls sharing of instruments
between multiple sampler engines / sampler channels
created abstract classes 'AudioOutputDevice' and 'MidiInputDevice' for
convenient implementation of further audio output driver and MIDI input
driver for LinuxSampler
implemented following LSCP commands: 'SET CHANNEL MIDI INPUT TYPE',
'LOAD ENGINE', 'GET CHANNELS', 'ADD CHANNEL', 'REMOVE CHANNEL',
'SET CHANNEL AUDIO OUTPUT TYPE'
temporarily removed all command line options
LSCP server is now launched by default
* Fixed bug in AskForCreatedStream(). Cored if stream was not created.
* added Envelope Generator 2 and 3 (filter cutoff EG and pitch EG) for
accurate .gig playback
fixed accuracy of pitch calculation
changed filter cutoff range to 100Hz..10kHz with exponential curve, this
value range can also be adjusted on compile time by setting
FILTER_CUTOFF_MIN and FILTER_CUTOFF_MAX in src/voice.h to desired
src/lfo.h: lfo is now generalized to a C++ template, which will be useful
especially when we implement further engines
* implemented all three low frequency oscillators (LFO1 = volume,
LFO2 = filter cutoff frequency, LFO3 = pitch) for accurate .gig playback
* added filters (lowpass, bandpass and highpass), note that filter code is
currently disabled by default, you have to explicitly enable it in
src/voice.h by setting define ENABLE_FILTER to 1
src/eg_vca.cpp: Decay_1 stage now using exponential curve
* src/eg_vca.cpp: added following transitions to the envelope generator:
'Attack_Hold' -> 'Release', 'Decay_1' -> 'Release' in case of a release
EG1 parameters 'Attack Time', 'Release Time' and 'Sustain Time' are now
controllable by a MIDI controller defined in the .gig file
src/voice.cpp: fixed bug in pitch calculation which caused new triggered
voices to be played back without honoring the current pitch bend value
* implemented parser for the LinuxSampler control protocol (LSCP) by using
flex / bison (where src/network/lscp.l is the input file for lex / flex
and src/network/lscp.y is the input file for yacc / bison), parser and
scanner can be regenerated by 'make parser'
implemented LSCP network server (only single threaded so far), LSCP
server will be launched if LinuxSampler was started with "--server" flag,
implemented the following LSCP commands so far: "LOAD INSTRUMENT", "GET
CHANNEL VOICE_COUNT", "GET CHANNEL STREAM_COUNT", "GET CHANNEL
BUFFER_FILL", "SET CHANNEL VOLUME" and "RESET CHANNEL"
disk thread now started within the engine
* implemented bidirectional voice state transition, means voice state can
switch arbitrary times between 'Sustained'<-->'Released' within it's life
time, thus the release process of a voice can be cancelled
src/eg_vca.cpp: extended envelope generator by additional states
('Attack_Hold', 'Decay_1' and 'Decay_2')
applied patch from Vladimir Senkov which adds new command line parameters
('--jackout', '--alsaout' and '--samplerate')
configure.in: fixed compiler warning
* introduced time stamped events
implemented jitter correction
added pitchbend wheel support
src/audiothread.cpp: using voice pool instead of a voice array, makes
voice allocation more efficient and code more readable
src/rtelmemorypool: redesigned, added some new methods and pool is now
derived from list
* Added JACK support: Audio rendering process is now callback based and
independant of used audio output system. Interfaces to other audio output
systems can be added by creating a class derived from abstract base class
'AudioIO' and embedding the new class into linuxsampler.cpp.
src/audiothread.cpp: applied patch from Vladimir Senkov which fixes
hanging notes in conjunction with the sustain pedal
* implemented amplitude envelope generator
src/voice.cpp: some .gig instruments still sounded detuned, I hope
finally to have this fixed now
* src/gig.cpp: fixed looping informations ('LoopStart', 'LoopEnd' and
src/voice.cpp: pitch sample according to keyboard position only if
keyrange > 1 key, this was the reason that some gig files were horrible
src/audioio.cpp: bigendian specific fix
src/ringbuffer.h: removed kernel header dependency by adding own atomic.h
* implemented looping; RAM only loops (that is loops that end within the
cached part of the sample) are handled in src/voice.cpp whereas
disk stream looping is handled in src/stream.cpp and is mostly covered
there by the new ReadAndLoop() method in class 'Sample' from src/gig.cpp
* added command line switch --volume to set the global volume level
added command line switch --inputclient to connect to an Alsa sequencer
input client on startup (e.g. a MIDI port with a keyboard)
added command line switch --instrument to select an instrument in case
the instrument file provides more than one instrument
* src/audioio.cpp: added support for Alsa 1.0.0
src/audiothread.cpp: fixed several bugs in sustain pedal handling
src/diskthread.cpp: fixed several bugs which occured under extreme
conditions (endless loop in audiothread, freezing the whole application,
outage of available disk streams)
src/voice.cpp: fixed cubic interpolation (disabled by default; you can
enable it by setting USE_LINEAR_INTERPOLATION to 0 in src/voice.h)
src/configure.in: added check for Alsa version
* implemented velocity->volume mapping: samples are now played back with a
volume appropriate to the velocity of the triggered key, the velocity
curve transformation functions (in src/gig.h) used for this are so far
only an approximation to the ones from Gigasampler
* rewrote sustain pedal handling: instead of just queuing the note-offs I
added a sustain pointer for each midi key which starts to point to the
first active voice on the respective key and increments to the next voice
on the key when a note-off arrived, the release velocity value will
immediately be stored in the respective voice object (this also fixes the
segmentation fault issue when the sustain pool was full)
* src/voice.cpp: fixed bug which caused a voice not free it's disk stream
when the whole sample was already played back and the voice was going to
free itself resulting in outage of unused disk streams after a while
src/audioio.cpp: implemented automatic fallback to ALSA plughw when the
sound card doesn't support one of the hardware parameters
src/linuxsampler.cpp: solved segmentation fault issue when receiving a
SIGINT which was caused due to the fact that all threads entered the
signal handler (there still seems to occur a segfault on some certain
added print out of all-time maximum usage of voices and streams and the
current number of unused streams
src/thread.cpp: the StopThread() method will now block until the
associated thread actually stopped it's execution
* src/gig.cpp: fixed bug in decompression algorithm which caused it not to
detect the end of a stream and let the disk streams reload forever also
resulting in strange sounds at the end of disk voices (concerned only
playback of compressed gig files)
src/audiothread.cpp: deallocation of voices when they reached the end of
playback (thus e.g. when sustain pedal is pressed and a disk stream
reached it's end)
various endian corrections needed for non intel systems
introduced debug level, you can set the debug level and thus the
verbosity of LinuxSampler in src/global.h
* src/audiothread.cpp, src/audiothread.h: added Sustain Pedal support
implemented by postponing note-offs and leting multiple voices play
on the same MIDI key.
added the RTELMemoryPool Class which is a fast RT-safe memory allocator
and list manger
src/linuxsampler.cpp: added a voice and stream counter debug message
* transition from plain Makefile to autotools, source files moved to src/
configure.in: added test for x86 architecture
src/voice.h: x86 specific asm optimization for double to int casts only
if compiling for x86 architecture