Changeset 535
- Timestamp:
- 09/29/08 07:35:16 (2 months ago)
- Files:
-
- branches/jackMidi/Sconstruct (modified) (2 diffs)
- branches/jackMidi/gui/src/MainForm.cpp (modified) (2 diffs)
- branches/jackMidi/gui/src/PreferencesDialog.cpp (modified) (4 diffs)
- branches/jackMidi/gui/src/PreferencesDialog.h (modified) (1 diff)
- branches/jackMidi/gui/src/UI/PreferencesDialog_UI.ui (modified) (14 diffs)
- branches/jackMidi/libs/hydrogen/include/hydrogen/IO/JackOutput.h (modified) (2 diffs)
- branches/jackMidi/libs/hydrogen/include/hydrogen/Preferences.h (modified) (2 diffs)
- branches/jackMidi/libs/hydrogen/include/hydrogen/hydrogen.h (modified) (1 diff)
- branches/jackMidi/libs/hydrogen/src/IO/jack_output.cpp (modified) (6 diffs)
- branches/jackMidi/libs/hydrogen/src/hydrogen.cpp (modified) (6 diffs)
- branches/jackMidi/libs/hydrogen/src/preferences.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/jackMidi/Sconstruct
r534 r535 162 162 env.EnableQt4Modules( ['QtCore', 'QtGui'], debug=False) 163 163 env.CacheDir( "scons_cache" ) 164 env.Decider( "MD5-timestamp" ) 164 165 165 166 if jack: … … 195 196 # 196 197 env.CacheDir( "scons_cache" ) 198 env.Decider( "MD5-timestamp" ) 197 199 198 200 # rcc needs a -name flag because examples use identified resource files branches/jackMidi/gui/src/MainForm.cpp
r534 r535 158 158 #endif 159 159 160 160 161 //playlist display timer 161 162 QTimer *playlistDisplayTimer = new QTimer(this); … … 163 164 playlistDisplayTimer->start(15000); // update player control at 164 165 // ~ playlist display timer 166 167 //beatcouter 168 Hydrogen::get_instance()->setBcOffsetAdjust(); 165 169 166 170 } branches/jackMidi/gui/src/PreferencesDialog.cpp
r402 r535 132 132 connectDefaultsCheckBox->setChecked( pPref->m_bJackConnectDefaults ); 133 133 trackOutputComboBox->setCurrentIndex( pPref->m_nJackTrackOutputMode ); 134 manualTransportOffsetSpinBox->setValue( pPref->m_nJackManualTransportOffset ); 134 135 //~ JACK 135 136 … … 243 244 useLashCheckbox->setChecked( pPref->m_bsetLash ); 244 245 246 sBcountOffset->setValue( pPref->m_countOffset ); 247 sBstartOffset->setValue( pPref->m_startOffset ); 248 245 249 m_bNeedDriverRestart = false; 246 250 } … … 394 398 pPref->m_bsetLash = false ; //if m_bsetlash = true, when the pref. Dialog closed lash would be activatet this case we dont want 395 399 } 400 401 pPref->m_countOffset = sBcountOffset->value(); 402 pPref->m_startOffset = sBstartOffset->value(); 403 Hydrogen::get_instance()->setBcOffsetAdjust(); 396 404 397 405 pPref->savePreferences(); … … 693 701 QMessageBox::information ( this, "Hydrogen", trUtf8 ( "Please restart hydrogen to enable/disable LASH support" ) ); 694 702 } 703 704 void PreferencesDialog::on_manualTransportOffsetSpinBox_valueChanged( int value ) 705 { 706 Preferences::getInstance()->m_nJackManualTransportOffset = value; 707 } branches/jackMidi/gui/src/PreferencesDialog.h
r402 r535 53 53 void on_useLashCheckbox_clicked(); 54 54 void on_m_pMidiDriverComboBox_currentIndexChanged( const QString& text ); 55 void on_manualTransportOffsetSpinBox_valueChanged( int i ); 55 56 56 57 private: branches/jackMidi/gui/src/UI/PreferencesDialog_UI.ui
r402 r535 26 26 <number>6</number> 27 27 </property> 28 <property name="leftMargin" > 29 <number>0</number> 30 </property> 31 <property name="topMargin" > 32 <number>0</number> 33 </property> 34 <property name="rightMargin" > 35 <number>0</number> 36 </property> 37 <property name="bottomMargin" > 28 <property name="margin" > 38 29 <number>0</number> 39 30 </property> … … 46 37 <enum>QSizePolicy::Expanding</enum> 47 38 </property> 48 <property name="sizeHint" >39 <property name="sizeHint" stdset="0" > 49 40 <size> 50 41 <width>184</width> … … 112 103 <enum>QSizePolicy::Expanding</enum> 113 104 </property> 114 <property name="sizeHint" >105 <property name="sizeHint" stdset="0" > 115 106 <size> 116 107 <width>183</width> … … 137 128 </sizepolicy> 138 129 </property> 130 <property name="toolTip" > 131 <string/> 132 </property> 139 133 <property name="tabShape" > 140 134 <enum>QTabWidget::Rounded</enum> 141 135 </property> 142 136 <property name="currentIndex" > 143 <number> 1</number>137 <number>0</number> 144 138 </property> 145 139 <widget class="QWidget" name="tab_1" > 140 <property name="geometry" > 141 <rect> 142 <x>0</x> 143 <y>0</y> 144 <width>537</width> 145 <height>355</height> 146 </rect> 147 </property> 146 148 <attribute name="title" > 147 149 <string>&General</string> … … 182 184 </property> 183 185 </widget> 186 <widget class="QSpinBox" name="sBcountOffset" > 187 <property name="geometry" > 188 <rect> 189 <x>11</x> 190 <y>91</y> 191 <width>52</width> 192 <height>21</height> 193 </rect> 194 </property> 195 <property name="toolTip" > 196 <string>first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm</string> 197 </property> 198 <property name="minimum" > 199 <number>-200</number> 200 </property> 201 <property name="maximum" > 202 <number>200</number> 203 </property> 204 </widget> 205 <widget class="QLabel" name="bClabel_2" > 206 <property name="geometry" > 207 <rect> 208 <x>70</x> 209 <y>91</y> 210 <width>331</width> 211 <height>21</height> 212 </rect> 213 </property> 214 <property name="text" > 215 <string>Beat counter drift compensation in 1/10 ms </string> 216 </property> 217 </widget> 218 <widget class="QSpinBox" name="sBstartOffset" > 219 <property name="geometry" > 220 <rect> 221 <x>11</x> 222 <y>121</y> 223 <width>52</width> 224 <height>21</height> 225 </rect> 226 </property> 227 <property name="toolTip" > 228 <string>second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup </string> 229 </property> 230 <property name="minimum" > 231 <number>-500</number> 232 </property> 233 <property name="maximum" > 234 <number>500</number> 235 </property> 236 </widget> 237 <widget class="QLabel" name="label" > 238 <property name="geometry" > 239 <rect> 240 <x>70</x> 241 <y>121</y> 242 <width>261</width> 243 <height>21</height> 244 </rect> 245 </property> 246 <property name="text" > 247 <string>Beat counter start offset in ms </string> 248 </property> 249 </widget> 184 250 </widget> 185 251 <widget class="QWidget" name="tab_2" > 252 <property name="geometry" > 253 <rect> 254 <x>0</x> 255 <y>0</y> 256 <width>537</width> 257 <height>355</height> 258 </rect> 259 </property> 186 260 <attribute name="title" > 187 261 <string>Audio &System</string> … … 220 294 </property> 221 295 <layout class="QGridLayout" > 222 <property name=" leftMargin" >296 <property name="margin" > 223 297 <number>0</number> 224 298 </property> 225 <property name="topMargin" > 226 <number>0</number> 227 </property> 228 <property name="rightMargin" > 229 <number>0</number> 230 </property> 231 <property name="bottomMargin" > 232 <number>0</number> 233 </property> 234 <property name="horizontalSpacing" > 235 <number>6</number> 236 </property> 237 <property name="verticalSpacing" > 299 <property name="spacing" > 238 300 <number>6</number> 239 301 </property> … … 366 428 <rect> 367 429 <x>10</x> 368 <y>2 80</y>430 <y>240</y> 369 431 <width>291</width> 370 <height> 58</height>432 <height>79</height> 371 433 </rect> 372 434 </property> 373 435 <layout class="QGridLayout" > 374 <property name=" leftMargin" >436 <property name="margin" > 375 437 <number>0</number> 376 438 </property> 377 <property name="topMargin" > 378 <number>0</number> 379 </property> 380 <property name="rightMargin" > 381 <number>0</number> 382 </property> 383 <property name="bottomMargin" > 384 <number>0</number> 385 </property> 386 <property name="horizontalSpacing" > 387 <number>6</number> 388 </property> 389 <property name="verticalSpacing" > 439 <property name="spacing" > 390 440 <number>6</number> 391 441 </property> … … 445 495 </widget> 446 496 </item> 497 <item row="2" column="0" > 498 <widget class="QLabel" name="manualTransportOffsetLabel" > 499 <property name="text" > 500 <string>Manual Transport Offset</string> 501 </property> 502 </widget> 503 </item> 504 <item row="2" column="1" > 505 <widget class="QSpinBox" name="manualTransportOffsetSpinBox" > 506 <property name="minimum" > 507 <number>-10</number> 508 </property> 509 <property name="maximum" > 510 <number>10</number> 511 </property> 512 </widget> 513 </item> 447 514 </layout> 448 515 </widget> … … 481 548 <y>190</y> 482 549 <width>291</width> 483 <height> 52</height>550 <height>41</height> 484 551 </rect> 485 552 </property> 486 553 <layout class="QVBoxLayout" > 554 <property name="spacing" > 555 <number>-1</number> 556 </property> 487 557 <item> 488 558 <widget class="QCheckBox" name="connectDefaultsCheckBox" > … … 509 579 </widget> 510 580 <widget class="QWidget" name="tab_3" > 581 <property name="geometry" > 582 <rect> 583 <x>0</x> 584 <y>0</y> 585 <width>537</width> 586 <height>355</height> 587 </rect> 588 </property> 511 589 <attribute name="title" > 512 590 <string>&Midi System</string> … … 522 600 </property> 523 601 <layout class="QGridLayout" > 524 <property name=" leftMargin" >602 <property name="margin" > 525 603 <number>0</number> 526 604 </property> 527 <property name="topMargin" > 528 <number>0</number> 529 </property> 530 <property name="rightMargin" > 531 <number>0</number> 532 </property> 533 <property name="bottomMargin" > 534 <number>0</number> 535 </property> 536 <property name="horizontalSpacing" > 537 <number>6</number> 538 </property> 539 <property name="verticalSpacing" > 605 <property name="spacing" > 540 606 <number>6</number> 541 607 </property> … … 695 761 </widget> 696 762 <widget class="QWidget" name="tab_4" > 763 <property name="geometry" > 764 <rect> 765 <x>0</x> 766 <y>0</y> 767 <width>537</width> 768 <height>355</height> 769 </rect> 770 </property> 697 771 <attribute name="title" > 698 772 <string>&Appearance</string> … … 721 795 </property> 722 796 <layout class="QGridLayout" > 723 <property name=" leftMargin" >797 <property name="margin" > 724 798 <number>0</number> 725 799 </property> 726 <property name="topMargin" > 727 <number>0</number> 728 </property> 729 <property name="rightMargin" > 730 <number>0</number> 731 </property> 732 <property name="bottomMargin" > 733 <number>0</number> 734 </property> 735 <property name="horizontalSpacing" > 736 <number>6</number> 737 </property> 738 <property name="verticalSpacing" > 800 <property name="spacing" > 739 801 <number>6</number> 740 802 </property> … … 793 855 </property> 794 856 <layout class="QGridLayout" > 795 <property name=" leftMargin" >857 <property name="margin" > 796 858 <number>0</number> 797 859 </property> 798 <property name="topMargin" > 799 <number>0</number> 800 </property> 801 <property name="rightMargin" > 802 <number>0</number> 803 </property> 804 <property name="bottomMargin" > 805 <number>0</number> 806 </property> 807 <property name="horizontalSpacing" > 808 <number>6</number> 809 </property> 810 <property name="verticalSpacing" > 860 <property name="spacing" > 811 861 <number>6</number> 812 862 </property> branches/jackMidi/libs/hydrogen/include/hydrogen/IO/JackOutput.h
r397 r535 57 57 void disconnect(); 58 58 void deactivate(); 59 // Workaround for buggy transports. Offsets the transport frame 60 // by the returned amount. 61 int getManualTransportAdjustment(); 59 62 unsigned getBufferSize(); 60 63 unsigned getSampleRate(); … … 113 116 int new_pos); 114 117 //~ jack timebase callback 115 116 118 private: 117 119 H2Core::Hydrogen *m_pEngine; branches/jackMidi/libs/hydrogen/include/hydrogen/Preferences.h
r398 r535 155 155 bool m_bbc; 156 156 bool m_mmcsetplay; 157 158 int m_countOffset; 159 int m_startOffset; 157 160 //~ beatcounter 158 161 … … 187 190 bool m_bJackTrackOuts; 188 191 int m_nJackTrackOutputMode; 192 int m_nJackManualTransportOffset; // +/- buffer size 189 193 //jack time master 190 194 bool m_bJackMasterMode ; branches/jackMidi/libs/hydrogen/include/hydrogen/hydrogen.h
r534 r535 183 183 int getBcStatus(); 184 184 void handleBeatCounter(); 185 void setBcOffsetAdjust(); 185 186 186 187 /// jack time master branches/jackMidi/libs/hydrogen/src/IO/jack_output.cpp
r532 r535 185 185 } 186 186 187 188 189 190 187 unsigned JackOutput::getBufferSize() 191 188 { … … 193 190 } 194 191 195 192 int JackOutput::getManualTransportAdjustment() 193 { 194 int rv = getBufferSize() 195 * Preferences::getInstance()->m_nJackManualTransportOffset; 196 return rv; 197 } 196 198 197 199 unsigned JackOutput::getSampleRate() … … 219 221 //wolke if hydrogen is jack time master this is not relevant 220 222 if( Preferences::getInstance()->m_bJackMasterMode == Preferences::USE_JACK_TIME_MASTER && m_transport.m_status != TransportInfo::ROLLING) { 221 m_transport.m_nFrames = Hydrogen::get_instance()->getHumantimeFrames() - get BufferSize();223 m_transport.m_nFrames = Hydrogen::get_instance()->getHumantimeFrames() - getManualTransportAdjustment(); 222 224 WARNINGLOG( "Relocate: Call it off" ); 223 225 calculateFrameOffset(); … … 347 349 //this perform Jakobs mod in pattern mode, but both m_transport.m_nFrames works with the same result in pattern Mode 348 350 // in songmode the first case dont work. 349 //so we can remove this "if query" and only use this old mod: m_transport.m_nFrames = H->getHumantimeFrames() - get BufferSize();351 //so we can remove this "if query" and only use this old mod: m_transport.m_nFrames = H->getHumantimeFrames() - getManualTransportAdjustment(); 350 352 //because to get the songmode we have to add this "H2Core::Hydrogen *m_pEngine" to the header file 351 353 //if we remove this we also can remove *m_pEngine from header … … 355 357 else 356 358 { 357 m_transport.m_nFrames = H->getHumantimeFrames() - get BufferSize();359 m_transport.m_nFrames = H->getHumantimeFrames() - getManualTransportAdjustment(); 358 360 } 359 361 // In jack 'slave' mode, if there's no master, the following line is needed to be able to relocate by clicking the song ruler (wierd corner case, but still...) … … 363 365 ///this is experimantal... but it works for the moment... fix me fix :-) wolke 364 366 // ... will this actually happen? keeping it for now ( jakob lund ) 365 m_transport.m_nFrames = H->getHumantimeFrames() - get BufferSize();367 m_transport.m_nFrames = H->getHumantimeFrames() - getManualTransportAdjustment(); 366 368 } 367 369 } branches/jackMidi/libs/hydrogen/src/hydrogen.cpp
r534 r535 87 87 88 88 //100,000 ms in 1 second. 89 #define MS_DIVIDER .00000189 #define US_DIVIDER .000001 90 90 91 91 float m_ntaktoMeterCompute = 1; ///< beatcounter note lenght … … 98 98 double lastBeatTime, currentBeatTime, beatDiff; ///< timediff 99 99 float beatCountBpm; ///< bpm 100 int m_nCoutOffset = 0; ///ms default 0 101 int m_nStartOffset = 0; ///ms default 0 100 102 //~ beatcounter 101 103 … … 1679 1681 void Hydrogen::sequencer_play() 1680 1682 { 1681 // play from start if pattern mode is enabled1682 if ( m_pSong->get_mode() == Song::PATTERN_MODE ) {1683 setPatternPos( 0 );1684 }1685 1683 m_pAudioDriver->play(); 1686 1684 } … … 2498 2496 2499 2497 2498 void Hydrogen::setBcOffsetAdjust() 2499 { 2500 //individual fine tuning for the beatcounter 2501 //to adjust ms_offset from different people and controller 2502 Preferences *pref = Preferences::getInstance(); 2503 2504 m_nCoutOffset = pref->m_countOffset; 2505 m_nStartOffset = pref->m_startOffset; 2506 } 2507 2500 2508 2501 2509 void Hydrogen::handleBeatCounter() 2502 { 2510 { 2511 2503 2512 // Get first time value: 2504 2513 if (beatCount == 1) … … 2515 2524 2516 2525 // Build doubled time difference: 2517 lastBeatTime = (double)(lastTime.tv_sec + (double)(lastTime.tv_usec * MS_DIVIDER));2518 currentBeatTime = (double)(currentTime.tv_sec + (double)(currentTime.tv_usec * MS_DIVIDER));2526 lastBeatTime = (double)(lastTime.tv_sec + (double)(lastTime.tv_usec * US_DIVIDER) + (int)m_nCoutOffset * .0001 ); 2527 currentBeatTime = (double)(currentTime.tv_sec + (double)(currentTime.tv_usec * US_DIVIDER) ); 2519 2528 beatDiff = beatCount == 1 ? 0 : currentBeatTime - lastBeatTime; 2520 2529 … … 2556 2565 } 2557 2566 2558 int sleeptime = (float) rtstartframe / (float) bcsamplerate * ( int ) 1000;2567 int sleeptime = (float) rtstartframe / (float) bcsamplerate * (int) 1000 + (int)m_nCoutOffset + (int) m_nStartOffset; 2559 2568 #ifdef WIN32 2560 2569 Sleep( sleeptime ); branches/jackMidi/libs/hydrogen/src/preferences.cpp
r534 r535 340 340 341 341 m_nJackTrackOutputMode = LocalFileMng::readXmlInt( jackDriverNode, "jack_track_output_mode", m_nJackTrackOutputMode ); 342 m_nJackManualTransportOffset = LocalFileMng::readXmlInt( jackDriverNode, "jack_manual_transport_offset", m_nJackManualTransportOffset ); 342 343 } 343 344 … … 432 433 m_mmcsetplay = SET_PLAY_ON; 433 434 } 435 436 m_countOffset = LocalFileMng::readXmlInt( guiNode, "countoffset", 0 ); 437 m_startOffset = LocalFileMng::readXmlInt( guiNode, "playoffset", 0 ); 438 434 439 //~ beatcounter 435 440 … … 673 678 } 674 679 LocalFileMng::writeXmlString( &jackDriverNode, "jack_track_outs", jackTrackOutsString ); 675 680 QString jackManualTransportOffsetString = QString("%1").arg(m_nJackManualTransportOffset); 681 LocalFileMng::writeXmlString( &jackDriverNode, "jack_manual_transport_offset", jackManualTransportOffsetString ); 676 682 } 677 683 audioEngineNode.InsertEndChild( jackDriverNode ); … … 754 760 } 755 761 LocalFileMng::writeXmlString( &guiNode, "setplay", setPlay ); 762 763 LocalFileMng::writeXmlString( &guiNode, "countoffset", to_string(m_countOffset) ); 764 LocalFileMng::writeXmlString( &guiNode, "playoffset", to_string(m_startOffset) ); 756 765 //~ beatcounter 757 766
