@ -1,6 +1,7 @@
// from: http://ll-plugins.nongnu.org/lv2pftci/#A_synth
// from: http://ll-plugins.nongnu.org/lv2pftci/#A_synth
# include <lvtk/synth.hpp>
# include <lvtk/synth.hpp>
# include <string.h>
# include "dexed.peg"
# include "dexed.peg"
# include "dexed.h"
# include "dexed.h"
# include "EngineMkI.h"
# include "EngineMkI.h"
@ -10,25 +11,89 @@
# include "msfa/freqlut.h"
# include "msfa/freqlut.h"
# include "msfa/controllers.h"
# include "msfa/controllers.h"
Dexed : : Dexed ( double rate ) : lvtk : : Synth < DexedVoice , Dexed > ( p_n_ports , p_lv2_events_in )
{
TRACE ( " Hi " ) ;
Exp2 : : init ( ) ;
Tanh : : init ( ) ;
Sin : : init ( ) ;
feedback_bitdepth = 11 ;
for ( uint i = 0 ; i < sizeof ( init_voice ) ; i + + ) {
data [ i ] = init_voice [ i ] ;
}
controllers . values_ [ kControllerPitchRange ] = 3 ;
controllers . values_ [ kControllerPitchStep ] = 0 ;
controllers . masterTune = 0 ;
controllers . values_ [ kControllerPitch ] = 0x2000 ;
controllers . modwheel_cc = 0 ;
controllers . foot_cc = 0 ;
controllers . breath_cc = 0 ;
controllers . aftertouch_cc = 0 ;
controllers . core = & engineMkI ;
lfo . reset ( data + 137 ) ;
Freqlut : : init ( rate ) ;
Lfo : : init ( rate ) ;
PitchEnv : : init ( rate ) ;
Env : : init_sr ( rate ) ;
//add_voices(new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate),new DexedVoice(rate));
add_voices ( new DexedVoice ( rate ) ) ;
add_audio_outputs ( p_lv2_audio_out_1 ) ;
}
Dexed : : ~ Dexed ( )
{
TRACE ( " Bye " ) ;
}
//==============================================================================
DexedVoice : : DexedVoice ( double rate ) : m_key ( lvtk : : INVALID_KEY ) , m_rate ( rate )
DexedVoice : : DexedVoice ( double rate ) : m_key ( lvtk : : INVALID_KEY ) , m_rate ( rate )
{
{
voice_number = voice_counter + + ;
TRACE ( " Hi %d " , voice_number ) ;
voice . dx7_note = new Dx7Note ;
voice . dx7_note = new Dx7Note ;
}
}
DexedVoice : : ~ DexedVoice ( )
{
TRACE ( " Bye " ) ;
}
void DexedVoice : : on ( unsigned char key , unsigned char velocity )
void DexedVoice : : on ( unsigned char key , unsigned char velocity )
{
{
m_key = key ;
m_key = key ;
voice . dx7_note - > init ( data , key , velocity , feedback_bitdepth ) ;
voice . midi_note = data [ 144 ] - 24 ;
voice . keydown = true ;
voice . keydown = true ;
printf ( " Dexed: key-down: %d %d \n " , key , velocity ) ;
voice . sustained = false ;
lfo . keydown ( ) ;
if ( voice . live = = false )
{
voice . dx7_note - > init ( data , key , velocity , feedback_bitdepth ) ;
voice . live = true ;
}
if ( data [ 136 ] )
voice . dx7_note - > oscSync ( ) ;
TRACE ( " %d key-down: %d %d " , voice_number , key , velocity ) ;
}
}
void DexedVoice : : off ( unsigned char velocity )
void DexedVoice : : off ( unsigned char velocity )
{
{
voice . dx7_note - > keyup ( ) ;
voice . dx7_note - > keyup ( ) ;
voice . keydown = false ;
voice . keydown = false ;
voice . live = false ;
m_key = lvtk : : INVALID_KEY ;
m_key = lvtk : : INVALID_KEY ;
printf ( " Dexed: key-up: %d \n " , velocity ) ;
TRACE ( " %d key-up: %d " , voice_number , velocity ) ;
}
}
unsigned char DexedVoice : : get_key ( void ) const
unsigned char DexedVoice : : get_key ( void ) const
@ -38,51 +103,46 @@ unsigned char DexedVoice::get_key(void) const
void DexedVoice : : render ( uint32_t from , uint32_t to )
void DexedVoice : : render ( uint32_t from , uint32_t to )
{
{
if ( m_key = = lvtk : : INVALID_KEY )
int32_t s ;
return ;
TRACE ( " Hi " ) ;
TRACE ( " %d from: %d to: %d " , voice_number , from , to ) ;
if ( m_key ! = lvtk : : INVALID_KEY )
{
for ( uint32_t i = from ; i < to ; + + i )
for ( uint32_t i = from ; i < to ; + + i )
{
{
int32_t s ;
if ( voice . live = = true )
//dx7_note->compute(&s, lfovalue, lfodelay, &controllers);
{
voice . dx7_note - > compute ( & s , lfo . getsample ( ) , lfo . getdelay ( ) , & controllers ) ;
voice . dx7_note - > compute ( & s , lfo . getsample ( ) , lfo . getdelay ( ) , & controllers ) ;
float fs = float ( s ) / ( INT32_MAX ) ;
float fs = ( float ) s / INT32_MAX ;
p ( p_lv2_audio_out_1 ) [ i ] + = fs ;
p ( p_lv2_audio_out_1 ) [ i ] + = fs ;
TRACE ( " out: %2.5f " , fs ) ;
}
}
}
}
TRACE ( " Bye " ) ;
}
}
void DexedVoice : : post_process ( uint32_t from , uint32_t to )
void DexedVoice : : post_process ( uint32_t from , uint32_t to )
{
{
TRACE ( " Hi " ) ;
for ( uint32_t i = from ; i < to ; + + i )
for ( uint32_t i = from ; i < to ; + + i )
{
{
p ( p_lv2_audio_out_1 ) [ i ] * = * p ( p_output ) ;
p ( p_lv2_audio_out_1 ) [ i ] * = * p ( p_output ) ;
}
}
TRACE ( " Bye " ) ;
}
}
//==============================================================================
# ifdef DEBUG
void dexed_trace ( const char * source , const char * fmt , . . . ) {
Dexed : : Dexed ( double rate ) : lvtk : : Synth < DexedVoice , Dexed > ( p_n_ports , p_lv2_events_in )
char output [ 4096 ] ;
{
va_list argptr ;
Exp2 : : init ( ) ;
va_start ( argptr , fmt ) ;
Tanh : : init ( ) ;
vsnprintf ( output , 4095 , fmt , argptr ) ;
Sin : : init ( ) ;
va_end ( argptr ) ;
Freqlut : : init ( rate ) ;
printf ( " %s: %s \n " , source , output ) ;
Lfo : : init ( rate ) ;
PitchEnv : : init ( rate ) ;
Env : : init_sr ( rate ) ;
engineType = DEXED_ENGINE_MARKI ;
feedback_bitdepth = 11 ;
controllers . core = & engineMkI ;
for ( uint i = 0 ; i < sizeof ( init_voice ) ; i + + ) {
data [ i ] = init_voice [ i ] ;
}
add_voices ( new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) , new DexedVoice ( rate ) ) ;
add_audio_outputs ( p_lv2_audio_out_1 ) ;
}
}
# endif
static int _ = Dexed : : register_class ( p_uri ) ;
static int _ = Dexed : : register_class ( p_uri ) ;