DavOrgan C++ port - please review
- From: Stefan Westerfeld <stefan space twc de>
- To: timj gtk org
- Cc: Beast Liste <beast beast gtk org>
- Subject: DavOrgan C++ port - please review
- Date: Mon, 23 Oct 2006 16:24:28 +0200
Hi!
I just C++ified the DavOrgan module - please review. I'll not post a
diff between the old C code and the C++ code (hardly readable, because
everything is different), but start with the new implementation as-is
and then the rest of the changes I made to SVN to make it work.
Cu... Stefan
plugins/davorgan.idl:
========================================================================
/* DavChorus - DAV Chorus Effect -*-mode: c++;-*-
* Copyright (c) 1999, 2000, 2002 David A. Bartold and Tim Janik
* Copyright (c) 2006 Stefan Westerfeld
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <bse/bse.idl>
namespace Bse {
namespace Dav {
class Organ : Effect {
Info icon = "icons/organ.png";
Info authors = "David A. Bartold";
Info license = _("GNU Lesser General Public License");
Info category = _("/Audio Sources/Organ");
Info blurb = _("DavOrgan is a modifiable additive organ synthesizer");
IStream freq_in = (_("Freq In"), _("Frequency Input"));
OStream audio_out = (_("Audio Out"), _("Organ output"));
group _("Base Frequency") {
Real base_freq = Freq (_("Frequency"), NULL, BSE_KAMMER_FREQUENCY, STANDARD ":dial");
Int base_note = Note (_("Note"), NULL, BSE_KAMMER_NOTE, GUI);
Int transpose = (_("Transpose"), _("Transposition of the frequency in semitones"),
0, BSE_MIN_TRANSPOSE, BSE_MAX_TRANSPOSE, 12,
STANDARD ":f:dial:skip-default");
Int fine_tune = FineTune (_("Fine Tune"), _("Amount of detuning in cent (hundredth part of a semitone)"),
STANDARD ":f:dial:skip-default");
};
group _("Harmonics") {
Real harm0 = Perc (_("16th"), _("16th Harmonic"), 100.0, STANDARD ":scale");
Real harm1 = Perc (_("8th"), _("8th Harmonic"), 100. * 36. / 127., STANDARD ":scale");
Real harm2 = Perc (_("5 1/3rd"), _("5 1/3rd Harmonic"), 100. * 100. / 127., STANDARD ":scale");
Real harm3 = Perc (_("4th"), _("4th Harmonic"), 100. * 32. / 127., STANDARD ":scale");
Real harm4 = Perc (_("2 2/3rd"), _("2 2/3rd Harmonic"), 100. * 91. / 127., STANDARD ":scale");
Real harm5 = Perc (_("2nd"), _("2nd Harmonic"), 100. * 55. / 127., STANDARD ":scale");
};
group _("Instrument flavour") {
Bool brass = (_("Brass Sounds"), _("Changes the organ to sound more brassy"), FALSE, STANDARD);
Bool reed = (_("Reed Sounds"), _("Adds reeds sound"), FALSE, STANDARD);
Bool flute = (_("Flute Sounds"), _("Adds flute sounds"), FALSE, STANDARD);
};
};
} // Dav
} // Bse
plugins/davorgan.cc:
========================================================================
/* DavOrgan - DAV Additive Organ Synthesizer
* Copyright (c) 1999, 2000, 2002 David A. Bartold and Tim Janik
* Copyright (c) 2006 Stefan Westerfeld
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "davorgan.genidl.hh"
#include <bse/bsemathsignal.h>
#include <bse/bsemain.h>
#include <bse/bseengine.h> /* FIXME: required for bse_engine_sample_freq() */
#include <vector>
using namespace std;
using namespace Sfi;
namespace Bse {
namespace Dav {
class Organ : public OrganBase {
/* per mix_freq() tables */
struct Tables
{
guint ref_count;
vector<gfloat> sine_table;
vector<gfloat> triangle_table;
vector<gfloat> pulse_table;
Tables (guint rate) :
ref_count (1),
sine_table (rate),
triangle_table (rate),
pulse_table (rate)
{
guint half = rate / 2;
guint slope = rate / 10;
guint i;
/* Initialize sine table. */
for (guint i = 0; i < rate; i++)
sine_table[i] = sin ((double (i) / rate) * 2.0 * PI) / 6.0;
/* Initialize triangle table. */
for (i = 0; i < rate / 2; i++)
triangle_table[i] = (4.0 / rate * i - 1.0) / 6.0;
for (; i < rate; i++)
triangle_table[i] = (4.0 / rate * (rate - i) - 1.0) / 6.0;
/* Initialize pulse table. */
for (i = 0; i < slope; i++)
pulse_table[i] = (-double (i) / slope) / 6.0;
for (; i < half - slope; i++)
pulse_table[i] = -1.0 / 6.0;
for (; i < half + slope; i++)
pulse_table[i] = ((double (i) - half) / slope) / 6.0;
for (; i < rate - slope; i++)
pulse_table[i] = 1.0 / 6.0;
for (; i < rate; i++)
pulse_table[i] = ((rate - i) * 1.0 / slope) / 6.0;
}
} *tables;
static map<guint, Tables*> table_map;
/* properties (used to pass "global" noise data into the modules) */
struct Properties : public OrganProperties {
const Tables *tables;
Properties (Organ *organ) :
OrganProperties (organ),
tables (organ->tables)
{
}
};
/* actual computation */
class Module : public SynthesisModule {
public:
/* frequency */
double m_transpose_factor;
double m_fine_tune_factor;
double m_cfreq;
/* instrument flavour */
bool m_flute;
bool m_reed;
bool m_brass;
/* harmonics */
gdouble m_harm0;
gdouble m_harm1;
gdouble m_harm2;
gdouble m_harm3;
gdouble m_harm4;
gdouble m_harm5;
/* phase accumulators */
guint32 m_harm0_paccu;
guint32 m_harm1_paccu;
guint32 m_harm2_paccu;
guint32 m_harm3_paccu;
guint32 m_harm4_paccu;
guint32 m_harm5_paccu;
/* mix_freq() specific tables */
const Tables *m_tables;
void
config (Properties *properties)
{
m_tables = properties->tables;
m_cfreq = properties->base_freq;
m_transpose_factor = bse_transpose_factor (properties->transpose);
m_fine_tune_factor = bse_cent_factor (properties->fine_tune);
// percent -> factor conversions
m_harm0 = properties->harm0 / 100.0;
m_harm1 = properties->harm1 / 100.0;
m_harm2 = properties->harm2 / 100.0;
m_harm3 = properties->harm3 / 100.0;
m_harm4 = properties->harm4 / 100.0;
m_harm5 = properties->harm5 / 100.0;
m_flute = properties->flute;
m_reed = properties->reed;
m_brass = properties->brass;
}
void
reset()
{
guint32 rfactor = bse_main_args->allow_randomization ? 1 : 0;
guint32 mix_freq_256 = mix_freq() * 256;
/* to make all notes sound a bit different, randomize the initial phase of
* each harmonic (except if the user requested deterministic behaviour)
*/
m_harm0_paccu = rfactor * g_random_int_range (0, mix_freq_256);
m_harm1_paccu = rfactor * g_random_int_range (0, mix_freq_256);
m_harm2_paccu = rfactor * g_random_int_range (0, mix_freq_256);
m_harm3_paccu = rfactor * g_random_int_range (0, mix_freq_256);
m_harm4_paccu = rfactor * g_random_int_range (0, mix_freq_256);
m_harm5_paccu = rfactor * g_random_int_range (0, mix_freq_256);
}
static inline gfloat
table_pos (const gfloat *table,
guint freq_256,
guint mix_freq_256,
guint32 *paccu)
{
*paccu += freq_256;
while (*paccu >= mix_freq_256)
*paccu -= mix_freq_256;
return table[*paccu >> 8];
}
void
process (unsigned int n_values)
{
const gfloat *sine_table = &m_tables->sine_table[0];
const gfloat *flute_table = m_flute ? &m_tables->triangle_table[0] : sine_table;
const gfloat *reed_table = m_reed ? &m_tables->pulse_table[0] : sine_table;
const gfloat *ifreq = istream (ICHANNEL_FREQ_IN).values;
gfloat *ovalues = ostream (OCHANNEL_AUDIO_OUT).values;
guint freq_256, mix_freq_256;
guint freq_256_harm0, freq_256_harm1;
guint i;
if (istream (ICHANNEL_FREQ_IN).connected)
freq_256 = BSE_FREQ_FROM_VALUE (ifreq[0]) * m_transpose_factor * m_fine_tune_factor * 256 + 0.5;
else
freq_256 = m_cfreq * m_transpose_factor * m_fine_tune_factor * 256 + 0.5;
mix_freq_256 = mix_freq() * 256;
freq_256_harm0 = freq_256 / 2;
freq_256_harm1 = freq_256;
if (m_brass)
{
guint freq_256_harm2 = freq_256 * 2;
guint freq_256_harm3 = freq_256_harm2 * 2;
guint freq_256_harm4 = freq_256_harm3 * 2;
guint freq_256_harm5 = freq_256_harm4 * 2;
for (i = 0; i < n_values; i++)
{
gfloat vaccu;
vaccu = table_pos (sine_table, freq_256_harm0, mix_freq_256, &m_harm0_paccu) * m_harm0;
vaccu += table_pos (sine_table, freq_256_harm1, mix_freq_256, &m_harm1_paccu) * m_harm1;
vaccu += table_pos (reed_table, freq_256_harm2, mix_freq_256, &m_harm2_paccu) * m_harm2;
vaccu += table_pos (sine_table, freq_256_harm3, mix_freq_256, &m_harm3_paccu) * m_harm3;
vaccu += table_pos (flute_table, freq_256_harm4, mix_freq_256, &m_harm4_paccu) * m_harm4;
vaccu += table_pos (flute_table, freq_256_harm5, mix_freq_256, &m_harm5_paccu) * m_harm5;
ovalues[i] = vaccu;
}
}
else
{
guint freq_256_harm2 = freq_256 * 3 / 2;
guint freq_256_harm3 = freq_256 * 2;
guint freq_256_harm4 = freq_256 * 3;
guint freq_256_harm5 = freq_256_harm3 * 2;
for (i = 0; i < n_values; i++)
{
gfloat vaccu;
vaccu = table_pos (sine_table, freq_256_harm0, mix_freq_256, &m_harm0_paccu) * m_harm0;
vaccu += table_pos (sine_table, freq_256_harm1, mix_freq_256, &m_harm1_paccu) * m_harm1;
vaccu += table_pos (sine_table, freq_256_harm2, mix_freq_256, &m_harm2_paccu) * m_harm2;
vaccu += table_pos (reed_table, freq_256_harm3, mix_freq_256, &m_harm3_paccu) * m_harm3;
vaccu += table_pos (sine_table, freq_256_harm4, mix_freq_256, &m_harm4_paccu) * m_harm4;
vaccu += table_pos (flute_table, freq_256_harm5, mix_freq_256, &m_harm5_paccu) * m_harm5;
ovalues[i] = vaccu;
}
}
}
};
public:
void
prepare1()
{
guint irate = (guint) bse_engine_sample_freq();
if (table_map[irate])
table_map[irate]->ref_count++;
else
table_map[irate] = new Tables (irate);
tables = table_map[irate];
}
void
reset1()
{
guint irate = (guint) bse_engine_sample_freq();
if (--table_map[irate]->ref_count == 0)
{
delete table_map[irate];
table_map[irate] = 0;
}
}
bool
property_changed (OrganPropertyID prop_id)
{
switch (prop_id)
{
/* implement special handling of GUI properties */
case PROP_BASE_FREQ:
base_note = bse_note_from_freq (base_freq);
notify ("base_note");
break;
case PROP_BASE_NOTE:
base_freq = bse_note_to_freq (base_note);
notify ("base_freq");
break;
default: ;
}
return false;
}
/* implement creation and config methods for synthesis Module */
BSE_EFFECT_INTEGRATE_MODULE (Organ, Module, Properties);
};
map<guint, Organ::Tables*> Organ::table_map;
BSE_CXX_DEFINE_EXPORTS();
BSE_CXX_REGISTER_EFFECT (Organ);
} // Dav
} // Bse
the diff (without davorgan.cc / davorgan.idl):
================================================================================
Index: sfi/ChangeLog
===================================================================
--- sfi/ChangeLog (revision 4015)
+++ sfi/ChangeLog (working copy)
@@ -1,3 +1,16 @@
+Mon Oct 23 15:22:37 2006 Stefan Westerfeld <stefan space twc de>
+
+ * sfidl-parser.cc: Don't use g_strdup_printf, but g_ascii_formatd for
+ formatting doubles (locale independancy). Some simplification could be
+ achieved by switching from char* to std::string for some code.
+ Switched double format from "%.17g" to "%.17e". This keeps doubles in
+ param specs like (50.0/100.0) in tact, because the C++ compiler will
+ still recognize that we have doubles here.
+ The old code would print (50/100), because "%g" omits decimal point
+ and trailing digits for those doubles that can be represented without,
+ so that the result of the division (when evaluated by the C++ compiler)
+ would be 0, instead of the expected 0.5.
+
Sat Oct 21 17:29:05 2006 Tim Janik <timj gtk org>
* sfitests.h, sfiwrapper.cc: adapt to init settings changes.
Index: sfi/sfidl-parser.cc
===================================================================
--- sfi/sfidl-parser.cc (revision 4015)
+++ sfi/sfidl-parser.cc (working copy)
@@ -37,6 +37,14 @@ Sfidl::string_from_int (long long int ll
return str;
}
+// we don't need that (yet) in the Sfidl namespace
+static std::string
+string_from_double (double value)
+{
+ char buffer[G_ASCII_DTOSTR_BUF_SIZE + 1] = "";
+ g_ascii_formatd (buffer, G_ASCII_DTOSTR_BUF_SIZE, "%.17e", value);
+ return buffer;
+}
namespace {
using namespace Sfidl;
@@ -997,16 +1005,13 @@ GTokenType Parser::parseStringOrConst (s
if (ci->name == s &&
ci->type != Constant::tIdent) /* identifier constants can't be expanded to strings */
{
- char *x = 0;
switch (ci->type)
{
case Constant::tInt:
- s = x = g_strdup_printf ("%lldLL", ci->i);
- g_free (x);
+ s = string_from_int (ci->i) + "LL";
break;
case Constant::tFloat:
- s = x = g_strdup_printf ("%.17g", ci->f);
- g_free (x);
+ s = string_from_double (ci->f);
break;
case Constant::tString:
s = ci->str;
@@ -1522,13 +1527,13 @@ GTokenType Parser::parseParamHints (Para
while (!g_scanner_eof (scanner) && bracelevel > 0)
{
GTokenType t = scanner_get_next_token_with_colon_identifiers (scanner);
- gchar *token_as_string = 0, *x = 0;
+ string token_as_string;
bool current_arg_complete = false;
+ char *tmp = 0;
if(int(t) > 0 && int(t) <= 255)
{
- token_as_string = g_new0 (char, 2); /* FIXME: leak */
- token_as_string[0] = char(t);
+ token_as_string = char(t);
}
switch (t)
{
@@ -1540,13 +1545,13 @@ GTokenType Parser::parseParamHints (Para
break;
case ',': current_arg_complete = true;
break;
- case G_TOKEN_STRING: x = g_strescape (scanner->value.v_string, 0);
- token_as_string = g_strdup_printf ("\"%s\"", x);
- g_free (x);
+ case G_TOKEN_STRING: tmp = g_strescape (scanner->value.v_string, 0);
+ token_as_string = string ("\"") + tmp + "\"";
+ g_free (tmp);
break;
- case G_TOKEN_INT: token_as_string = g_strdup_printf ("%llu", scanner->value.v_int64);
+ case G_TOKEN_INT: token_as_string = string_from_int (scanner->value.v_int64);
break;
- case G_TOKEN_FLOAT: token_as_string = g_strdup_printf ("%.17g", scanner->value.v_float);
+ case G_TOKEN_FLOAT: token_as_string = string_from_double (scanner->value.v_float);
break;
case G_TOKEN_IDENTIFIER:
{
@@ -1562,23 +1567,23 @@ GTokenType Parser::parseParamHints (Para
}
if (ci == constants.end())
- token_as_string = g_strdup_printf ("%s", scanner->value.v_identifier);
+ token_as_string = scanner->value.v_identifier;
else switch (ci->type)
{
case Constant::tInt:
- token_as_string = g_strdup_printf ("%lldLL", ci->i);
+ token_as_string = string_from_int (ci->i) + "LL";
break;
case Constant::tFloat:
- token_as_string = g_strdup_printf ("%.17g", ci->f);
+ token_as_string = string_from_double (ci->f);
break;
case Constant::tIdent:
- token_as_string = g_strdup (ci->str.c_str());
+ token_as_string = ci->str;
break;
case Constant::tString:
- x = g_strescape (ci->str.c_str(), 0);
- token_as_string = g_strdup_printf ("\"%s\"", x);
- g_free (x);
- break;
+ tmp = g_strescape (ci->str.c_str(), 0);
+ token_as_string = string("\"") + tmp + "\"";
+ g_free (tmp);
+ break;
default:
g_assert_not_reached ();
break;
@@ -1586,7 +1591,7 @@ GTokenType Parser::parseParamHints (Para
}
break;
default:
- if (!token_as_string)
+ if (token_as_string.empty())
return GTokenType (')');
}
if (current_arg_complete)
@@ -1601,16 +1606,15 @@ GTokenType Parser::parseParamHints (Para
}
current_arg = "";
}
- else if (token_as_string)
+ else if (!token_as_string.empty())
{
current_arg += token_as_string;
}
- if (token_as_string && bracelevel)
+ if (!token_as_string.empty() && bracelevel)
{
if (args != "")
args += ' ';
args += token_as_string;
- g_free (token_as_string);
}
}
def.args = args;
Index: tests/audio/organsong.bse
===================================================================
--- tests/audio/organsong.bse (revision 4015)
+++ tests/audio/organsong.bse (working copy)
@@ -1,6 +1,6 @@
; BseProject
-(bse-version "0.7.1")
+(bse-version "0.7.0")
(container-child "BseWaveRepo::Wave-Repository"
(modification-time "2006-10-21 19:32:55")
Index: bse/bsecompat.c
===================================================================
--- bse/bsecompat.c (revision 4015)
+++ bse/bsecompat.c (working copy)
@@ -38,6 +38,7 @@ bse_compat_rewrite_type_name (BseStorage
{ 0, 6, 2, "ArtsStereoCompressor", "BseArtsCompressor" },
{ 0, 6, 2, "DavBassFilter", "BseDavBassFilter" },
{ 0, 6, 2, "DavChorus", "BseDavChorus" },
+ { 0, 7, 0, "DavOrgan", "BseDavOrgan" },
};
guint i;
for (i = 0; i < G_N_ELEMENTS (type_changes); i++)
Index: bse/ChangeLog
===================================================================
--- bse/ChangeLog (revision 4015)
+++ bse/ChangeLog (working copy)
@@ -1,3 +1,9 @@
+Mon Oct 23 15:21:03 2006 Stefan Westerfeld <stefan space twc de>
+
+ * bsecompat.c: Added DavOrgan -> BseDavOrgan compatibility rewrite
+ typename rule for files <= 0.7.0, since the DavOrgan module is now
+ implemented in C++, and thus properly namespaced.
+
Sun Oct 22 00:22:27 2006 Tim Janik <timj gtk org>
* bsemain.c: let allow_randomization default to TRUE, added
Index: plugins/ChangeLog
===================================================================
--- plugins/ChangeLog (revision 4017)
+++ plugins/ChangeLog (working copy)
@@ -1,3 +1,13 @@
+Mon Oct 23 16:12:17 2006 Stefan Westerfeld <stefan space twc de>
+
+ * Makefile.am:
+ * Makefile.plugins: Switch from the C implementation of DavOrgan to
+ the C++ implementation of DavOrgan.
+
+ * davorgan.cc: Ported C code from DavOrgan to C++.
+
+ * davorgan.idl: Wrote a proper IDL file for the DavOrgan module.
+
Mon Oct 23 16:10:57 2006 Stefan Westerfeld <stefan space twc de>
* davorgan.idl:
Index: plugins/Makefile.plugins
===================================================================
--- plugins/Makefile.plugins (revision 4015)
+++ plugins/Makefile.plugins (working copy)
@@ -112,6 +112,20 @@ davchorus_SSE_la_LDFLAGS = $(davchorus
davchorus_SSE_la_LIBADD = $(davchorus_FPU_la_LIBADD)
davchorus_SSE_la_CXXFLAGS = $(SSE_PLUGIN_CXXFLAGS)
+## C++ Plugin davorgan
+$(srcdir)/davorgan.cc: davorgan.genidl.hh
+plugins_built_sources += davorgan.genidl.hh
+plugin_FPU_ltlibs += davorgan.FPU.la
+davorgan_FPU_la_SOURCES = davorgan.cc
+davorgan_FPU_la_LDFLAGS = -module $(plugins_ldflags)
+davorgan_FPU_la_LIBADD = $(plugins_libs)
+davorgan_FPU_la_CXXFLAGS = $(FPU_PLUGIN_CXXFLAGS)
+plugin_SSE_ltlibs += davorgan.SSE.la
+davorgan_SSE_la_SOURCES = $(davorgan_FPU_la_SOURCES)
+davorgan_SSE_la_LDFLAGS = $(davorgan_FPU_la_LDFLAGS)
+davorgan_SSE_la_LIBADD = $(davorgan_FPU_la_LIBADD)
+davorgan_SSE_la_CXXFLAGS = $(SSE_PLUGIN_CXXFLAGS)
+
## C++ Plugin standardsaturator
$(srcdir)/standardsaturator.cc: standardsaturator.genidl.hh
plugins_built_sources += standardsaturator.genidl.hh
@@ -246,21 +260,6 @@ bsesequencer_SSE_la_LIBADD = $(bseseq
bsesequencer_SSE_la_CFLAGS = $(SSE_PLUGIN_CFLAGS)
-## C Plugin davorgan
-EXTRA_HEADERS += davorgan.h
-$(srcdir)/davorgan.c: davorgan.h
-plugin_FPU_ltlibs += davorgan.FPU.la
-davorgan_FPU_la_SOURCES = davorgan.c
-davorgan_FPU_la_LDFLAGS = -module $(plugins_ldflags)
-davorgan_FPU_la_LIBADD = $(plugins_libs)
-davorgan_FPU_la_CFLAGS = $(FPU_PLUGIN_CFLAGS)
-plugin_SSE_ltlibs += davorgan.SSE.la
-davorgan_SSE_la_SOURCES = $(davorgan_FPU_la_SOURCES)
-davorgan_SSE_la_LDFLAGS = $(davorgan_FPU_la_LDFLAGS)
-davorgan_SSE_la_LIBADD = $(davorgan_FPU_la_LIBADD)
-davorgan_SSE_la_CFLAGS = $(SSE_PLUGIN_CFLAGS)
-
-
## C Plugin davxtalstrings
EXTRA_HEADERS += davxtalstrings.h
$(srcdir)/davxtalstrings.c: davxtalstrings.h
Index: plugins/Makefile.am
===================================================================
--- plugins/Makefile.am (revision 4015)
+++ plugins/Makefile.am (working copy)
@@ -21,6 +21,7 @@ plugin_idl_files = $(strip \
bsesummation.idl \
davbassfilter.idl \
davchorus.idl \
+ davorgan.idl \
standardsaturator.idl \
standardguspatchenvelope.idl \
)
@@ -44,7 +45,6 @@ PLUGIN_CFILES = $(strip \
bsemult.[hc] \
bsesimpleadsr.[hc] \
bsesequencer.[hc] \
- davorgan.[hc] \
davxtalstrings.[hc] \
davsyndrum.[hc] \
davcanyondelay.[hc] \
Index: ChangeLog
===================================================================
--- ChangeLog (revision 4015)
+++ ChangeLog (working copy)
@@ -1,3 +1,10 @@
+Mon Oct 23 15:57:20 2006 Stefan Westerfeld <stefan space twc de>
+
+ * tests/audio/organsong.bse: Downgraded test file version from 0.7.1
+ to 0.7.0 to activate type rewriting compatibility for the file,
+ because 0.7.1 will has a C++ version of DavOrgan (which is called
+ BseDavOrgan).
+
Sun Oct 22 22:37:16 2006 Tim Janik <timj gtk org>
* launchers/suidmain.c: improved error message slightly.
--
Stefan Westerfeld, Hamburg/Germany, http://space.twc.de/~stefan
[Date Prev][Date Next] [Thread Prev][Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]