From 48c8bce9c664f7bbf5753b74ab5639e047593a0d Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Wed, 27 Aug 2008 09:01:03 +0000 Subject: [PATCH] Improved triplet support in piano roll git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1505 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 13 +++- data/themes/default/note_tripleteighth.png | Bin 0 -> 1240 bytes data/themes/default/note_triplethalf.png | Bin 0 -> 1037 bytes data/themes/default/note_tripletquarter.png | Bin 0 -> 1012 bytes data/themes/default/note_tripletsixteenth.png | Bin 0 -> 1122 bytes .../default/note_tripletthirtysecond.png | Bin 0 -> 1399 bytes plugins/midi_import/midi_import.cpp | 5 +- src/gui/piano_roll.cpp | 62 +++++++++++++++--- 8 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 data/themes/default/note_tripleteighth.png create mode 100644 data/themes/default/note_triplethalf.png create mode 100644 data/themes/default/note_tripletquarter.png create mode 100644 data/themes/default/note_tripletsixteenth.png create mode 100644 data/themes/default/note_tripletthirtysecond.png diff --git a/ChangeLog b/ChangeLog index 1d12c3e49..8b504bcbd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,7 +2,18 @@ * include/controller_view.h: * src/gui/widgets/controller_view.cpp: Add stub for controller help - + + * src/gui/piano_roll.cpp: + * data/themes/default/note_triplethalf.png: + * data/themes/default/note_tripleteighth.png: + * data/themes/default/note_tripletthirtysecond.png: + * data/themes/default/note_tripletquarter.png: + * data/themes/default/note_tripletsixteenth.png: + - Add support for directly entering triplet notes + - Add support for triplet Quantization + - Switch grid layout for triplets + - Add additional 32nd note grid resolution when zooming + 2008-08-26 Tobias Doerffel * cmake/modules/DetectMachine.cmake: diff --git a/data/themes/default/note_tripleteighth.png b/data/themes/default/note_tripleteighth.png new file mode 100644 index 0000000000000000000000000000000000000000..b33cd4fb628b19078367412a9298b44c9963c45d GIT binary patch literal 1240 zcmV;}1Sk86P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOQ3 z0wEgrsFz9r00dY`L_t(Y$EDRvOdNF_!13?Q&hE_a&MuHrSp-% zVzHRkR%2qKO^o$m6YB{d7mZdACVFWTn+9z>>Pe$b8Vyxwq0qWZ3$#E1*)4RJg?-FE zW_CRA2yJN^a4wVlfB$@bkL3UV!~Nfm+6R`{x*aMi7vk1s;`LNiJ_#s*xHKd_s9{}Z ztsa;Ix~>@a#YC#KgThYp90)Z)0bp4OS{5s?DHdj98WSNMFz*3&7M>6)bH@nIwgXup zw`7li=qNn;<;(Bh3{URL3?+i(^Rb0J;-e}6U?6qztrIPE1us^AkJY*ZD4Oq70N`$- zBQhMzwY7b{wd#Y~AMvhv9e50oEsv@I5D+ZM%4aLz{^b4Rk9P=zO|g;mEHm23d^dTL zS|;hY?62HaQgXPl$)4L{>>Hejt~W#4HOv16(DO+k7k7yp#|kHQocrSERQdK&>&`bf z`vz{^**iCiq?TPRkh?z90mMz!W>fd52g2WsTpc+5Pq2S*T&{Z0TfI2zxJ%r$8er;D zqLit0FKfhUV;!#=q5P~llsvEBNc?&?q!lbCFkP}s-R*2yF|ft{Ov%4Rw-dutH;g)a zv*jtN%DABYiEeg#Meogpb6^Tm?rLN_lCo4QG8w%?`ziF<^-l-dExR0hJRWa7!GxBI zWbRrH%Ii@qdEiFHQ1NL;%;A(IOu%V$8huu;Wa4-Ffc(VJt@gzP=B3!E7R^qr6!7*b z4dHO;CXmD;3<@SO3Z!blt?PPrF#(X(FByTA0>MC_SJ!hrKuEZ*eW#BYR_j(<1(L89 zur0kR3?yM-r2r5ECV**kC_ZG(*``GoA|{1^eQAO`!PJ?R0`uMH00YP*uBAGJ4Wb83 z58x01T3b)ejpnR1uF9!h9;*|lWIgtA!Q=AsuHKnyc(Lx8V`Tw#&G!ix! zkoy5Z;W@R8{r2M=c7BCBzsY!(g3IL&)YfhDJOt$CYBJ-!%38?e$c^ZfV>Hh%3wGDLutcP&`0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOQ3 z0u~-%!t-YU00WIlL_t(Y$F0^|Oj~sv!13=nJ?&}B=_%AA?FP8DiyGfejETu&qFEvi>bSTmmj;nBq`*pHr8&Kvn-6QD zc*|P+y_|>t@BjJze*ff`9H=&)>~;Rji2#VD@Ba*pM28p&y^kQC0KBC<033esq z0$uVOENZvGHUSf`5AI3z=ekECAEk2HpuMWy1~kCnpwfd5#u3C2;Hm5Y5J*^c-Tm!v zi~WK3fYwsZ;UqiRc&M&PZ)pxkfDXW4HpJrsfX&9eRAS}#1!q{k5R5i<0QKe95swR$ zLSLWVnvl9B(vmR*JX(GU@whaPxE!mP-Ed@Cr58|>(tUP?A|(Q_*HYWsM^ z6_E{R(VWOkdJ9bkcSCE6+wFNw0vP}4oqETx?@iNVwy`l`0%Th(qBpYxCA27G|oqQ!{FhZ*)7Aa`^LV zX5yQP*~M&j8(0t;pAU^?``qv5Tn-L_U{Rg+d>{XAa#~f@<=*qXO@9Tl4}e8r0Wf4) zZYdNBCjl35ANT`U6C#mlXRIswth-%)trh^-0rC|;0Y~CbUL0r#KNT^z00000NkvXX Hu0mjf#r5Bo literal 0 HcmV?d00001 diff --git a/data/themes/default/note_tripletquarter.png b/data/themes/default/note_tripletquarter.png new file mode 100644 index 0000000000000000000000000000000000000000..032549b9c768affcf476a7f7d1826ce44290ec4e GIT binary patch literal 1012 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOQ3 z0yz$EY1?i900VSML_t(Y$F0`SQyXO%!13>HHtZ(Z1cG3b5>P@y3XLPfICyG@dJ*UW zG~?8Eym--rp7dPxRz zDbpeNUiR=l@8@}*clMcGIP7|9*m}T@0Eo5c{|rR>CWv@GM-Yz#_F5bOmVLmzl<`Dh zP=1%cv|C{6fDV{D=cKlwaK!)B{X)LOT+wa;8c<~?({=^Z2%-nDHC6x!Bn(G*wEshK zwEa_{rxvr@NhUw*aU833`@DW21hm!-@u&b`a&Pl~;_mXFRdGs z12QLE%8>zpGozETIr}hK$d)%PZ^&U3%W=TguLO1yGz|daiNQVts8nb5xV1+z2{}#z z?TLl?>P~`Y0YLcnn=dPXjwB=mlZUiQexM!L?Eok@1JuqNfG#W+zOSz6R_lu`-AF|A%&67!W;RdH{Q40+YXU z|2zq}c=0=DEoL78NPCJ%RDLaW6a`nnI}Er*fTsc3Oxmm?{{;YrQ)(BJwhuV(_yU(P zWUiZLa6B{u_#}X0A#dyfE>thL0^Z@rOR1j$t&CToc1x@ZQ+LnG0p zl#kQ4=L2u`PoE!u-KE)cT*_S`n<}!JPO6GxdrktFzVT6;Jmr4>U?4R8=Gbd4&7R|O z{s%It0;}ny+R~xCP(EjSCm8YA=k%*2OKapQLRXayUzS(KPM?vOQl|nF{gS|bJ33W5MzMM4kUy6w6>K7V6w zK@yjQrU2!4TRaw>i#naI_=wsQbB3MgHa0gERa3Q@pJr}vXr&c{!tu=j0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOQ3 z0w52AZbIMy00ZJlL_t(Y$EDV9Ox0B!$MN_1{VvG;&mVz{TttSNlA0*O(wV6Xf(L?? z(umOUB)70Rx18p}$|w|8TTh(jY|Zf`*2*~qS#7mhn##XG!w_6Cyv+C~T<+y6_kMc< z?MkuYavq)SY_HGR&iQ`Nf&VuYpppJm?9_aEXr!<20pbB0pwAbv17Shy28x#tvm(_6 zWCAg>h0Fz67=(oJ#FFZp(kiT9Gy*&W!~%wy0ihx~R^#&Wq2tmj&0;>fRB*<=0VD!O zKx3YW35Z&9Dob*2?v#3|lhXdzg!H7Fz-l0JI$%CXJlTmoyRPpQmRN@pYu3uUa!kl@ z3)r7nPWDoi=mYixyLmNEv>5@SA`N~_A|x#s<^27snw51e`a3oU zpmS;Hkn$^GQ}lMAkIunL{|`PkWNxz1@9kEDdIZ--?@V=q-gUPY=lvrsh!resWo47(~Xvy0e-qhn}ZQ!g!$foAgyC#qfLN|?um2qqMOyLvN8ZO z;MD+59Iu&fP65C@QtKI=Ms!2iqvoa?ZL=U&wp#KjT<{a6mRs2M=ZMtF+nc)sNCGSd zfFbv=7Sxy&JriF@Sz!O_`mBuhj-RjU+w2AY*okt?VOIL|J|czOlAImwS39;H{`_F{ zX5$80eQg}ok1gYYnX@f5;Xo?T@prq{bE8XnIl@J$Wt^Po-{_2zLnq69ykH(Y{GeRw z9$t`&vG)a!F5I(bbbZ4%%kAkzS7?6&;==4WNj z$96Je;?#{Z;i}3K-QfL(+VOMr`Ub#n0}(W%jtuCux`wApC^G2TdW2FcOhhyT`Nk6U zq1ibnBp|2+KXjPD6!G{q@%YI1H8*G5Fd1N;Fr105g+)b0 oIl3}zzJ2?)d9DcHpY5yi7tjigOmgX)4FCWD07*qoM6N<$f{rj7M*si- literal 0 HcmV?d00001 diff --git a/data/themes/default/note_tripletthirtysecond.png b/data/themes/default/note_tripletthirtysecond.png new file mode 100644 index 0000000000000000000000000000000000000000..81ab314113705b6249709b0ff5988662062d1441 GIT binary patch literal 1399 zcmV--1&I2IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOQ3 z0|P4n2D@hf00j3*L_t(Y$DP%EOcQ4u2k`IR_2qhPZBd{U1o|S-QjrOr4vh;WTNIfu ziB9KBOf;x5bBivU`@@lKaewZgWq&O3kLkv;>|e9EO-&raP?%%l1bGu%z|!~9(!1WZ z*Y@@YmHC!weUi&Pd7j+o_q*rrd49l?&DrqO5b9S0&Ib82##>NsvI3w1ka%v(4DcEVeNfs*OteMa!aQQU8$b#i zFK{)~R?~WeVNYwDO03IloS2Q+BrpFD(pe6GxDepwklRRSxp@sy#nj22U!OkDFJEnx zH?^;<8lUtxizBf<0P%&T;P@0*Lv4Ermx)=Ilv_PZ!YcdSkQ9vbC~&^x9M=Gnp9Eu=0tA0SKa8k%^b_hw?-C zF-=@P5l@Os6SYF=rQ=tl;bfF_o^TY*b_K-f?b)9Hen*eMi))n!d|JOQUj!D0(Ke|n z<i4D;`?b}{EAi<^cOH>tn3hBhZ_XD%NW4^uRXi2|c1^>QS81Dkijlo2Qc_r1!H#(^Q_V}7IXa;#D=j8gA9Pr!x_mL*iC%pC z>`0TIrL~3a8}>EoUlSCO_KI?MZ-Aiyprhj~y1Rb{ z=2E<@MR$Nza!griG10hxmDSbli4jAw|3%>EyFpQj>~`r*?eFTDXqV@z?`mk0D5uR- zN5@(1nKMTg52$2`tdTXauZ$nPGZcx%)0KzH%3ZzwXCpnKS(u1ASYd>W(xQs2tJ6C4 z-ahv)m=~`R(PWoQ;Mpty;^B6X#!}s>z2si4UZ3)vAHNXl2`qc3SbPYXBg#K!yS&dSM-C5kA(d1F#H$LWYgX&gz{;%?l%v zgk=TA5XM5tmK8iwS{A-y;eY@-rU(F#0U%|lQfl%-G7^%mc~lP4_kAsbh1bXdf&e%H zHFE_SRUb3-_szcs0R#aEGIET_3#pFiGxQDB@c7{9fFn_R*|5g&dMF&0YZ977|KsetModel( &m_zoomingModel ); m_zoomingComboBox->setFixedSize( 80, 22 ); - // setup quantize-stuff QLabel * quantize_lbl = new QLabel( m_toolBar ); quantize_lbl->setPixmap( embed::getIconPixmap( "quantize" ) ); - for( int i = 0; i < 7; ++i ) + for( int i = 0; i <= NUM_EVEN_LENGTHS; ++i ) { m_quantizeModel.addItem( "1/" + QString::number( 1 << i ) ); } + for( int i = 0; i < NUM_TRIPLET_LENGTHS; ++i ) + { + m_quantizeModel.addItem( "1/" + QString::number( (1 << i) * 3 ) ); + } m_quantizeModel.addItem( "1/192" ); m_quantizeModel.setValue( m_quantizeModel.findText( "1/16" ) ); m_quantizeComboBox = new comboBox( m_toolBar ); @@ -389,13 +397,20 @@ pianoRoll::pianoRoll( void ) : m_noteLenModel.addItem( tr( "Last note" ), new pixmapLoader( "edit_draw" ) ); const QString pixmaps[] = { "whole", "half", "quarter", "eighth", - "sixteenth", "thirtysecond" } ; - for( int i = 0; i < 6; ++i ) + "sixteenth", "thirtysecond", "triplethalf", + "tripletquarter", "tripleteighth", + "tripletsixteenth", "tripletthirtysecond" } ; + + for( int i = 0; i < NUM_EVEN_LENGTHS; ++i ) { m_noteLenModel.addItem( "1/" + QString::number( 1 << i ), new pixmapLoader( "note_" + pixmaps[i] ) ); } - m_noteLenModel.addItem( "1/192" ); + for( int i = 0; i < NUM_TRIPLET_LENGTHS; ++i ) + { + m_noteLenModel.addItem( "1/" + QString::number( (1 << i) * 3 ), + new pixmapLoader( "note_" + pixmaps[i+NUM_EVEN_LENGTHS] ) ); + } m_noteLenModel.setValue( 0 ); m_noteLenComboBox = new comboBox( m_toolBar ); m_noteLenComboBox->setModel( &m_noteLenModel ); @@ -1850,19 +1865,36 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) height() - PR_TOP_MARGIN - PR_BOTTOM_MARGIN ); // draw vertical raster - int tact_16th = m_currentPosition / DefaultBeatsPerTact; - const int offset = ( m_currentPosition % DefaultBeatsPerTact ) * - m_ppt / midiTime::ticksPerTact(); + bool triplets = m_quantizeModel.value() > NUM_EVEN_LENGTHS; + int tact_16th = m_currentPosition / (triplets?8:DefaultBeatsPerTact); + + // TODO: FIX OFFSET + //int spt = 2 * midiTime::stepsPerTact(); + int spt = midiTime::stepsPerTact(); + + float pp16th = m_ppt / spt; + + if ( triplets ) { + spt = static_cast(1.5 * spt); + pp16th *= 2.0/3.0; + } + + printf("%d %d\n", (m_currentPosition% DefaultBeatsPerTact ), DefaultBeatsPerTact); + + const int offset = ( m_currentPosition % (triplets?8:DefaultBeatsPerTact) ) * + m_ppt * (triplets?3.0/3.0:1.0) / midiTime::ticksPerTact(); + + bool show32nds = ( m_zoomingModel.value() > 3 ); // we need float here as odd time signatures might produce rounding // errors else and thus an unusable grid for( float x = WHITE_KEY_WIDTH - offset; x < width(); - x += (float) m_ppt / midiTime::stepsPerTact(), ++tact_16th ) + x += pp16th, ++tact_16th ) { if( x >= WHITE_KEY_WIDTH ) { // every tact-start needs to be a bright line - if( tact_16th % midiTime::stepsPerTact() == 0 ) + if( tact_16th % spt == 0 ) { p.setPen( QColor( 0x7F, 0x7F, 0x7F ) ); } @@ -1876,8 +1908,18 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) { p.setPen( QColor( 0x3F, 0x3F, 0x3F ) ); } + p.drawLine( (int)x, PR_TOP_MARGIN, (int)x, height() - PR_BOTTOM_MARGIN ); + + // extra 32nd's line + if( show32nds ) + { + p.setPen( QColor( 0x22, 0x22, 0x22 ) ); + p.drawLine( (int)(x + pp16th/2) , PR_TOP_MARGIN, + (int)(x + pp16th/2), height() - + PR_BOTTOM_MARGIN ); + } } }