Skip to content

Commit

Permalink
fixes for aeolus
Browse files Browse the repository at this point in the history
  • Loading branch information
wschweer committed Apr 22, 2013
1 parent bc8168e commit e450ab5
Show file tree
Hide file tree
Showing 38 changed files with 683 additions and 366 deletions.
40 changes: 31 additions & 9 deletions aeolus/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,38 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#=============================================================================

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/libmscore
)
include (${PROJECT_SOURCE_DIR}/build/gch.cmake)

if (APPLE)
file(GLOB_RECURSE INCS "*.h")
else (APPLE)
set(INCS "")
endif (APPLE)

subdirs(aeolus)

install(DIRECTORY
stops
DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME}sound/aeolus
PATTERN .svn EXCLUDE
QT4_WRAP_CPP(aeolusMocs aeolusgui.h)
QT4_WRAP_UI (aeolusUi aeolus_gui.ui)

add_library (aeolus STATIC
${aeolusMocs}
${aeolusUi}
aeolus.cpp audio.cpp model.cpp addsynth.cpp scales.cpp
reverb.cpp asection.cpp division.cpp rankwave.cpp
rngen.cpp exp2ap.cpp
aeolusgui.cpp sparm.cpp
${PROJECT_BINARY_DIR}/all.h
${PCH}
${INCS}
)

set_target_properties (
aeolus
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)

xcode_pch(aeolus all)

ADD_DEPENDENCIES(aeolus mops1)
ADD_DEPENDENCIES(aeolus mops2)

File renamed without changes.
File renamed without changes.
2 changes: 0 additions & 2 deletions aeolus/aeolus/addsynth.h → aeolus/addsynth.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
#ifndef __ADDSYNTH_H
#define __ADDSYNTH_H

#include <stdint.h>

#define N_NOTE 11
#define N_HARM 64
#define NOTE_MIN 36
Expand Down
243 changes: 87 additions & 156 deletions aeolus/aeolus/aeolus.cpp → aeolus/aeolus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#ifdef Q_WS_MAC
#include <locale.h>
#endif

#include "aeolus.h"
#include "model.h"

Expand All @@ -28,36 +24,18 @@ extern QString mscoreGlobalShare;

#include "synthesizer/event.h"
#include "libmscore/xml.h"
#include "synthesizer/msynthesizer.h"

//---------------------------------------------------------
// init
//---------------------------------------------------------

void Aeolus::init(float samplerate)
{
Synthesizer::init(samplerate);

setlocale(LC_ALL, "C"); // scanf of floats does not work otherwise

QString stops = mscoreGlobalShare + "/sound/aeolus/stops";
int n = strlen(qPrintable(stops));
char* stopsPath = new char[n+1];
strcpy(stopsPath, qPrintable(stops));

QDir dir;
QString waves = dataPath + QString("/aeolus/waves%1").arg(samplerate);
dir.mkpath(waves);
n = strlen(qPrintable(waves));
char* wavesPath = new char[n+1];
strcpy(wavesPath, qPrintable(waves));
#include "sparm_p.h"

audio_init(samplerate);
model = new Model (this, _midimap, stopsPath, "Aeolus", wavesPath);
enum {
A_VOLUME, A_REVSIZE, A_REVTIME, A_STPOSIT
};

audio_start();
model->init();
}
static const std::vector<ParDescr> pd = {
{ A_VOLUME, "volume", true, 0.32f, 0.00f, 1.00f },
{ A_REVSIZE, "revsize", true, 0.075f, 0.025f, 0.15f },
{ A_REVTIME, "revtime", true, 4.0f, 2.0f, 7.00f },
{ A_STPOSIT, "stposit", true, 0.5f, -1.00f, 1.0f },
};

//---------------------------------------------------------
// Aeolus
Expand All @@ -66,15 +44,11 @@ void Aeolus::init(float samplerate)
Aeolus::Aeolus()
{
model = 0;
MidiPatch* patch = new MidiPatch;
patch->drum = false;
patch->bank = 0;
patch->prog = 0;
patch->name = name();
patchList.append(patch);
patchList.append(new MidiPatch { false, "Aeolus", 0, 0, "Aeolus" });

_sc_cmode = 0;
_sc_group = 0;
_audio = new M_audio_info;
// _audio = new M_audio_info;
_running = false;
_nplay = 0;
_fsamp = 0;
Expand All @@ -97,6 +71,33 @@ Aeolus::~Aeolus()
_reverb.fini ();
}

//---------------------------------------------------------
// init
//---------------------------------------------------------

void Aeolus::init(float samplerate)
{
setlocale(LC_ALL, "C"); // scanf of floats does not work otherwise

QString stops = mscoreGlobalShare + "/sound/aeolus/stops";
int n = strlen(qPrintable(stops));
char* stopsPath = new char[n+1];
strcpy(stopsPath, qPrintable(stops));

QDir dir;
QString waves = dataPath + QString("/aeolus/waves%1").arg(int(samplerate));
dir.mkpath(waves);
n = strlen(qPrintable(waves));
char* wavesPath = new char[n+1];
strcpy(wavesPath, qPrintable(waves));

audio_init(int(samplerate));
model = new Model (this, _midimap, stopsPath, "Aeolus", wavesPath);

audio_start();
model->init();
}

//---------------------------------------------------------
// setMasterTuning
//---------------------------------------------------------
Expand All @@ -122,40 +123,25 @@ void Aeolus::play(const PlayEvent& event)
{
int ch = event.channel();
int type = event.type();
int m = _midimap [ch] & 127; // Keyboard and hold bits
// printf("Aeolus::play %d %d %d\n", ch, type, m);
int m = _midimap [ch] & 0x7f; // Keyboard and hold bits

// int f = (_midimap [ch] >> 12) & 7; // Control enabled if (f & 4)
if (type == ME_NOTEON) {
int n = event.dataA();
int v = event.dataB();
if (v == 0) { // note off
if (n < 36)
;
else if (n <= 96)
key_off(n - 36, m);
}
else { // note on
if (n < 36)
;
else if (n <= 96)
key_on(n - 36, m);
if ((n >= 36) && (n <= 96)) {
n -= 36;
if (v == 0)
key_off(n, m);
else
key_on(n, m);
}
}
else if (type == ME_CONTROLLER) {
int p = event.dataA();
int v = event.dataB();
switch(p) {
case MIDICTL_HOLD:
case MIDICTL_ASOFF:
case MIDICTL_ANOFF:
break;
case MIDICTL_BANK:
break;
case MIDICTL_IFELM:
// if (!(f & 4)) enable control for all channels
// break;
if (v & 64) {
if (v & 0x40) {
// Set mode or clear group.
_sc_cmode = (v >> 4) & 3;
_sc_group = v & 7;
Expand All @@ -165,141 +151,86 @@ void Aeolus::play(const PlayEvent& event)
}
else if (_sc_cmode) {
// Set, reset or toggle stop.
model->set_ifelm (_sc_group, v & 31, _sc_cmode - 1);
model->set_ifelm (_sc_group, v & 0x1f, _sc_cmode - 1);
}
break;
case CTRL_ALL_NOTES_OFF:
allNotesOff(ch);
break;
}
}
}

//---------------------------------------------------------
// getPatchInfo
// allNotesOff
//---------------------------------------------------------

const QList<MidiPatch*>& Aeolus::getPatchInfo() const
void Aeolus::allNotesOff(int)
{
return patchList;
for (int i = 0; i < NNOTES; ++i)
_keymap[i] = 0x80;
}

//---------------------------------------------------------
// effectParameter
// getPatchInfo
//---------------------------------------------------------

#if 0
SyntiParameter Aeolus::parameter(int id) const
const QList<MidiPatch*>& Aeolus::getPatchInfo() const
{
SParmId spid(id);
if (spid.syntiId != AEOLUS_ID)
return SyntiParameter();

switch (spid.subsystemId) {
case 0: // audio
return _audiopar[spid.paramId];
case 1:
case 2:
case 3:
case 4:
{
SyntiParameter* fp = _asectp[spid.subsystemId-1]->get_apar();
return fp[spid.paramId];
}

default:
break;
}
return SyntiParameter();
return patchList;
}
#endif

//---------------------------------------------------------
// setParameter
// setValue
//---------------------------------------------------------

#if 0
void Aeolus::setParameter(int id, double value)
void Aeolus::setValue(int idx, double value)
{
SyntiParameter* p = 0;

switch(spid.subsystemId) {
case 0: // audio
p = &_audiopar[spid.paramId];
break;
case 1:
case 2:
case 3:
case 4:
{
SyntiParameter* fp = _asectp[spid.subsystemId-1]->get_apar();
p = &fp[spid.paramId];
}
default:
break;
switch (idx) {
case A_VOLUME: _audiopar[VOLUME] = value; break;
case A_REVSIZE: _audiopar[REVSIZE] = value; break;
case A_REVTIME: _audiopar[REVTIME] = value; break;
case A_STPOSIT: _audiopar[STPOSIT] = value; break;
}
if (p == 0)
return;
if (value > p->max())
value = p->max();
else if (value < p->min())
value = p->min();
// printf("aeolus set %d %d %f\n", effect, parameter, value);
p->set(value);
}
#endif

//---------------------------------------------------------
// rewrite_label
// value
//---------------------------------------------------------

void Aeolus::rewrite_label (const char *p)
double Aeolus::value(int idx) const
{
strcpy (_tempstr, p);
char* t = strstr (_tempstr, "-$");
if (t)
strcpy (t, t + 2);
else {
t = strchr (_tempstr, '$');
if (t)
*t = ' ';
double v;
switch (idx) {
case A_VOLUME: v = _audiopar[VOLUME]; break;
case A_REVSIZE: v = _audiopar[REVSIZE]; break;
case A_REVTIME: v = _audiopar[REVTIME]; break;
case A_STPOSIT: v = _audiopar[STPOSIT]; break;
}
return v;
}

//---------------------------------------------------------
// printGui
// state
//---------------------------------------------------------

void Aeolus::printGui()
{
for (int i = 0; i < _ifc_init->_ndivis; ++i) {
int group = i;
rewrite_label (_ifc_init->_groupd [group]._label);
printf ("Stops in group %s\n", _tempstr);
uint32_t m = _ifelms [group];
int n = _ifc_init->_groupd [group]._nifelm;
for (int i = 0; i < n; i++) {
rewrite_label (_ifc_init->_groupd [group]._ifelmd [i]._label);
printf (" %c %-7s %-1s\n", (m & 1) ? '+' : '-', _ifc_init->_groupd [group]._ifelmd [i]._mnemo, _tempstr);
m >>= 1;
}
}
}

SynthesizerGroup Aeolus::state() const
{
return SynthesizerGroup();
}
SynthesizerGroup g;
g.setName(name());

void Aeolus::setState(const SynthesizerGroup&)
{
for (const ParDescr& d : pd)
g.push_back(IdValue(d.id, QString("%1").arg(value(d.id))));
return g;
}

void Aeolus::allSoundsOff(int n)
{
allNotesOff(n);
}
//---------------------------------------------------------
// setState
//---------------------------------------------------------

void Aeolus::allNotesOff(int)
void Aeolus::setState(const SynthesizerGroup& g)
{
memset(_keymap, 0x80, sizeof(_keymap));
for (const IdValue& v : g)
setValue(v.id, v.data.toDouble());
}


Loading

0 comments on commit e450ab5

Please sign in to comment.