implemented support for time-signatures other than 4/4

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1021 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Tobias Doerffel
2008-05-25 22:43:53 +00:00
parent 49d1acdb41
commit bf077dd520
21 changed files with 370 additions and 269 deletions

View File

@@ -40,12 +40,14 @@ public:
void loadSettings( const QDomElement & _this,
const QString & _name );
inline int getNumerator( void )
void reset( void );
inline int getNumerator( void ) const
{
return( m_numeratorModel.value() );
}
inline int getDenominator( void )
inline int getDenominator( void ) const
{
return( m_denominatorModel.value() );
}
@@ -56,11 +58,6 @@ private:
lcdSpinBoxModel m_denominatorModel;
signals:
void numeratorChanged( void );
void denominatorChanged( void );
friend class meterDialog;
} ;

View File

@@ -30,40 +30,39 @@
#include "types.h"
const int DefaultTicksPerTact = 192;
const int DefaultStepsPerTact = 16;
const int DefaultBeatsPerTact = DefaultTicksPerTact / DefaultStepsPerTact;
class midiTime
{
public:
inline midiTime( const tact _tact, const tick _ticks ) :
m_tact( _tact ),
m_ticks( _tact * s_ticksPerTact + _ticks )
{
}
inline midiTime( const tick _ticks = 0 ) :
m_ticks( _ticks )
{
}
inline midiTime( const int _abs = 0 ) :
m_tact( _abs / DefaultTicksPerTact ),
m_ticks( _abs % DefaultTicksPerTact )
inline midiTime( const midiTime & _t ) :
m_ticks( _t.m_ticks )
{
}
inline midiTime( const midiTime & _t )
{
*this = _t;
}
inline midiTime toNearestTact( void ) const
{
if( m_ticks >= DefaultTicksPerTact/2 )
if( m_ticks % s_ticksPerTact >= s_ticksPerTact/2 )
{
return( m_tact * DefaultTicksPerTact +
DefaultTicksPerTact );
return( ( getTact() + 1 ) * s_ticksPerTact );
}
return( m_tact * DefaultTicksPerTact );
return( getTact() * s_ticksPerTact );
}
inline midiTime & operator=( const midiTime & _t )
{
m_tact = _t.m_tact;
m_ticks = _t.m_ticks;
return( *this );
}
@@ -80,14 +79,18 @@ public:
static_cast<int>( _t ) );
}
inline void setTact( tact _t )
{
m_tact = _t;
}
inline tact getTact( void ) const
{
return( m_tact );
return( m_ticks / s_ticksPerTact );
}
inline tact nextFullTact( void ) const
{
if( m_ticks % s_ticksPerTact == 0 )
{
return( m_ticks / s_ticksPerTact );
}
return( m_ticks / s_ticksPerTact + 1 );
}
inline void setTicks( tick _t )
@@ -100,21 +103,17 @@ public:
return( m_ticks );
}
// converts time-class in an absolute value, useful for calculations,
// comparisons and so on...
inline operator int( void ) const
{
return( static_cast<int>( m_tact ) * DefaultTicksPerTact +
static_cast<int>( m_ticks ) );
return( m_ticks );
}
// calculate number of frame that are needed this time
inline f_cnt_t frames( const float _frames_per_tick ) const
{
if( m_tact >= 0 )
if( m_ticks >= 0 )
{
return( static_cast<f_cnt_t>(
( m_tact * DefaultTicksPerTact + m_ticks ) *
return( static_cast<f_cnt_t>( m_ticks *
_frames_per_tick ) );
}
return( 0 );
@@ -128,10 +127,26 @@ public:
}
static tick ticksPerTact( void )
{
return( s_ticksPerTact );
}
static int stepsPerTact( void )
{
return( ticksPerTact() / DefaultBeatsPerTact );
}
static void setTicksPerTact( tick _tpt )
{
s_ticksPerTact = _tpt;
}
private:
tact m_tact;
tick m_ticks;
static tick s_ticksPerTact;
} ;

View File

@@ -47,8 +47,6 @@ class patternFreezeThread;
class sampleBuffer;
const int DEFAULT_STEPS_PER_TACT = 16;
const int BEATS_PER_TACT = DefaultTicksPerTact/DEFAULT_STEPS_PER_TACT;
@@ -70,6 +68,7 @@ public:
virtual midiTime length( void ) const;
midiTime beatPatternLength( void ) const;
note * addNote( const note & _new_note, const bool _quant_pos = TRUE );
@@ -159,6 +158,7 @@ protected slots:
void clear( void );
void freeze( void );
void unfreeze( void );
void changeTimeSignature( void );
private:

View File

@@ -244,7 +244,7 @@ private:
void copy_to_clipboard( const noteVector & _notes ) const;
void drawDetuningInfo( QPainter & _p, note * _n, Uint16 _x, Uint16 _y );
void drawDetuningInfo( QPainter & _p, note * _n, int _x, int _y );
bool mouseOverNote( void );
note * noteUnderMouse( void );
noteVector::const_iterator noteIteratorUnderMouse( void );

View File

@@ -40,10 +40,10 @@ class pattern;
class timeLine;
const bpm_t MIN_BPM = 10;
const bpm_t DEFAULT_BPM = 140;
const bpm_t MAX_BPM = 999;
const Uint16 MAX_SONG_LENGTH = 9999;
const bpm_t MinTempo = 10;
const bpm_t DefaultTempo = 140;
const bpm_t MaxTempo = 999;
const tick MaxSongLength = 9999 * DefaultTicksPerTact;
class song : public trackContainer
@@ -139,11 +139,6 @@ public:
bpm_t getTempo( void );
virtual automationPattern * tempoAutomationPattern( void );
const meterModel & getTimeSig( void ) const
{
return( m_timeSigModel );
}
track * getAutomationTrack( void )
{
return( m_automationTrack );
@@ -233,6 +228,13 @@ private:
virtual ~song();
inline int ticksPerTact( void ) const
{
return( DefaultTicksPerTact *
m_timeSigModel.getNumerator() /
m_timeSigModel.getDenominator() );
}
inline tact currentTact( void ) const
{
return( m_playPos[m_playMode].getTact() );
@@ -242,7 +244,7 @@ private:
{
return( m_playPos[m_playMode].getTicks() );
}
void setPlayPos( tact _tact_num, tick _tick, PlayModes _play_mode );
void setPlayPos( tick _ticks, PlayModes _play_mode );
void saveControllerStates( QDomDocument & _doc, QDomElement & _this );
void restoreControllerStates( const QDomElement & _this );
@@ -252,6 +254,7 @@ private:
lcdSpinBoxModel m_tempoModel;
meterModel m_timeSigModel;
int m_oldTicksPerTact;
sliderModel m_masterVolumeModel;
sliderModel m_masterPitchModel;
@@ -296,7 +299,8 @@ private:
signals:
void tempoChanged( bpm_t _new_bpm );
void timeSignatureChanged( int _num, int _den );
void timeSignatureChanged( int _old_ticks_per_tact,
int _ticks_per_tact );
} ;

View File

@@ -60,7 +60,6 @@ signals:
private slots:
void setHighQuality( bool );
void scrolled( int _new_pos );
void updateTimeLinePosition( void );
void masterVolumeChanged( int _new_val );
void masterVolumePressed( void );

View File

@@ -139,7 +139,7 @@ private:
inline int markerX( const midiTime & _t ) const
{
return( m_xOffset + static_cast<int>( ( _t - m_begin ) *
m_ppt / DefaultTicksPerTact ) );
m_ppt / midiTime::ticksPerTact() ) );
}

View File

@@ -39,7 +39,7 @@ typedef signed int Sint32;
typedef Uint32 minute;
typedef Sint8 second;
typedef Sint32 tact;
typedef Sint16 tick;
typedef Sint32 tick;
typedef Uint8 volume;
typedef Sint8 panning;