233 const auto pSong = pHydrogen->getSong();
234 const auto pTimeline = pHydrogen->getTimeline();
235 const auto pAudioEngine = pHydrogen->getAudioEngine();
236 const auto pAudioDriver = pHydrogen->getAudioOutput();
238 if ( pAudioDriver ==
nullptr ) {
239 ERRORLOG(
"AudioDriver is not ready!" );
245 if ( pSong !=
nullptr ) {
246 nResolution = pSong->getResolution();
251 if ( nSampleRate == 0 ) {
252 nSampleRate = pAudioDriver->getSampleRate();
254 const double fSongSizeInTicks = pAudioEngine->getSongSizeInTicks();
256 if ( nSampleRate == 0 || nResolution == 0 ) {
257 ERRORLOG(
"Not properly initialized yet" );
267 std::vector<std::shared_ptr<const Timeline::TempoMarker>> tempoMarkers;
268 bool bSpecialFirstMarker =
false;
269 if ( pTimeline !=
nullptr ) {
270 tempoMarkers = pTimeline->getAllTempoMarkers();
271 bSpecialFirstMarker = pTimeline->isFirstTempoMarkerSpecial();
275 if ( pSong !=
nullptr ) {
276 nColumns = pSong->getPatternGroupVector()->size();
281 long long nNewFrame = 0;
282 if ( pHydrogen->isTimelineEnabled() &&
283 ! ( tempoMarkers.size() == 1 && bSpecialFirstMarker ) &&
286 double fNewTick = fTick;
287 double fRemainingTicks = fTick;
288 double fNextTick, fPassedTicks = 0;
289 double fNextTickSize;
290 double fNewFrame = 0;
293 auto handleEnd = [&]() {
295 fNewFrame += fRemainingTicks * fNextTickSize;
297 nNewFrame =
static_cast<long long>( std::round( fNewFrame ) );
304 const double fRoundingErrorInTicks =
305 ( fNewFrame -
static_cast<double>( nNewFrame ) ) /
313 if ( fRoundingErrorInTicks >
314 fPassedTicks + fRemainingTicks - fNextTick ) {
317 *fTickMismatch = fRoundingErrorInTicks;
322 *fTickMismatch = fPassedTicks + fRemainingTicks - fNextTick;
324 const double fFinalFrame = fNewFrame +
325 ( fNextTick - fPassedTicks - fRemainingTicks ) * fNextTickSize;
328 double fFinalTickSize;
329 if ( ii < tempoMarkers.size() ) {
331 nSampleRate, tempoMarkers[ ii ]->fBpm, nResolution );
335 nSampleRate, tempoMarkers[ 0 ]->fBpm, nResolution );
338#if TRANSPORT_POSITION_DEBUG
339 TP_DEBUGLOG( QString(
"[::computeFrameFromTick mismatch : 2] fTickMismatch: [%1 + %2], static_cast<double>(nNewFrame): %3, fNewFrame: %4, fFinalFrame: %5, fNextTickSize: %6, fPassedTicks: %7, fRemainingTicks: %8, fFinalTickSize: %9" )
340 .arg( fPassedTicks + fRemainingTicks - fNextTick )
341 .arg( ( fFinalFrame -
static_cast<double>(nNewFrame) ) / fNextTickSize )
343 .arg( fNewFrame, 0,
'f' )
344 .arg( fFinalFrame, 0,
'f' )
345 .arg( fNextTickSize, 0,
'f' )
346 .arg( fPassedTicks, 0,
'f' )
347 .arg( fRemainingTicks, 0,
'f' )
348 .arg( fFinalTickSize, 0,
'f' ));
351 *fTickMismatch += ( fFinalFrame -
static_cast<double>(nNewFrame) ) /
355#if TRANSPORT_POSITION_DEBUG
356 TP_DEBUGLOG( QString(
"[::computeFrameFromTick end] fTick: %1, fNewFrame: %2, fNextTick: %3, fRemainingTicks: %4, fPassedTicks: %5, fNextTickSize: %6, tempoMarkers[ ii - 1 ]->nColumn: %7, tempoMarkers[ ii - 1 ]->fBpm: %8, nNewFrame: %9, fTickMismatch: %10, frame increment (fRemainingTicks * fNextTickSize): %11, fRoundingErrorInTicks: %12" )
357 .arg( fTick, 0,
'f' )
358 .arg( fNewFrame, 0,
'g', 30 )
359 .arg( fNextTick, 0,
'f' )
360 .arg( fRemainingTicks, 0,
'f' )
361 .arg( fPassedTicks, 0,
'f' )
362 .arg( fNextTickSize, 0,
'f' )
363 .arg( tempoMarkers[ ii - 1 ]->nColumn )
364 .arg( tempoMarkers[ ii - 1 ]->fBpm )
366 .arg( *fTickMismatch, 0,
'g', 30 )
367 .arg( fRemainingTicks * fNextTickSize, 0,
'g', 30 )
368 .arg( fRoundingErrorInTicks, 0,
'f' )
372 fRemainingTicks -= fNewTick - fPassedTicks;
375 while ( fRemainingTicks > 0 ) {
377 for ( ii = 1; ii <= tempoMarkers.size(); ++ii ) {
378 if ( ii == tempoMarkers.size() ||
379 tempoMarkers[ ii ]->nColumn >= nColumns ) {
380 fNextTick = fSongSizeInTicks;
383 static_cast<double>(pHydrogen->getTickForColumn( tempoMarkers[ ii ]->nColumn ) );
388 tempoMarkers[ ii - 1 ]->fBpm,
391 if ( fRemainingTicks > ( fNextTick - fPassedTicks ) ) {
394 fNewFrame += ( fNextTick - fPassedTicks ) * fNextTickSize;
396#if TRANSPORT_POSITION_DEBUG
397 TP_DEBUGLOG( QString(
"[segment] fTick: %1, fNewFrame: %2, fNextTick: %3, fRemainingTicks: %4, fPassedTicks: %5, fNextTickSize: %6, tempoMarkers[ ii - 1 ]->nColumn: %7, tempoMarkers[ ii - 1 ]->fBpm: %8, tick increment (fNextTick - fPassedTicks): %9, frame increment (fRemainingTicks * fNextTickSize): %10" )
398 .arg( fTick, 0,
'f' )
399 .arg( fNewFrame, 0,
'g', 30 )
400 .arg( fNextTick, 0,
'f' )
401 .arg( fRemainingTicks, 0,
'f' )
402 .arg( fPassedTicks, 0,
'f' )
403 .arg( fNextTickSize, 0,
'f' )
404 .arg( tempoMarkers[ ii - 1 ]->nColumn )
405 .arg( tempoMarkers[ ii - 1 ]->fBpm )
406 .arg( fNextTick - fPassedTicks, 0,
'f' )
407 .arg( ( fNextTick - fPassedTicks ) * fNextTickSize, 0,
'g', 30 )
411 fRemainingTicks -= fNextTick - fPassedTicks;
413 fPassedTicks = fNextTick;
422 if ( fRemainingTicks > 0 ) {
426 const int nRepetitions = std::floor(fTick / fSongSizeInTicks);
427 const double fSongSizeInFrames = fNewFrame;
429 fNewFrame *=
static_cast<double>(nRepetitions);
430 fNewTick = std::fmod( fTick, fSongSizeInTicks );
431 fRemainingTicks = fNewTick;
434#if TRANSPORT_POSITION_DEBUG
435 TP_DEBUGLOG( QString(
"[repeat] fTick: %1, fNewFrames: %2, fNewTick: %3, fRemainingTicks: %4, nRepetitions: %5, fSongSizeInTicks: %6, fSongSizeInFrames: %7" )
436 .arg( fTick, 0,
'g',30 )
437 .arg( fNewFrame, 0,
'g', 30 )
438 .arg( fNewTick, 0,
'g', 30 )
439 .arg( fRemainingTicks, 0,
'g', 30 )
441 .arg( fSongSizeInTicks, 0,
'g', 30 )
442 .arg( fSongSizeInFrames, 0,
'g', 30 )
446 if ( std::isinf( fNewFrame ) ||
447 static_cast<long long>(fNewFrame) >
448 std::numeric_limits<long long>::max() ) {
449 ERRORLOG( QString(
"Provided ticks [%1] are too large." ).arg( fTick ) );
457 if ( fRemainingTicks == 0 ) {
458 ii = tempoMarkers.size();
459 fNextTick =
static_cast<double>(pHydrogen->getTickForColumn(
460 tempoMarkers[ 0 ]->nColumn ) );
462 nSampleRate, tempoMarkers[ ii - 1 ]->fBpm, nResolution );
478 const double fTickSize =
483 const double fNewFrame =
static_cast<double>(fTick) *
485 nNewFrame =
static_cast<long long>( std::round( fNewFrame ) );
486 *fTickMismatch = ( fNewFrame -
static_cast<double>(nNewFrame ) ) /
489#if TRANSPORT_POSITION_DEBUG
490 TP_DEBUGLOG(QString(
"[no-timeline] nNewFrame: %1, fTick: %2, fTickSize: %3, fTickMismatch: %4" )
491 .arg( nNewFrame ).arg( fTick, 0,
'f' ).arg( fTickSize, 0,
'f' )
492 .arg( *fTickMismatch, 0,
'g', 30 ));
506 ERRORLOG( QString(
"Provided frame [%1] must be non-negative" ).arg( nFrame ) );
509 const auto pSong = pHydrogen->getSong();
510 const auto pTimeline = pHydrogen->getTimeline();
511 const auto pAudioEngine = pHydrogen->getAudioEngine();
512 const auto pAudioDriver = pHydrogen->getAudioOutput();
514 if ( pAudioDriver ==
nullptr ) {
515 ERRORLOG(
"AudioDriver is not ready!" );
519 if ( nSampleRate == 0 ) {
520 nSampleRate = pAudioDriver->getSampleRate();
524 if ( pSong !=
nullptr ) {
525 nResolution = pSong->getResolution();
532 const double fSongSizeInTicks = pAudioEngine->getSongSizeInTicks();
534 if ( nSampleRate == 0 || nResolution == 0 ) {
535 ERRORLOG(
"Not properly initialized yet" );
543 std::vector<std::shared_ptr<const Timeline::TempoMarker>> tempoMarkers;
544 bool bSpecialFirstMarker =
false;
545 if ( pTimeline !=
nullptr ) {
546 tempoMarkers = pTimeline->getAllTempoMarkers();
547 bSpecialFirstMarker = pTimeline->isFirstTempoMarkerSpecial();
551 if ( pSong !=
nullptr ) {
552 nColumns = pSong->getPatternGroupVector()->size();
557 if ( pHydrogen->isTimelineEnabled() &&
558 ! ( tempoMarkers.size() == 1 && bSpecialFirstMarker ) &&
563 const double fTargetFrame =
static_cast<double>(nFrame);
564 double fPassedFrames = 0;
565 double fNextFrame = 0;
566 double fNextTicks, fPassedTicks = 0;
567 double fNextTickSize;
568 long long nRemainingFrames;
570 const int nColumns = pSong->getPatternGroupVector()->size();
572 while ( fPassedFrames < fTargetFrame ) {
574 for (
int ii = 1; ii <= tempoMarkers.size(); ++ii ) {
578 tempoMarkers[ ii - 1 ]->fBpm,
581 if ( ii == tempoMarkers.size() ||
582 tempoMarkers[ ii ]->nColumn >= nColumns ) {
583 fNextTicks = fSongSizeInTicks;
586 static_cast<double>(pHydrogen->getTickForColumn( tempoMarkers[ ii ]->nColumn ));
588 fNextFrame = (fNextTicks - fPassedTicks) * fNextTickSize;
590 if ( fNextFrame < ( fTargetFrame -
593#if TRANSPORT_POSITION_DEBUG
594 TP_DEBUGLOG(QString(
"[segment] nFrame: %1, fTick: %2, nSampleRate: %3, fNextTickSize: %4, fNextTicks: %5, fNextFrame: %6, tempoMarkers[ ii -1 ]->nColumn: %7, tempoMarkers[ ii -1 ]->fBpm: %8, fPassedTicks: %9, fPassedFrames: %10, fNewTick (tick increment): %11, fNewTick * fNextTickSize (frame increment): %12" )
596 .arg( fTick, 0,
'f' )
598 .arg( fNextTickSize, 0,
'f' )
599 .arg( fNextTicks, 0,
'f' )
600 .arg( fNextFrame, 0,
'f' )
601 .arg( tempoMarkers[ ii -1 ]->nColumn )
602 .arg( tempoMarkers[ ii -1 ]->fBpm )
603 .arg( fPassedTicks, 0,
'f' )
604 .arg( fPassedFrames, 0,
'f' )
605 .arg( fNextTicks - fPassedTicks, 0,
'f' )
606 .arg( (fNextTicks - fPassedTicks) * fNextTickSize, 0,
'g', 30 )
612 fTick += fNextTicks - fPassedTicks;
614 fPassedFrames += fNextFrame;
615 fPassedTicks = fNextTicks;
619 const double fNewTick = (fTargetFrame - fPassedFrames ) /
624#if TRANSPORT_POSITION_DEBUG
625 TP_DEBUGLOG(QString(
"[end] nFrame: %1, fTick: %2, nSampleRate: %3, fNextTickSize: %4, fNextTicks: %5, fNextFrame: %6, tempoMarkers[ ii -1 ]->nColumn: %7, tempoMarkers[ ii -1 ]->fBpm: %8, fPassedTicks: %9, fPassedFrames: %10, fNewTick (tick increment): %11, fNewTick * fNextTickSize (frame increment): %12" )
627 .arg( fTick, 0,
'f' )
629 .arg( fNextTickSize, 0,
'f' )
630 .arg( fNextTicks, 0,
'f' )
631 .arg( fNextFrame, 0,
'f' )
632 .arg( tempoMarkers[ ii -1 ]->nColumn )
633 .arg( tempoMarkers[ ii -1 ]->fBpm )
634 .arg( fPassedTicks, 0,
'f' )
635 .arg( fPassedFrames, 0,
'f' )
636 .arg( fNewTick, 0,
'f' )
637 .arg( fNewTick * fNextTickSize, 0,
'g', 30 )
641 fPassedFrames = fTargetFrame;
647 if ( fPassedFrames != fTargetFrame ) {
651 const double fSongSizeInFrames = fPassedFrames;
652 const int nRepetitions = std::floor(fTargetFrame / fSongSizeInFrames);
653 if ( fSongSizeInTicks * nRepetitions >
654 std::numeric_limits<double>::max() ) {
655 ERRORLOG( QString(
"Provided frames [%1] are too large." ).arg( nFrame ) );
658 fTick = fSongSizeInTicks * nRepetitions;
660 fPassedFrames =
static_cast<double>(nRepetitions) *
664#if TRANSPORT_POSITION_DEBUG
665 TP_DEBUGLOG( QString(
"[repeat] frames covered: %1, frames remaining: %2, ticks covered: %3, nRepetitions: %4, fSongSizeInFrames: %5, fSongSizeInTicks: %6" )
666 .arg( fPassedFrames, 0,
'g', 30 )
667 .arg( fTargetFrame - fPassedFrames, 0,
'g', 30 )
668 .arg( fTick, 0,
'g', 30 )
670 .arg( fSongSizeInFrames, 0,
'g', 30 )
671 .arg( fSongSizeInTicks, 0,
'g', 30 )
686 const double fTickSize =
691 fTick =
static_cast<double>(nFrame) / fTickSize;
693#if TRANSPORT_POSITION_DEBUG
694 TP_DEBUGLOG(QString(
"[no timeline] nFrame: %1, sampleRate: %2, tickSize: %3" )
695 .arg( nFrame ).arg( nSampleRate ).arg( fTickSize, 0,
'f' ) );
712 std::shared_ptr<TransportPosition> pRhs ) {
713 if ( ( pLhs->m_pPlayingPatterns !=
nullptr &&
714 pRhs->m_pPlayingPatterns ==
nullptr ) ||
715 ( pLhs->m_pPlayingPatterns ==
nullptr &&
716 pRhs->m_pPlayingPatterns !=
nullptr ) ) {
719 else if ( pLhs->m_pPlayingPatterns !=
nullptr &&
720 pRhs->m_pPlayingPatterns !=
nullptr &&
721 *pLhs->m_pPlayingPatterns != *pRhs->m_pPlayingPatterns ) {
725 if ( ( pLhs->m_pNextPatterns !=
nullptr &&
726 pRhs->m_pNextPatterns ==
nullptr ) ||
727 ( pLhs->m_pNextPatterns ==
nullptr &&
728 pRhs->m_pNextPatterns !=
nullptr ) ) {
731 else if ( pLhs->m_pNextPatterns !=
nullptr &&
732 pRhs->m_pNextPatterns !=
nullptr &&
733 *pLhs->m_pNextPatterns != *pRhs->m_pNextPatterns ) {
738 pLhs->m_nFrame == pRhs->m_nFrame &&
739 std::abs( pLhs->m_fTick - pRhs->m_fTick ) < 1E-5 &&
740 std::abs( pLhs->m_fTickSize - pRhs->m_fTickSize ) < 1E-2 &&
741 std::abs( pLhs->m_fBpm - pRhs->m_fBpm ) < 1E-2 &&
742 pLhs->m_nPatternStartTick == pRhs->m_nPatternStartTick &&
743 pLhs->m_nPatternTickPosition == pRhs->m_nPatternTickPosition &&
744 pLhs->m_nColumn == pRhs->m_nColumn &&
745 std::abs( pLhs->m_fTickMismatch - pRhs->m_fTickMismatch ) < 1E-5 &&
746 pLhs->m_nFrameOffsetTempo == pRhs->m_nFrameOffsetTempo &&
747 std::abs( pLhs->m_fTickOffsetQueuing -
748 pRhs->m_fTickOffsetQueuing ) < 1E-5 &&
749 std::abs( pLhs->m_fTickOffsetSongSize -
750 pRhs->m_fTickOffsetSongSize ) < 1E-5 &&
751 pLhs->m_nPatternSize == pRhs->m_nPatternSize &&
752 pLhs->m_nLastLeadLagFactor == pRhs->m_nLastLeadLagFactor &&
753 pLhs->m_nBar == pRhs->m_nBar &&
754 pLhs->m_nBeat == pRhs->m_nBeat );
758 std::shared_ptr<TransportPosition> pRhs ) {
759 if ( ( pLhs->m_pPlayingPatterns !=
nullptr &&
760 pRhs->m_pPlayingPatterns ==
nullptr ) ||
761 ( pLhs->m_pPlayingPatterns ==
nullptr &&
762 pRhs->m_pPlayingPatterns !=
nullptr ) ) {
765 else if ( pLhs->m_pPlayingPatterns !=
nullptr &&
766 pRhs->m_pPlayingPatterns !=
nullptr &&
767 *pLhs->m_pPlayingPatterns != *pRhs->m_pPlayingPatterns ) {
771 if ( ( pLhs->m_pNextPatterns !=
nullptr &&
772 pRhs->m_pNextPatterns ==
nullptr ) ||
773 ( pLhs->m_pNextPatterns ==
nullptr &&
774 pRhs->m_pNextPatterns !=
nullptr ) ) {
777 else if ( pLhs->m_pNextPatterns !=
nullptr &&
778 pRhs->m_pNextPatterns !=
nullptr &&
779 *pLhs->m_pNextPatterns != *pRhs->m_pNextPatterns ) {
785 pLhs->m_nFrame != pRhs->m_nFrame ||
786 std::abs( pLhs->m_fTick - pRhs->m_fTick ) > 1E-5 ||
787 std::abs( pLhs->m_fTickSize - pRhs->m_fTickSize ) > 1E-2 ||
788 std::abs( pLhs->m_fBpm - pRhs->m_fBpm ) > 1E-2 ||
789 pLhs->m_nPatternStartTick != pRhs->m_nPatternStartTick ||
790 pLhs->m_nPatternTickPosition != pRhs->m_nPatternTickPosition ||
791 pLhs->m_nColumn != pRhs->m_nColumn ||
792 std::abs( pLhs->m_fTickMismatch - pRhs->m_fTickMismatch ) > 1E-5 ||
793 pLhs->m_nFrameOffsetTempo != pRhs->m_nFrameOffsetTempo ||
794 std::abs( pLhs->m_fTickOffsetQueuing -
795 pRhs->m_fTickOffsetQueuing ) > 1E-5 ||
796 std::abs( pLhs->m_fTickOffsetSongSize -
797 pRhs->m_fTickOffsetSongSize ) > 1E-5 ||
798 pLhs->m_nPatternSize != pRhs->m_nPatternSize ||
799 pLhs->m_nLastLeadLagFactor != pRhs->m_nLastLeadLagFactor ||
800 pLhs->m_nBar != pRhs->m_nBar ||
801 pLhs->m_nBeat != pRhs->m_nBeat );
808 sOutput = QString(
"%1[TransportPosition]\n" ).arg( sPrefix )
809 .append( QString(
"%1%2m_sLabel: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_sLabel ) )
810 .append( QString(
"%1%2m_nFrame: %3\n" ).arg( sPrefix ).arg( s ).arg(
getFrame() ) )
811 .append( QString(
"%1%2m_fTick: %3\n" ).arg( sPrefix ).arg( s ).arg(
getDoubleTick(), 0,
'f' ) )
812 .append( QString(
"%1%2m_fTick (rounded): %3\n" ).arg( sPrefix ).arg( s ).arg(
getTick() ) )
813 .append( QString(
"%1%2m_fTickSize: %3\n" ).arg( sPrefix ).arg( s ).arg(
getTickSize(), 0,
'f' ) )
814 .append( QString(
"%1%2m_fBpm: %3\n" ).arg( sPrefix ).arg( s ).arg(
getBpm(), 0,
'f' ) )
815 .append( QString(
"%1%2m_nPatternStartTick: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nPatternStartTick ) )
816 .append( QString(
"%1%2m_nPatternTickPosition: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nPatternTickPosition ) )
817 .append( QString(
"%1%2m_nColumn: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nColumn ) )
818 .append( QString(
"%1%2m_fTickMismatch: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_fTickMismatch, 0,
'f' ) )
819 .append( QString(
"%1%2m_nFrameOffsetTempo: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nFrameOffsetTempo ) )
820 .append( QString(
"%1%2m_fTickOffsetQueuing: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_fTickOffsetQueuing, 0,
'f' ) )
821 .append( QString(
"%1%2m_fTickOffsetSongSize: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_fTickOffsetSongSize, 0,
'f' ) );
823 sOutput.append( QString(
"%1%2m_pPlayingPatterns: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_pPlayingPatterns->toQString( sPrefix + s ), bShort ) );
826 sOutput.append( QString(
"%1%2m_pNextPatterns: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_pNextPatterns->toQString( sPrefix + s ), bShort ) );
828 sOutput.append( QString(
"%1%2m_nPatternSize: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nPatternSize ) )
829 .append( QString(
"%1%2m_nLastLeadLagFactor: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nLastLeadLagFactor ) )
830 .append( QString(
"%1%2m_nBar: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nBar ) )
831 .append( QString(
"%1%2m_nBeat: %3\n" ).arg( sPrefix ).arg( s ).arg(
m_nBeat ) );
834 sOutput = QString(
"%1[TransportPosition]" ).arg( sPrefix )
835 .append( QString(
" m_sLabel: %1" ).arg(
m_sLabel ) )
836 .append( QString(
", m_nFrame: %1" ).arg(
getFrame() ) )
837 .append( QString(
", m_fTick: %1" ).arg(
getDoubleTick(), 0,
'f' ) )
838 .append( QString(
", m_fTick (rounded): %1" ).arg(
getTick() ) )
839 .append( QString(
", m_fTickSize: %1" ).arg(
getTickSize(), 0,
'f' ) )
840 .append( QString(
", m_fBpm: %1" ).arg(
getBpm(), 0,
'f' ) )
843 .append( QString(
", m_nColumn: %1" ).arg(
m_nColumn ) )
844 .append( QString(
", m_fTickMismatch: %1" ).arg(
m_fTickMismatch, 0,
'f' ) )
849 sOutput.append( QString(
", m_pPlayingPatterns: %1" ).arg(
m_pPlayingPatterns->toQString( sPrefix + s ), bShort ) );
852 sOutput.append( QString(
", m_pNextPatterns: %1" ).arg(
m_pNextPatterns->toQString( sPrefix + s ), bShort ) );
854 sOutput.append( QString(
", m_nPatternSize: %1" ).arg(
m_nPatternSize ) )
856 .append( QString(
", m_nBar: %1" ).arg(
m_nBar ) )
857 .append( QString(
", m_nBeat: %1" ).arg(
m_nBeat ) );