git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@890 0778d3d1-df1d-0410-868b-ea421aaaa00d
173 lines
3.6 KiB
C++
173 lines
3.6 KiB
C++
#ifndef SINGLE_SOURCE_COMPILE
|
|
|
|
/*
|
|
* instrument.cpp - base-class for all instrument-plugins (synths, samplers etc)
|
|
*
|
|
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
|
*
|
|
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
|
*
|
|
* 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 "instrument.h"
|
|
#include "instrument_view.h"
|
|
#include "instrument_track.h"
|
|
#include "dummy_instrument.h"
|
|
#include "note_play_handle.h"
|
|
|
|
|
|
instrument::instrument( instrumentTrack * _instrument_track,
|
|
const descriptor * _descriptor ) :
|
|
plugin( _descriptor, NULL/* _instrument_track*/ ),
|
|
m_instrumentTrack( _instrument_track )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
instrument::~instrument()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
void instrument::play( bool, sampleFrame * )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
void instrument::deleteNotePluginData( notePlayHandle * )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
f_cnt_t instrument::beatLen( notePlayHandle * ) const
|
|
{
|
|
return( 0 );
|
|
}
|
|
|
|
|
|
|
|
|
|
instrument * instrument::instantiate( const QString & _plugin_name,
|
|
instrumentTrack * _instrument_track )
|
|
{
|
|
plugin * p = plugin::instantiate( _plugin_name, _instrument_track,
|
|
_instrument_track );
|
|
// check whether instantiated plugin is an instrument
|
|
if( dynamic_cast<instrument *>( p ) != NULL )
|
|
{
|
|
// everything ok, so return pointer
|
|
return( dynamic_cast<instrument *>( p ) );
|
|
}
|
|
|
|
// not quite... so delete plugin and return dummy instrument
|
|
delete p;
|
|
return( new dummyInstrument( _instrument_track ) );
|
|
}
|
|
|
|
|
|
|
|
|
|
bool instrument::isFromTrack( const track * _track ) const
|
|
{
|
|
return( m_instrumentTrack == _track );
|
|
}
|
|
|
|
|
|
|
|
void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n )
|
|
{
|
|
const fpp_t frames = _n->framesLeftForCurrentPeriod();
|
|
const fpp_t fpp = engine::getMixer()->framesPerPeriod();
|
|
const f_cnt_t fl = _n->framesLeft();
|
|
if( fl <= desiredReleaseFrames()+fpp )
|
|
{
|
|
for( fpp_t f = fl > desiredReleaseFrames() ?
|
|
( tMax( fpp - desiredReleaseFrames(), 0 ) +
|
|
fl % fpp ) : 0; f < frames; ++f )
|
|
{
|
|
const float fac = (float)( fl-f-1 ) /
|
|
desiredReleaseFrames();
|
|
for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; ++ch )
|
|
{
|
|
buf[f][ch] *= fac;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
instrumentView::instrumentView( instrument * _instrument, QWidget * _parent ) :
|
|
pluginView( _instrument, _parent )
|
|
{
|
|
setModel( _instrument );
|
|
setFixedSize( 250, 250 );
|
|
setAttribute( Qt::WA_DeleteOnClose, TRUE );
|
|
}
|
|
|
|
|
|
|
|
|
|
instrumentView::~instrumentView()
|
|
{
|
|
if( getInstrumentTrackWindow() )
|
|
{
|
|
getInstrumentTrackWindow()->m_instrumentView = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void instrumentView::setModel( ::model * _model, bool )
|
|
{
|
|
if( dynamic_cast<instrument *>( _model ) != NULL )
|
|
{
|
|
modelView::setModel( _model );
|
|
getInstrumentTrackWindow()->setWindowIcon( *( model()->
|
|
getDescriptor()->logo ) );
|
|
connect( model(), SIGNAL( destroyed( QObject * ) ),
|
|
this, SLOT( close() ) );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
instrumentTrackWindow * instrumentView::getInstrumentTrackWindow( void )
|
|
{
|
|
return( dynamic_cast<instrumentTrackWindow *>(
|
|
parentWidget()->parentWidget() ) );
|
|
}
|
|
|
|
#endif
|