Tempo synced Delay Plugin

This commit is contained in:
dave
2014-11-15 11:22:23 +00:00
parent df843e2b32
commit 6d2b91054b
15 changed files with 760 additions and 2 deletions

View File

@@ -42,11 +42,11 @@ If you're interested in translating LMMS in another language or want to imp
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://lmms.sourceforge.net&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://lmms.sourceforge.net&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<source>LMMS</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LMMS</source>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://lmms.io&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://lmms.io&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -651,6 +651,60 @@ If you&apos;re interested in translating LMMS in another language or want to imp
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DelayControls</name>
<message>
<source>Delay Samples</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feedback</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lfo Frequency</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lfo Ammount</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DelayControlsDialog</name>
<message>
<source>Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delay Time Samples:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feedback</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feedback Ammount:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lfo Hz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lfo Hz:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lfo Amt</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lfo Amt:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DualFilterControlDialog</name>
<message>
@@ -7016,6 +7070,10 @@ This chip was used in the Commodore 64 computer.</source>
<source>A NES-like synthesizer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A native delay plugin</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>projectNotes</name>

View File

@@ -5,6 +5,7 @@ ADD_SUBDIRECTORY(bit_invader)
ADD_SUBDIRECTORY(carlabase)
ADD_SUBDIRECTORY(carlapatchbay)
ADD_SUBDIRECTORY(carlarack)
ADD_SUBDIRECTORY(delay)
ADD_SUBDIRECTORY(DualFilter)
ADD_SUBDIRECTORY(dynamics_processor)
ADD_SUBDIRECTORY(flp_import)

View File

@@ -0,0 +1,3 @@
INCLUDE(BuildPlugin)
BUILD_PLUGIN(delay delayeffect.cpp delaycontrols.cpp delaycontrolsdialog.cpp lfo.cpp stereodelay.cpp MOCFILES delaycontrols.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png")

BIN
plugins/delay/artwork.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,73 @@
/*
* delaycontrols.cpp - definition of DelayControls class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include <QtXml/QDomElement>
#include "delaycontrols.h"
#include "delayeffect.h"
#include "engine.h"
#include "song.h"
DelayControls::DelayControls(DelayEffect* effect):
EffectControls( effect ),
m_effect ( effect ),
m_delayTimeModel( 2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) ,
m_feebackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ),
m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ),
m_lfoAmmountModel(0.0f,0.0f,0.5f,0.01f, this, tr ( "Lfo Ammount" ) )
{
}
void DelayControls::changeControl()
{
//engine::getSong()->setModified();
}
void DelayControls::loadSettings(const QDomElement &_this)
{
m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" );
m_feebackModel.loadSettings( _this, "FeebackAmmount" );
m_lfoTimeModel.loadSettings( _this , "LfoFrequency");
m_lfoAmmountModel.loadSettings( _this, "LfoAmmount");
}
void DelayControls::saveSettings(QDomDocument& doc, QDomElement& _this)
{
m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples");
m_feebackModel.saveSettings( doc, _this ,"FeebackAmmount");
m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency");
m_lfoAmmountModel.saveSettings( doc, _this ,"LfoAmmount");
}
#include "moc_delaycontrols.cxx"

View File

@@ -0,0 +1,72 @@
/*
* delaycontrols.h - declaration of DelayControl class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef DELAYCONTROLS_H
#define DELAYCONTROLS_H
#include "EffectControls.h"
#include "knob.h"
#include "delaycontrolsdialog.h"
class DelayEffect;
class DelayControls : public EffectControls
{
Q_OBJECT
public:
DelayControls( DelayEffect* effect );
virtual ~DelayControls()
{
}
virtual void saveSettings( QDomDocument& doc, QDomElement& parent );
virtual void loadSettings( const QDomElement& _this );
inline virtual QString nodeName() const
{
return "Delay";
}
virtual int controlCount(){
return 4;
}
virtual EffectControlDialog* createView()
{
return new DelayControlsDialog( this );
}
private slots:
void changeControl();
private:
DelayEffect* m_effect;
TempoSyncKnobModel m_delayTimeModel;
FloatModel m_feebackModel;
TempoSyncKnobModel m_lfoTimeModel;
FloatModel m_lfoAmmountModel;
friend class DelayControlsDialog;
friend class DelayEffect;
};
#endif // DELAYCONTROLS_H

View File

@@ -0,0 +1,70 @@
/*
* delaycontrolsdialog.cpp - definition of DelayControlsDialog class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include "delaycontrolsdialog.h"
#include "delaycontrols.h"
#include "embed.h"
#include "TempoSyncKnob.h"
DelayControlsDialog::DelayControlsDialog(DelayControls *controls) :
EffectControlDialog( controls )
{
setAutoFillBackground( true );
QPalette pal;
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
setPalette( pal );
setFixedSize( 100,125 );
TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this );
sampleDelayKnob->move( 20,30 );
sampleDelayKnob->setVolumeKnob( false );
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
sampleDelayKnob->setLabel( tr( "Delay" ) );
sampleDelayKnob->setHintText( tr( "Delay Time Samples:" ) + " ", "" );
knob * feedbackKnob = new knob( knobBright_26, this);
feedbackKnob->move( 60,30 );
feedbackKnob->setVolumeKnob(true);
feedbackKnob->setModel( &controls->m_feebackModel);
feedbackKnob->setLabel( tr( "Feedback" ) );
feedbackKnob->setHintText( tr ( "Feedback Ammount:" ) + " ", "");
TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this);
lfoFreqKnob->move( 20,80 );
lfoFreqKnob->setVolumeKnob(false);
lfoFreqKnob->setModel( &controls->m_lfoTimeModel);
lfoFreqKnob->setLabel( tr( "Lfo Hz" ) );
lfoFreqKnob->setHintText( tr ( "Lfo Hz:" ) + " ", "");
knob * lfoAmtKnob = new knob( knobBright_26, this);
lfoAmtKnob->move( 60,80 );
lfoAmtKnob->setVolumeKnob(true);
lfoAmtKnob->setModel( &controls->m_lfoAmmountModel);
lfoAmtKnob->setLabel( tr( "Lfo Amt" ) );
lfoAmtKnob->setHintText( tr ( "Lfo Amt:" ) + " ", "");
}

View File

@@ -0,0 +1,41 @@
/*
* delaycontrolsdialog.h - declaration of DelayControlsDialog class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef DELAYCONTROLSDIALOG_H
#define DELAYCONTROLSDIALOG_H
#include "EffectControlDialog.h"
class DelayControls;
class DelayControlsDialog : public EffectControlDialog
{
public:
DelayControlsDialog(DelayControls* controls );
virtual ~DelayControlsDialog()
{
}
};
#endif // DELAYCONTROLSDIALOG_H

View File

@@ -0,0 +1,115 @@
/*
* delayeffect.cpp - definition of the DelayEffect class. The Delay Plugin
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include "delayeffect.h"
#include "engine.h"
#include "embed.cpp"
extern "C"
{
Plugin::Descriptor PLUGIN_EXPORT delay_plugin_descriptor =
{
STRINGIFY( PLUGIN_NAME ),
"Delay",
QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ),
"Dave French <contact/dot/dave/dot/french3/at/googlemail/dot/com>",
0x0100,
Plugin::Effect,
new PluginPixmapLoader( "logo" ),
NULL,
NULL
} ;
DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeatures::Key* key ) :
Effect( &delay_plugin_descriptor, parent, key ),
m_delayControls( this )
{
m_delay = 0;
m_delay = new StereoDelay( engine::mixer()->processingSampleRate()* 20 );
m_lfo = new Lfo( engine::mixer()->processingSampleRate() );
}
DelayEffect::~DelayEffect()
{
if( m_delay )
{
delete m_delay;
}
if( m_lfo )
{
delete m_lfo;
}
}
bool DelayEffect::processAudioBuffer(sampleFrame* buf, const fpp_t frames)
{
if( !isEnabled() || !isRunning () )
{
return( false );
}
double outSum = 0.0;
const float d = dryLevel();
const float w = wetLevel();
sample_t dryS[2];
for( fpp_t f = 0; f < frames; ++f )
{
dryS[0] = buf[f][0];
dryS[1] = buf[f][1];
m_lfo->setAmplitude( m_delayControls.m_lfoAmmountModel.value( f ) );
m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value( f ) );
m_delay->setLength( m_delayControls.m_delayTimeModel.value(f) * engine::mixer()->processingSampleRate() * m_lfo->tick() );
m_delay->setFeedback( m_delayControls.m_feebackModel.value( f ) );
m_delay->tick( &buf[f][0], &buf[f][1] );
buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] );
buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] );
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
checkGate( outSum / frames );
return isRunning();
}
extern "C"
{
//needed for getting plugin out of shared lib
Plugin * PLUGIN_EXPORT lmms_plugin_main( Model* parent, void* data )
{
return new DelayEffect( parent , static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>( data ) );
}
}}

View File

@@ -0,0 +1,49 @@
/*
* delayeffect.h - declaration of DelayEffect class, the Delay plugin
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef DELAYEFFECT_H
#define DELAYEFFECT_H
#include "Effect.h"
#include "delaycontrols.h"
#include "lfo.h"
#include "stereodelay.h"
class DelayEffect : public Effect
{
public:
DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key );
virtual ~DelayEffect();
virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames);
virtual EffectControls* controls()
{
return &m_delayControls;
}
private:
DelayControls m_delayControls;
StereoDelay* m_delay;
Lfo* m_lfo;
};
#endif // DELAYEFFECT_H

79
plugins/delay/lfo.cpp Normal file
View File

@@ -0,0 +1,79 @@
/*
* lfo.cpp - defination of Lfo class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include "lfo.h"
#include <math.h>
Lfo::Lfo( int samplerate )
{
m_samplerate = samplerate;
m_twoPiOverSr = TWOPI / samplerate;
}
void Lfo::setFrequency( double frequency )
{
if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency )
{
return;
}
m_frequency = frequency;
m_increment = m_frequency * m_twoPiOverSr;
}
void Lfo::setAmplitude( float amplitude )
{
if( amplitude < 0.0 || amplitude > 1.0 )
{
return;
}
m_amplitude = amplitude;
}
float Lfo::tick()
{
float output = ( float )sin( m_phase );
m_phase += m_increment;
if( m_phase >= TWOPI )
{
m_phase -= TWOPI;
}
if( m_amplitude > 0.0001 )
{
return ( ( output + 1.0 ) / 2.0 ) * m_amplitude;
} else
{
return 1;
}
}

53
plugins/delay/lfo.h Normal file
View File

@@ -0,0 +1,53 @@
/*
* lfo.h - declaration of Lfo class, a simple sine lfo
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef LFO_H
#define LFO_H
#ifndef M_PI
#define M_PI (3.14159265358979321 )
#endif
#define TWOPI ( 2.0 * M_PI )
class Lfo
{
public:
Lfo( int samplerate );
~Lfo()
{
}
void setFrequency( double frequency );
void setAmplitude( float amplitude );
float tick();
private:
double m_frequency;
double m_phase;
double m_increment;
double m_amplitude;
double m_twoPiOverSr;
int m_samplerate;
};
#endif // LFO_H

BIN
plugins/delay/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,100 @@
/*
* stereodelay.cpp - defination of StereoDelay class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include "stereodelay.h"
#include <cstdlib>
StereoDelay::StereoDelay(int maxLength)
{
m_buffer = 0;
m_buffer = ( float* )malloc(maxLength*2*sizeof( float ) );
m_maxLength = maxLength;
m_length = m_maxLength;
m_index = 0;
m_feedback = 0.0f;
setLength( 0 );
}
StereoDelay::~StereoDelay()
{
if( m_buffer )
{
free( m_buffer );
}
}
void StereoDelay::setLength( int length )
{
if( length <= m_maxLength && length >= 0 )
{
if( length < m_length )
{
for( int i = length * 2; i < m_length *2; i++)
{
m_buffer[i] = 0.0f;
}
}
m_length = length;
}
}
void StereoDelay::setFeedback( float feedback )
{
m_feedback = feedback;
}
float m_oldLeft;
float m_oldRight;
void StereoDelay::tick( float* left, float* right )
{
m_oldLeft = m_buffer[m_index];
m_oldRight = m_buffer[m_index+1];
m_buffer[m_index] = *left + ( m_oldLeft * m_feedback );
m_buffer[m_index+1] = *right + ( m_oldRight * m_feedback );
*left = m_oldLeft;
*right = m_oldRight;
m_index++; m_index++;
if( m_index > m_length )
{
m_index = 0;
}
}

View File

@@ -0,0 +1,44 @@
/*
* stereodelay.h - declaration of StereoDelay class.
*
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
*
* This file is part of LMMS - http://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program 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 General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef STEREODELAY_H
#define STEREODELAY_H
class StereoDelay
{
public:
StereoDelay( int maxLength );
~StereoDelay();
void setLength( int length );
void setFeedback( float feedback );
void tick( float* left, float* right );
private:
float *m_buffer;
int m_maxLength;
int m_length;
int m_index;
float m_feedback;
};
#endif // STEREODELAY_H