void SampleTrack::setPlayingTcos( bool isPlaying ) { for( int i = 0; i < numOfTCOs(); ++i ) { TrackContentObject * tco = getTCO( i ); SampleTCO * sTco = dynamic_cast<SampleTCO*>( tco ); sTco->setIsPlaying( isPlaying ); } }
void SampleTrack::updateTcos() { for( int i = 0; i < numOfTCOs(); ++i ) { TrackContentObject * tco = getTCO( i ); SampleTCO * sTco = dynamic_cast<SampleTCO*>( tco ); sTco->playbackPositionChanged(); } }
/** * Read the pressure and temperature. * This method use the second order temperature * compensation algorithm described in the datasheet. * @param pressure Pressure pointer. hPa * @param temperature Temperature pointer. ºC * @param osr Oversample rate. Optional. * @return Status of operation (true = success) */ bool MS561101BA::readValues( float * pressure, float * temperature, int8_t osr) { // Read the sensors int32_t d1 = readD1(osr); int32_t d2 = readD2(osr); // Check for errors if (d1 < 0 || d2 < 0) return false; int32_t dT = d2 - (((uint32_t) getTREF()) << 8); double t = 2000.0 + ((int64_t) dT) * getTEMPSENS() / POW_2_23; int64_t off = (((int64_t) getOFFT1()) << 16) + ((int64_t) dT) * getTCO() / POW_2_7; int64_t sens = (((int64_t) getSENST1()) << 15) + ((int64_t) dT) * getTCS() / POW_2_8; // Second order temperature compensation if (t < 2000) { double square = pow (dT,2); double t2 = square / POW_2_31; square = pow (t-2000,2); double off2 = square * 5 / 2; double sens2 = square * 5 / 4; if (t < 15) { square = pow(t+1500,2); off2 += square * 7; sens2 += square * 11 / 2; } t -= t2; off -= off2; sens -= sens2; } double p = ((sens * d1 / POW_2_21) - off) / POW_2_15; *temperature = float(t/100); *pressure = float(p/100); return true; }
bool sampleTrack::play( const midiTime & _start, const fpp_t _frames, const f_cnt_t _offset, Sint16 /*_tco_num*/ ) { m_audioPort.effects()->startRunning(); bool played_a_note = false; // will be return variable for( int i = 0; i < numOfTCOs(); ++i ) { trackContentObject * tco = getTCO( i ); if( tco->startPosition() != _start ) { continue; } sampleTCO * st = dynamic_cast<sampleTCO *>( tco ); if( !st->isMuted() ) { playHandle * handle; if( st->isRecord() ) { if( !engine::getSong()->isRecording() ) { return played_a_note; } sampleRecordHandle * smpHandle = new sampleRecordHandle( st ); handle = smpHandle; } else { samplePlayHandle * smpHandle = new samplePlayHandle( st ); smpHandle->setVolumeModel( &m_volumeModel ); handle = smpHandle; } //TODO: check whether this works // handle->setBBTrack( _tco_num ); handle->setOffset( _offset ); // send it to the mixer engine::getMixer()->addPlayHandle( handle ); played_a_note = true; } } return played_a_note; }
void InstrumentTrack::setName( const QString & _new_name ) { // when changing name of track, also change name of those patterns, // which have the same name as the instrument-track for( int i = 0; i < numOfTCOs(); ++i ) { pattern * p = dynamic_cast<pattern *>( getTCO( i ) ); if( ( p != NULL && p->name() == name() ) || p->name() == "" ) { p->setName( _new_name ); } } track::setName( _new_name ); m_midiPort.setName( name() ); m_audioPort.setName( name() ); emit nameChanged(); }
bool MS561101BA::TemperatureCompensation(int32_t * pressure, int32_t * temperature, int32_t d1, int32_t d2) { if (d1 < 0 || d2 < 0) return false; int32_t dT = d2 - (((uint32_t) getTREF()) << 8); double t = 2000.0 + ((int64_t) dT) * getTEMPSENS() / POW_2_23; double off = (((int64_t) getOFFT1()) << 16) + ((int64_t) dT) * getTCO() / POW_2_7; double sens = (((int64_t) getSENST1()) << 15) + ((int64_t) dT) * getTCS() / POW_2_8; // Second order temperature compensation if (t < 2000) { double square = pow (dT,2); double t2 = square / POW_2_31; square = pow (t-2000,2); double off2 = square * 5 / 2; double sens2 = square * 5 / 4; if (t < 15) { square = pow(t+1500,2); off2 += square * 7; sens2 += square * 11 / 2; } t -= t2; off -= off2; sens -= sens2; } double p = ((sens * d1 / POW_2_21) - off) / POW_2_15; *pressure = (int32_t) p; *temperature = (int32_t) t; return true; }
bool AutomationTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num ) { if( isMuted() ) { return false; } tcoVector tcos; if( _tco_num >= 0 ) { TrackContentObject * tco = getTCO( _tco_num ); tcos.push_back( tco ); } else { getTCOsInRange( tcos, _start, _start + static_cast<int>( _frames / Engine::framesPerTick()) ); } for( tcoVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { AutomationPattern * p = dynamic_cast<AutomationPattern *>( *it ); if( p == NULL || ( *it )->isMuted() ) { continue; } MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); } p->processMidiTime( cur_start ); } return false; }
bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, const f_cnt_t _offset, Sint16 _tco_num ) { const float frames_per_tick = engine::framesPerTick(); tcoVector tcos; bbTrack * bb_track = NULL; if( _tco_num >= 0 ) { trackContentObject * tco = getTCO( _tco_num ); tcos.push_back( tco ); bb_track = bbTrack::findBBTrack( _tco_num ); } else { getTCOsInRange( tcos, _start, _start + static_cast<int>( _frames / frames_per_tick ) ); } // Handle automation: detuning for( NotePlayHandleList::Iterator it = m_processHandles.begin(); it != m_processHandles.end(); ++it ) { ( *it )->processMidiTime( _start ); } if ( tcos.size() == 0 ) { return false; } bool played_a_note = false; // will be return variable for( tcoVector::Iterator it = tcos.begin(); it != tcos.end(); ++it ) { pattern * p = dynamic_cast<pattern *>( *it ); // everything which is not a pattern or muted won't be played if( p == NULL || ( *it )->isMuted() ) { continue; } midiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); } if( p->isFrozen() && !engine::getSong()->isExporting() ) { if( cur_start > 0 ) { continue; } samplePlayHandle * handle = new samplePlayHandle( p ); handle->setBBTrack( bb_track ); handle->setOffset( _offset ); // send it to the mixer engine::getMixer()->addPlayHandle( handle ); played_a_note = true; continue; } // get all notes from the given pattern... const NoteVector & notes = p->notes(); // ...and set our index to zero NoteVector::ConstIterator nit = notes.begin(); #if LMMS_SINGERBOT_SUPPORT int note_idx = 0; #endif // very effective algorithm for playing notes that are // posated within the current sample-frame if( cur_start > 0 ) { // skip notes which are posated before start-tact while( nit != notes.end() && ( *nit )->pos() < cur_start ) { #if LMMS_SINGERBOT_SUPPORT if( ( *nit )->length() != 0 ) { ++note_idx; } #endif ++nit; } } note * cur_note; while( nit != notes.end() && ( cur_note = *nit )->pos() == cur_start ) { if( cur_note->length() != 0 ) { const f_cnt_t note_frames = cur_note->length().frames( frames_per_tick ); notePlayHandle * note_play_handle = new notePlayHandle( this, _offset, note_frames, *cur_note ); note_play_handle->setBBTrack( bb_track ); #if LMMS_SINGERBOT_SUPPORT note_play_handle->setPatternIndex( note_idx ); #endif engine::getMixer()->addPlayHandle( note_play_handle ); played_a_note = true; #if LMMS_SINGERBOT_SUPPORT ++note_idx; #endif } ++nit; } } return played_a_note; }
bool InstrumentTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { if( ! m_instrument || ! tryLock() ) { return false; } const float frames_per_tick = Engine::framesPerTick(); tcoVector tcos; ::BBTrack * bb_track = NULL; if( _tco_num >= 0 ) { TrackContentObject * tco = getTCO( _tco_num ); tcos.push_back( tco ); bb_track = BBTrack::findBBTrack( _tco_num ); } else { getTCOsInRange( tcos, _start, _start + static_cast<int>( _frames / frames_per_tick ) ); } // Handle automation: detuning for( NotePlayHandleList::Iterator it = m_processHandles.begin(); it != m_processHandles.end(); ++it ) { ( *it )->processMidiTime( _start ); } if ( tcos.size() == 0 ) { unlock(); return false; } bool played_a_note = false; // will be return variable for( tcoVector::Iterator it = tcos.begin(); it != tcos.end(); ++it ) { Pattern* p = dynamic_cast<Pattern*>( *it ); // everything which is not a pattern or muted won't be played if( p == NULL || ( *it )->isMuted() ) { continue; } MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); } // get all notes from the given pattern... const NoteVector & notes = p->notes(); // ...and set our index to zero NoteVector::ConstIterator nit = notes.begin(); // very effective algorithm for playing notes that are // posated within the current sample-frame if( cur_start > 0 ) { // skip notes which are posated before start-tact while( nit != notes.end() && ( *nit )->pos() < cur_start ) { ++nit; } } Note * cur_note; while( nit != notes.end() && ( cur_note = *nit )->pos() == cur_start ) { if( cur_note->length() != 0 ) { const f_cnt_t note_frames = cur_note->length().frames( frames_per_tick ); NotePlayHandle* notePlayHandle = NotePlayHandleManager::acquire( this, _offset, note_frames, *cur_note ); notePlayHandle->setBBTrack( bb_track ); // are we playing global song? if( _tco_num < 0 ) { // then set song-global offset of pattern in order to // properly perform the note detuning notePlayHandle->setSongGlobalParentOffset( p->startPosition() ); } Engine::mixer()->addPlayHandle( notePlayHandle ); played_a_note = true; } ++nit; } } unlock(); return played_a_note; }
bool SampleTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { m_audioPort.effects()->startRunning(); bool played_a_note = false; // will be return variable tcoVector tcos; ::BBTrack * bb_track = NULL; if( _tco_num >= 0 ) { if( _start != 0 ) { return false; } tcos.push_back( getTCO( _tco_num ) ); if (trackContainer() == (TrackContainer*)Engine::getBBTrackContainer()) { bb_track = BBTrack::findBBTrack( _tco_num ); } } else { for( int i = 0; i < numOfTCOs(); ++i ) { TrackContentObject * tco = getTCO( i ); SampleTCO * sTco = dynamic_cast<SampleTCO*>( tco ); float framesPerTick = Engine::framesPerTick(); if( _start >= sTco->startPosition() && _start < sTco->endPosition() ) { if( sTco->isPlaying() == false && _start > sTco->startPosition() + sTco->startTimeOffset() ) { f_cnt_t sampleStart = framesPerTick * ( _start - sTco->startPosition() - sTco->startTimeOffset() ); f_cnt_t tcoFrameLength = framesPerTick * ( sTco->endPosition() - sTco->startPosition() - sTco->startTimeOffset() ); f_cnt_t sampleBufferLength = sTco->sampleBuffer()->frames(); //if the Tco smaller than the sample length we play only until Tco end //else we play the sample to the end but nothing more f_cnt_t samplePlayLength = tcoFrameLength > sampleBufferLength ? sampleBufferLength : tcoFrameLength; //we only play within the sampleBuffer limits if( sampleStart < sampleBufferLength ) { sTco->setSampleStartFrame( sampleStart ); sTco->setSamplePlayLength( samplePlayLength ); tcos.push_back( sTco ); sTco->setIsPlaying( true ); } } } else { sTco->setIsPlaying( false ); } } } for( tcoVector::Iterator it = tcos.begin(); it != tcos.end(); ++it ) { SampleTCO * st = dynamic_cast<SampleTCO *>( *it ); if( !st->isMuted() ) { PlayHandle* handle; if( st->isRecord() ) { if( !Engine::getSong()->isRecording() ) { return played_a_note; } SampleRecordHandle* smpHandle = new SampleRecordHandle( st ); handle = smpHandle; } else { SamplePlayHandle* smpHandle = new SamplePlayHandle( st ); smpHandle->setVolumeModel( &m_volumeModel ); smpHandle->setBBTrack( bb_track ); handle = smpHandle; } handle->setOffset( _offset ); // send it to the mixer Engine::mixer()->addPlayHandle( handle ); played_a_note = true; } } return played_a_note; }