From cca58da8944865cd52edd06e32352733a81cc844 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 3 Apr 2016 20:51:17 -0700 Subject: [PATCH 01/12] First notebook entry --- Entry 1 -- April 3.md | 54 ++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/Entry 1 -- April 3.md b/Entry 1 -- April 3.md index 67f8f0a..4fe87ff 100755 --- a/Entry 1 -- April 3.md +++ b/Entry 1 -- April 3.md @@ -2,22 +2,37 @@ ## Last week's critique -**TODO:** Fill in this part with a summary and reflection on the critque you -received for last week's work. Answer questions such as: How, specifically, did -the feedback help improve the project? Did the feedback point out or offer -something you hadn't considered? Did it help you make a design decision? Was it -helpful in addressing the most pressing issues in your project? How will you -incorporate the feedback into your work? Will you change something about the -design, implementation, or evaluation as a result? +I got some great feedback/suggestions from William and Prof Ben about user experience and adding more language-y features. +William's main concern was that my project seems too backend-heavy. I definitely was a bit worried about this since I started the project, so this served as a confirmation that I'll have to come up with some more language-y features. However, he warned against adding things like complex control-structures simply for the sake of having more language to design. This is something I'll be keeping in mind - user experience comes first. +He also suggested that I eventually implement some sort of "beginner" setting where users don't have to write too much code. I kind of liked the sound of this, but wasn't sure exactly what this would look like. +However, Prof Ben then suggested that I eventually implement an alternate UI/GUI-based form of input. This seems like a great idea that would address both of William's suggestions. It's a language-y feature that should be a lot simpler to use for beginners. I'm not yet sure exactly how it will look/work (I'm thinking it'll involve a bunch of sliders and dropdowns), but it's something I'll be thinking about in the coming weeks. ## Description -**TODO:** Fill in this part with information about your work this week: -important design decisions, changes to previous decisions, open questions, -exciting milestones, preliminary results, etc. Feel free to include images -(e.g., a sketch of the design or a screenshot of a running program), links to -code, and any other resources that you think will help clearly convey your -design process. +I was able to make a decent amount of progress this week. Most excitingly, I've linked up all the various technologies/tools and laid out the architecture of the DSL from input to output. The biggest factor that allowed me to get this all done was the simplicity of PEG.js. I thought the parser was going to be a roadblock (it still might, later down the line), but so far it hasn't been. Check out my parser grammar [here](https://github.com/milohan/sheet-music-gen/blob/master/parserGrammar.js) if you're interested. +You can test out what I have so far in terms of the actual DSL by heading over to my [code repo](https://github.com/milohan/sheet-music-gen). Just open up the index.html file with your browser of choice (more detailed instructions can be found in the [readme](https://github.com/milohan/sheet-music-gen/blob/master/README.md). +Below is a work log outlining the tasks I worked on throughout the week. + +Tues +- familiarized myself with PEG.js, abcjs +- implemented logic to generate and render arbitrary number of measures of music + - currently using random pitches, only quarter notes +- started building parser with PEG.js + - now accepts "measures: 12" +- stitched together basic architecture, from input to output + - user input -> parser -> internal logic -> render sheet music + +Wed +- (during class) worked on design + implementation writeup + +Fri +- parsing + logic for measure ranges ("measures: 12-14") +- parsing + logic for keys ("key: A") +- parser now accepts arbitrary number of lines of parameters + +Sunday +- finished design + implementation writeup +- notebook entry ## Questions @@ -25,10 +40,21 @@ design process. you need to make, what implementation issue are you trying to solve, or how are you evaluating your design and implementation?** +The next set of parameters I'm hoping to tackle are the ones relating to rhythm. I'd like to, for example, allow users to specify that they want 30% quarter notes, 20% half notes, and 50% eight notes. However, I'm not exactly sure how I'll accomplish this in the back end. If I simply randomly choose note lengths based on the given percentages, the results will be skewed because each measure has to have an exact number of beats. For example, let's say the user asks for 50% half notes and 50% quarter notes in 3/4 time. With the above method, we'd have a 50% chance of choosing a half note as the first note of each measure. However, any time we choose a half note first, we'd then have to automatically stick in a quarter note to complete the measure (since you can't fit two half notes in a measure when you're in 3/4 time). We'd end up with more than 50% quarter notes. There's probably a better way to approach this problem, but I'm having some trouble coming up with it. If there isn't, I may have to scrap the feature of allowing users to enter specific percentages. + +My original plan was to have three places for users to enter parameters: +1. Inside a "Stave" (bounded by brackets). Parameters here would describe a specific stave. +2. Inside a "Global Stave" (bounded by brackets). Parameters here would be inherited by all staves (though individual staves can override these global parameters by defining them themselves). +3. Outside any staves (not bounded by any brackets). These parameters are "score parameters." These are parameters that aren't specific to any stave, such as the number of measures or whether or not there should be repeats. + +However, now I'm wondering whether there's a need for the "Global Stave" at all. I could instead have users enter "global" stave parameters outside any specific stave, along with the score parameters. This could be clearer/simpler, especially for non-programmers who might have trouble understanding what a "Global Stave" is supposed to do. + **What questions do you have for your critique partners? How can they best help you?** +My questions are basically if you have any advice for the problems I outlined above. Are there any algorithms or ideas that relate to my note-length issue? Do you think it's even necessary that I allow users to enter specific percentages? Are there any other pros/cons you see to having a "Global Stave"? Should I have it or not? + **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** - +Including time spent on writeups + design, I spent about 11 hours on the project this week. \ No newline at end of file From 586152d6b9a5766648435777f5f2a4db8543bed6 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 3 Apr 2016 22:01:02 -0700 Subject: [PATCH 02/12] implemented since I first wrote entry: seeded random generation + display syntax errors --- Entry 1 -- April 3.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Entry 1 -- April 3.md b/Entry 1 -- April 3.md index 4fe87ff..065168a 100755 --- a/Entry 1 -- April 3.md +++ b/Entry 1 -- April 3.md @@ -33,6 +33,8 @@ Fri Sunday - finished design + implementation writeup - notebook entry +- implemented seeded random generation. should be useful for debuggging later on. +- syntax errors now displayed to users on web page. ## Questions @@ -57,4 +59,4 @@ My questions are basically if you have any advice for the problems I outlined ab **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** -Including time spent on writeups + design, I spent about 11 hours on the project this week. \ No newline at end of file +Including time spent on writeups + design, I spent about 12 hours on the project this week. \ No newline at end of file From 822aa05debe99a31461d249c078b77491b895add Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 10 Apr 2016 21:21:48 -0700 Subject: [PATCH 03/12] example images --- images/4-10_input.png | Bin 0 -> 10552 bytes images/4-10_output.png | Bin 0 -> 18182 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/4-10_input.png create mode 100644 images/4-10_output.png diff --git a/images/4-10_input.png b/images/4-10_input.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c6ad783937d086fdf8d9df0e509576a5823aec GIT binary patch literal 10552 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 bU3GGao$6fU=mC)J2)c9I;8vN2?UVlkRS!ax literal 0 HcmV?d00001 diff --git a/images/4-10_output.png b/images/4-10_output.png new file mode 100644 index 0000000000000000000000000000000000000000..c2adf4fba575dd1b9b9aa8e1a8a430dd57ce390c GIT binary patch literal 18182 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%0A4NV@FaQaFbowtfg)se#=DyRu*2hy^n%Eu zvXPw?cFA{{rz!kb*%h6K?bKhWfHmGH`1qp_EXI!mY50#}4PAl9FJ0;Cq`6Z+DoJLI zMXJ4G*-2$mhO)DJ?IZ&I@SCqQ^P54!M?0z2E!E0qu+8k?`!JT#kAGC;QxI77Mge`j{ z%OOO_q{ilxcSJ(CB#pZd3i)nmQ=NP#)BuBFx?c#B9w9%KKWNQR|Mc=9vcO!vLkGUd z6viq3=mmR_U+jm=moBB?b&-=a&sP2B*PQ*6%BSAWg^dkySk4*UIGBp0I;xy-s&iMH z`uy;K+2?K^ETEJ|s#Z92_c?orqszJ1KhR8W#jGR zLjJ#=NzuepR>MnK)B_Hp>a@-*aa%bvpFQH6Faw%~RUQlRmM`Zs?WBQq*d(yY?Za2% z`qfpF!e=&s9josVcUQrJH+qAaM-|1fOQynsiVEcyr%xK{A*W8#IT4zOx_AAVJW8(i zH(oSVGpeLkDq;Z!eq~rFG~9=hEFoE(Q&D?98gNih2FkgK6L@qRHW=eSz>k(XpQN1N zWLs<-cgM6ov|~YT@+%C#on#ekX~{3_w!=i(E$?W5P#k;OkNnwb0N10ork`!5QTa;k!pz>&DTD6%SfTJ-Z3ucBXoW&h{Y|RUX&24CiE@MWLzZm{B&ilcEl75=c zXaYUvb8Pt&%8NO>)h!uD5DvS(*ML$0m`vf7hKPnJ9vPI@R=gC1p1zn;1rdu0uIVq7 zU%UfUrDH*wfpwhfNtEnGvKycDKK{`_7=YTby|`r>mTpX{{LXu`jwGuvtabQ>dNzYo zL`s!RjTOA&vSWuv7I)EuFu8aD2ohJ^DeK)j3V?%JZeN!wjls~Y6du}wzM0b0hzW4W zPtI9J^zePgtiQ{a4kzGn{wp0WMc&810N9AXP~oo6)tbIF^7ZO3T`Exb3u25%@fkOx z^=L2GRQlr2zImN&HD_TBA_+yE-O6?_UzN)-DyczaaTuhjG%cQ;N1=FNcyRA5h`9;N z%4&L@EYnU&(MtDgQtA{|VpiT@$M?i+9^u&e!0;(V{JGY5hA9sKbL22(xq$d5LXd_9 zCCPyz0gzHnwUSEPYh_cDmAFZmuscvQT4Rs_Dn+pgL%=$Jf0)ycN4^QrU5l`$vUvxI z2j3+@IXN?O;(qi#`z`nwntX|{`JG^91yE|`{>QR=7w;DA1jZHQj?Wl)Av z5tld5JkOK~aTY~dL; z()}(wzjXqj$PVN0RHIoRTQVNWin-!uZo~Cxw$(#uz<>jn5Zp=&&W{<&rx^8l?ZXAY*JX$aQQqpAqYyE~UGcgX7 zz?EcruEWvD{>7H(X84}_v7<5Y&Bsr9q(??>fZCehiEmxy4-HmauLEFYoE`Cvg2o9! zin+?hUEI0*AXen;yVBKL(c^vq;!M3(YNsm)bmn;E1@LlhSfLdQts_Y)xgG`PEa76` zI()N4@%NK)0@3Y->^H^_0j1o`?7%Ghu@>GWZc|zVKjip@X8S8#ZO5ylL@+PWbQhC8 zfOS)TZwYPwpt`ESd^0K|p9t08bdNlJK!HZCv=)Rj0!Grf`X#=Xoki9}mc&=Vn--Am z7EsU47$;G&e{QA{Oc9?GRvL&0fM>@53T-#!T&7znK=A}1mMed iR+P~$loF8!}P zFy(&`as7?wG(PIxIY-4s0ly}wGHT@yGEVKzAIYHlf6#Hu0KVoC@HY3;IYLeW_%#(E zLJL5JfE>*J^gj@Z5-aO@q!Zq-p2P15_%yk5tR8^I z`o9Mw2A@OvsF#R+R*riCq>mv1uJ$y9z@E!x?`8*|9s1+z0Bf}8Xu$G6XvQwUtgNhm zL5^4g>M_bb7=%0CsPR1sClJpg$V2#D*^6d&fWzZjg7*IF)6ekdqp+G1G^s!U87fc^ zpnwSkbmSHn^%5gNrAq|FVfIC*rE|nxo?N;+L6hkOz+pNuV3*_ie~oMdfG!L9{@b5t zA1baR4ShVWsr`@5p#cjhAzBlV2A)e#%J*?K_|x490tj(|01fOc>Xw9+zXvdda|<)S zgCc4Q7zxaE$}@Yr>;N0nzP*j98s8mYnoV|Fj9!_sT6HRz#Hn^*So?*~&SpRHO;)?x zyK9WDV3T3%`v)3};Bzdad>i|sADWA&k@6_21)3`mEe>=EdhQv6q8K0EYsIYO)%ehV zi6nPGox(sP*^yrD1SjMjJU$BnAxotcZcO2(eDPZqHGz@=Afa%28e+bA=&tnAEx_-* zdu`$13$ipGyw>cFiZ}FMEbeSLlBeMyQ&x0$S%j4AjNmZ6pSaT-q;``*a^lL&k&gxI zo)@Q@f0O$AycxXRl8B!BpJW*#2^J#JCHTw}Ql^S^28HxK2$bRyXItgGZQ)ZzFk`Ik zr@d<5E_M{RewXn-ue^L->V*}Nd%yC`$QYKEqS2<5oX~)Sp-OP2FZK8cCJE1zR*@%H zGoA%Fr*Gs9I7W6fiJCUWgOG(ouf8cagK)pJHjcAmFio(-<47N&=je-S@v0Qe=?<}L zBHycZKQgYir)w@ckH}_U*<7L%9cfgw2StEBQM+v7MFX}x7?^45l)~cm=)QDGRJ`9nj$i93Wo9^R`IV;M5mGMOz04>u8 zV0A@%rnl+Pm)3{&&9XyU*Rb;^{L88+^vY+90TRKWT-xXldUHik* z?%iGh)Z=3_PZa)i3SWhC#&+d(B^e^4dUwU!N@b?ONimY@`+$!4L8GIDuE;`yLp3MU z4H?+8grw45762s^zP8s^*iUjO>3Taan|b-6#0zcJ9=qks^6OH%|#8PKVBh4+N_0!?K;?UxLBxX1e=tHb$ZG!<|0YmK}8w%bz#0yoFCWPnW5rP8@gY zNSJ>e@3mq0$;$5|JP$T!tZ!o!iu>OTTPPNLR{`yS*NAh+j-_c&d=#i*(tvc{Jjy^Ce0IsD(HI6$6kZ5} zvU8^wjk9f^T-Mh$2p1biWRx!)cMJ=BirfFOpXd54iyVY$wQGs8%FfB}gttIE)7YiH zatj`XHY%>`4KqHri;H)qK;sVMLr{_9+v46Xm)I43`|ixVUpZJsr|a-Gf7$=Fnlo84 zKmYBw9ZF-UW3=$1+GNUtK#A)7FQ((EoVHHTGf8kVS%jrZfQo^qq0*$9u5ki82dX`l zyFvk~Xw%mu>g|IJ6q~HsExXRS6N%}*RHQ5>nQ$~7_cKU(%?WS)a(P$50ZPEORayMJDYuz;&52x0rfYy@-l9>*CtPE2 z{DwK#xwRTV?xHanDpDHZ#96}&JiH*M@1dO`n zmYAFN%Lr1@GBcrAgzdY#sTxgiN82R^2$WzBu$+#`D#+j~QX`0vu*z(D|2EDxhDn6RKWv=ex~ z4P=y*l(Wp{y@%uUPm;ne*zs%6BH60aYTQ^&IGml{kLfSsZ&Zu zcPS7QT^r`#m_OpOltwiT)pfYseZp9LXHF|^WeJcu7g~~%{x`*H;dFeD~}xc>&Om>t6HY-OF@z`%`z zdiGD<9c_Sm4$Lt8BJ|V{%VIUi#h|xD!LJWbv?n-azVuylZmVjX)6@$RxUwi|VchFp zd+c!-Xx7%%!Gl)Q?X^jGeww+DzC7bx)eAwLCxhPxz%KGIlSEh2FX4vyRbzJG z0KeDB?5;t_a0G)bB?2ZYvFt!@XChj)>_|Dzj2pQGc1@Zj^Oil+QX}H-l>$1TGwpjdG092(jrB|$f|d=QqdB7W;7u-1kknm}`*4@!*G!-neA&a3 zbnjS79Upb2EJG-;K!hzAp^$xPXH7jEh`t|`*jm8OJdWA9v?3O1u>}(_#S1(0ZR74o zi`OIgdYQ|_hV>r0pS)N@%x5wb6m&*L{vwV+4#h-oZ+pa4G}ie$8_5&U=WE1*%CCU@ zUOZ~?dc(S7@W0wX6AZO}n${<4og;FGLfl-&q}2sfofG54sVkzDo7XSO8W#@+Qwou^ zS0ys-2?q)lBpSGikgP`>+r9_8GM+9)V%m+$7E^3`WKe13vTC1ICO;{k}uSE8Z=+cc3zPM%zihgbS<#M=LWf`$iFb@Ow&>gqB z!fY)uSJEoCrvJhE$mP%blDCeuh$EMD!QOSZPt_@O9=OM_+?wTfbAFD^5F7Vnc5*oM z#-iIKO20!~Vw!9vjC2cla`pg7nQQTzU(;Ga%Cg}47Id7~Zt0b;ePKy4JAp-isqZ!} z+E{0gvhR-4>aNf4eyiax4w)weoTKl!B^e>-O;~1VJnE;i>y;Y#5&)H_l|hR@S`0mL zX)b#camD8XGa5@t82>v-qik6VkB9Uxza%1(f~i$s#Ltb;w$W3VMNrgUFJUA z;EMz=mOL&UZ(n-tYif0)ed(Vd=jpRw-M4>f43XR4xQxLG^ivJ2r`Yt$pq5~=Q!(se z+JPq-mQr6=$FVm<20Vr`|ItrN>o@SMEj7^vy#E21P^-S>6NhXF^cRYCpY*^kbo-v| z+}J1sy#K# zlUKRj*16$>t58ph33t$bP&0490mP*;pdB>erdM&z-U!Jto%5`a>htXlUPD)hOW0h| z6v5)VG!PLi++-4_7raFPp#VKlF{QN(l7gJ!Hv~4@4e>`qe}Teg17<^2b&L0JA*Gl* zf}cN$RB%YslkKN_{&5H4PrL0R-^?N+|KtMul2Zd}C~6zgHu2v=C0}Fcu!?+7w&W;l zwD^sEn@s$Na|YrH7MQXWz__9BxxMN(eCHkkr0kdsLOJ~!fVC(vFrp=+u%L{k4f|sj z2JS9;8v4+D7n_gHiN_t&u;;$^_gN^9SguM1vSEg7#mriNuVI9zb%JDhx&(+l7zCZ1TV02=nZ4tZQ~hh73G zVQoBlHS+OvcIA({34+t*_g|4EU&^_7*My9ueJ|E69oW%{ody7~v-m=%e?INf$rWp? z|MxtX<5Kk;uio$RfJ=>%F_~)nquAmq@fmP+`)zHt(O3% zGACeODIjCGpLjp6T$Yv8J`dagqhQr}h@1TI=-($b-KFyR3yz`xI|Y(0!N;XB5aolt z=-Xc=z5~#ZlKLyUOOZ%5&p|(;oDvmsUSl$nxf4Asu(5yMOgbyS((L~-6_^1%{||H; zFF0NUfT&k}`e}gdJk}Tpt1mT?*pB^SioSF%#_qZguwqe%wm|z0=7GX?4Ny4LwC9S( z)1rO>+pZ-+-zflgpRiGVoO^J}gaP{6SujrT(!ehXJyVhC&1pMme)o+@32y|`SlXuE zWg(5DpXS!tHJlV&N* z$6F?&JoW}OQx16DcDCF3QiP6Y`2ciw-w#LC)qSl$j8%RLOp65=wCAXj8C4LL4>^b9iD%5#7uynfvv^7QPpN727W1wk?+<@9o<6bm^T31` z55a^F;#I9R_gQ9w24MfkMDhR000L*h4At#IS3Wp zj2>sqfBw7nP#r4*l^{ZRl}p!mJFLfsbu_A32^C*O`en0Owwh4h9MywMr1Hi=zx~=$$Jk0kbdt zZvr8_>}~MAF%*fOjUacndSe?GNdgBoWyD3dIZ(~hTZEEdpe(_%q? z6gn0sYzZ+@dH$r{C_4;n~y z3~=_k%3~=5X>Yi*x-bZM>7-GRlb6ui@IjcBSlQrimWnNjr_!FtKRtqC5kvA{hRh0v zpb40Dveid+vYFRP!L}{+eK32Cdi`HGEOX zz_7x2F+?LmJwOc98!|LxwTj+Wj=kMB!L@j;#zx!HT3_{+-K;>5`uFDS54pV_m6Dfw zaeFWF=9_Z68fno~!^XvToQcNRg)n#sJIW)zOYuhm_l>7HIJ{aDK+2IOvFru54`Mma z^`u&Ym>Mwb^1m!Sbe25?UFo|tY|o`Qs}X7r939W3sPll>s+s=I=K)TS-zg5U<8NIf z0nUNZ+75vjGJj+y^8N7(9C12dMEU*SV=c=NGM1=s)ZXUUjs+ z3joXR)lbV?aSiv(0Vy;~r34sG)C5kSP(~17LAxdGta9pg-5cvZ>oEY5>*Co>I8yGe zt_;Q13DR7?bjK&*Eh)#7X8%qBlc6>}ph7BYXCm9P*9-LFvVUtDdb^GmRQ2cX{EM?Z zMSHv+o3K-VFdJ0N~c4VnNH)fpIbtYsYyqQ}p&lep3E=l87P zT+SgWrXu%88{7zeDw<#_lg#}@pe@kb`&ozxE7-c0GTLgAEs2^$C!tiJ5trM?3Q{@$ z4y<=g>bWRTAXNy4)oZ;04$_ZaPefh_qPQe^FzuIcUKa*j>2#n7VSBd@Cc8bT>o8Hd zKMKjpcz6|$pP}*xn# z7-}jk1j3#oqzOA>nIa*0fpFw}4TepO|MIaxB%CkA_V=5|DC>G^;D8Q1JsB=!6 zH4!i~g%r9RC~mt5_NOdJgE0{9?&g844IjHP@eq+aY*Pv-@}vA+_NF5BOs%(d0P6sk z9sr)Uph%pT=G5lb#aU-_wMd|lq9nS}dC%vZiQmIrZA8*PS)FyQOm%z=6G&Z15F0b^`G-_D% zgeSiJBqAk$TuZohfMXsZRObfN*iY4yc926HWn+=Y_l`NI{fNGn4zNNwfiC2ZoniQ< z?jlS(7HIVXcPiK^JW;w>M@gygDHJ|r4SmevH8t(3zbImI;VZ~mBKP^QEN{Pq^}F;2 zASVg)l?9*N7@cvJv;x{F+o1D{9Qp#&741bHx02zp4Onb?%)R#c>*)*KwFt9MASC3` zF>&@<%r6Vnb4<$RXmzh1K<606^XnioDMI7|8ra=h&6gBO;fSXqZH=9#gXT70gZmY3 z$4i9M>gGmK`fM_RUxHt)XM@KeF}j$=p74my$xK3z>R;p|jpXjh$v9I2^?s3SEYt$8 zbW#dBJ)yKpB18A+j@%S0XkPCn)8i)Q~XLe&-fwnwkvpNO_RUpj_4rflhJUJTYF2A~AH%RlmNd*^`g z`wn=wo&7O~DIZNavxxKr(^!AEowAzKwNBv12=9-d4hic8k&152^+USGE(H^w43xm35KmP1aymb%w-Vznkyr;Bg8r-4-T&00e z$!=wRob~jwZnPRaL6S=uXrJ*2zyB5dlgiJ4J*E9Q&__&@8E;Vi9y{8kCpRbqp*h6o zpXB!sXUatCh}Q)uKxwxyScPqs3^WKizp`Y>?zFFv&Lj)FpZ=8!AQoRV``nDDm?NtB z`p<1!g~@3F_2{negA2fdPc?=m_DO3%>WE(3nsXWJ-puQF<9I9Z)m1OK=W^j4G4E@y zkE%qK039_&qfEreYZ`f)F&+#1%QR?bsVj0ldP;hv>72sdw;lBDsSmTLXgUI@J_fgR zE@64WTgr-hd#n(^rs%7(j|-oYDBq9jo+jL?QQQ_IUnf&KydxJLpqQ(`hEcRHSN=={ z#aQ@f`&fAOh*w;NvcSoac?urCUN+wrc)@*c`&Zp$bqS?Vn!{ zk_j~Z(04OH$Q1UOczvL;2(%WPL7M6OO6MKX;9%w73Oec1UKZz{#t8g Date: Sun, 10 Apr 2016 22:24:05 -0700 Subject: [PATCH 04/12] started entry 2 --- Entry 2 -- April 10.md | 60 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/Entry 2 -- April 10.md b/Entry 2 -- April 10.md index c3ed055..f971197 100755 --- a/Entry 2 -- April 10.md +++ b/Entry 2 -- April 10.md @@ -10,14 +10,50 @@ helpful in addressing the most pressing issues in your project? How will you incorporate the feedback into your work? Will you change something about the design, implementation, or evaluation as a result? + + ## Description -**TODO:** Fill in this part with information about your work this week: -important design decisions, changes to previous decisions, open questions, -exciting milestones, preliminary results, etc. Feel free to include images -(e.g., a sketch of the design or a screenshot of a running program), links to -code, and any other resources that you think will help clearly convey your -design process. +The major things I worked on this week are as follows: +- Pitch: Started creating an internal system for representing pitches that allows me to perform meaningful logic on notes. I decided to base my system on [MIDI pitch values](http://www.electronics.dit.ie/staff/tscarff/Music_technology/midi/midi_note_numbers_for_octaves.htm) (integers from 0 to 127 representing pitches). By using integers, I can perform simple harmonic "math" that is key-agnostic. For example, to create a 5th interval I add 7 to a pitch's MIDI value. This system allowed me to implement the "absRange" parameter that defines the range of allowable pitches. In order to use MIDI in the back-end, I convert [scientific pitch notation](https://en.wikipedia.org/wiki/Scientific_pitch_notation) (input) to MIDI value (internal) to ABC notation (output). +- Polyphony (the number of notes that can be played at the same time): Back-end was straightforward, though I'm sure it will get more complex once I allow for parameters like "relRange" (number of allowable semitones between notes within a chord). [Parsing](https://github.com/milohan/sheet-music-gen/blob/master/parserGrammar.js) for this was interesting. I allow users to specify polyphony in three different ways. + - A single integer: "polyphony: 3" means that only triads will be generated. + - A range of integers: "polyphony: 1-3" means that single notes, diads, or triads will be generated. + - A list of integers: "polyphony: "1, 3" means that only single notes and triads will be generated. +- Multiple staves/voicings: Users can now create an arbitrary number of staves. Followed my critique group's advice and scrapped the "Global stave" idea. Now, parameters defined outside any specific stave are automatically considered "global" and will be used by any stave that doesn't itself specify that parameter. + +#### Example input and corresponding output: + +![asd](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-10_input.png) +![output](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-10_output.png) + +#### This week's work log: + +**Monday**: 3 hours +-wrote critique for William +-users can now specify seed with "seed" parameter. +-"clef" parameter now supported. + +**Tuesday**: 1.5 hours +-designed and began implementing pitch system, from input -> internal -> output + +**Wednesday**: 2 hours +-parsing for "absRange" + +**Thursday**: 2.5 hours +-worked on back end for pitch system +-"absRange" backend working +-started working on polyphony support (chords) + +**Friday**: 1.5 hours +-parsing, semantics for polyphony. Allows int (eg "4"), range of ints (eg "1-3"), list of ints (eg "1, 2, 4") + +**Saturday**: 1 hr +-planning + parsing for multiple staves + +**Sunday**: 2.5 hr +-backend + finished parsing to handle arbitrary number of staves +-"global" variables (defined outside of staves) properly used when not defined inside individual staves ## Questions @@ -25,10 +61,22 @@ design process. you need to make, what implementation issue are you trying to solve, or how are you evaluating your design and implementation?** +- I'm still working out how I'll generate decent rhythms while allowing users to specify any time signature any any set of note lengths. An idea I had was as follows: on a measure-by-measure basis, start out with largest available note (e.g. a whole note in 4/4 time, assuming the user allows it). Based on some probability, either leave it or split it into equal-length children. Recursively apply same algorithm to children. A benefit of this is that it should naturally create rhythms that emphasize downbeats. However, it needs a lot of refinement if I'm to use a version of it since certain problems would arise. + - Some note values would be impossible to generate. How do we get, say dotted half notes in 4/4 time? (Maybe allow a certain chance for two notes to "combine" into one once the measure's been generated?) + - How does this alg work in odd times? +- For user feedback, I need something better than the types of error messages I'm currently giving. I'm contemplating trying to implement feedback where I'd highlight the troublesome pieces of code. I'd have to delve into the parser generator I'm using, but it could be a cool "language-y" aspect to sink some time into. + **What questions do you have for your critique partners? How can they best help you?** +- What are your thoughts on my idea for generating rhythms? Any major flaws I haven't noticed? Any other ideas on how I could get accetable rhythms? +- Can you think of a better parameter name than "polyphony"? It describes the number of notes that can be generated in a single chord. +- For parameter names that are more than one word, such as "absRange," what do you think of using camel case? I write a lot of java, so it feels natural for me, but would something else be better? +- Are there any other major parameters I should prioritize? There are countless I can think of, but at some point I want to start working on the UI version of the DSL, since that's more design/language-y and should be refreshing to work on. + **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** +Was able to spend some time coding/planning every day this week (github commits won't necessarily reflect this since I'll often work past midnight and I sometimes forget to push). Splitting up my time into smaller chunks helped keep things moving along. If I got stuck on something, I'd just sleep on it and come back the next day. +Total: ~14 hours (daily breakdown in work log above) \ No newline at end of file From 9623429be67bbe4d5cbd7534e06f24469a9026a2 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 10 Apr 2016 23:36:28 -0700 Subject: [PATCH 05/12] finished entry 2 --- Entry 2 -- April 10.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Entry 2 -- April 10.md b/Entry 2 -- April 10.md index f971197..e3b3965 100755 --- a/Entry 2 -- April 10.md +++ b/Entry 2 -- April 10.md @@ -2,15 +2,11 @@ ## Last week's critique -**TODO:** Fill in this part with a summary and reflection on the critque you -received for last week's work. Answer questions such as: How, specifically, did -the feedback help improve the project? Did the feedback point out or offer -something you hadn't considered? Did it help you make a design decision? Was it -helpful in addressing the most pressing issues in your project? How will you -incorporate the feedback into your work? Will you change something about the -design, implementation, or evaluation as a result? +Aaron warned me about my current error handling, saying that it went against what Prof Ben had told him. He said that my "10-8" case (where I give a parse error since that's not a valid min-max integer range) is "semantic, not syntactic," meaning that I shouldn't return an error while parsing. I don't understand exactly why this is, so it's something I plan to ask prof Ben/my critique group about before acting on it. +For note-lengths, Aaron suggested that I could enable users to specify probabilities for each length to occur (something I originally wanted to do) by using ties. It's something we discussed in class, and would, as Aaron claims, solve the issue that I point out in last week's [notebook](https://github.com/milohan/project-notebook/blob/master/Entry%201%20--%20April%203.md). However, depending on the note lengths the user chose and the time signature, this could cause there to be way more note ties than there would be in normal-looking music. It would could also cause the generation of note lengths that the user didn't specify (something Aaron and I discussed in class). For these reasons, I've decided to scrap the idea of allowing users to specify specific percentages for note-lengths, and instead focus on other parameters. I don't think it'd be an especially useful parameter, and I'm starting to think it may not be possible to impement without annoying side-effects. +Aaron also responded to my question about the "Global Stave" from last week's notebook. He said to scrap it, and I've done exactly that. As he says, there isn't really any need for it since I can just put "global" parameters in the score environment of the program. ## Description @@ -27,7 +23,7 @@ The major things I worked on this week are as follows: ![asd](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-10_input.png) ![output](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-10_output.png) -#### This week's work log: +#### This week's work log (feel free to ignore): **Monday**: 3 hours -wrote critique for William @@ -65,6 +61,7 @@ are you evaluating your design and implementation?** - Some note values would be impossible to generate. How do we get, say dotted half notes in 4/4 time? (Maybe allow a certain chance for two notes to "combine" into one once the measure's been generated?) - How does this alg work in odd times? - For user feedback, I need something better than the types of error messages I'm currently giving. I'm contemplating trying to implement feedback where I'd highlight the troublesome pieces of code. I'd have to delve into the parser generator I'm using, but it could be a cool "language-y" aspect to sink some time into. +- Also - There are a huge amount of things I could work on to try to generate harmonically pleasing music, but I'm going to leave that to the side for the time being. The code I'd have to write would be super back-end heavy, and would probably be out of scope considering the amount of time I have for this project. I would like to do some basic things with harmony/consonance before the semester ends, but at least for the next week I'm going to focus on things like user feedback, the UI version of the DSL, rhythms, MIDI output, etc. **What questions do you have for your critique partners? How can they best help you?** @@ -72,11 +69,16 @@ you?** - What are your thoughts on my idea for generating rhythms? Any major flaws I haven't noticed? Any other ideas on how I could get accetable rhythms? - Can you think of a better parameter name than "polyphony"? It describes the number of notes that can be generated in a single chord. - For parameter names that are more than one word, such as "absRange," what do you think of using camel case? I write a lot of java, so it feels natural for me, but would something else be better? -- Are there any other major parameters I should prioritize? There are countless I can think of, but at some point I want to start working on the UI version of the DSL, since that's more design/language-y and should be refreshing to work on. +- Are there any major parameters I should prioritize (other than rhythm)? There are countless I can think of, but there are also a bunch of other things I'd like to work on. +- Besides parameters, what should I prioritize? I feel like there are a lot of directions I could go. + - UI version of DSL + - Better user feedback (e.g. highlighting problematic code) + - MIDI integration (allow users to hear what the music sounds like) + - Something else? **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** Was able to spend some time coding/planning every day this week (github commits won't necessarily reflect this since I'll often work past midnight and I sometimes forget to push). Splitting up my time into smaller chunks helped keep things moving along. If I got stuck on something, I'd just sleep on it and come back the next day. -Total: ~14 hours (daily breakdown in work log above) \ No newline at end of file +Total: ~14 hours. Daily breakdown in work log above. \ No newline at end of file From 556e0271a3abd183d0ee2dcd6e8aee24b92a280d Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 10 Apr 2016 23:57:29 -0700 Subject: [PATCH 06/12] annotated image --- images/4-10_input.png | Bin 10552 -> 18190 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/4-10_input.png b/images/4-10_input.png index c9c6ad783937d086fdf8d9df0e509576a5823aec..a107ed0254bd51cf0571f8a4c671caecbcf087ba 100644 GIT binary patch literal 18190 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 HZ2Lb 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 literal 10552 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 bU3GGao$6fU=mC)J2)c9I;8vN2?UVlkRS!ax From 3069f97417c4be8e2e4737163bcf1fa619721971 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 17 Apr 2016 14:53:09 -0700 Subject: [PATCH 07/12] gui images --- images/4-17_gui.png | Bin 0 -> 18957 bytes images/4-17_gui_code_output.png | Bin 0 -> 7204 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/4-17_gui.png create mode 100644 images/4-17_gui_code_output.png diff --git a/images/4-17_gui.png b/images/4-17_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..2cfbe38c649730b308f84e25b0d393e03364d818 GIT binary patch literal 18957 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 R{|3;T$t`okV*N*${{W9BwtoNs literal 0 HcmV?d00001 From acdfc5caa4ba3ea18110e58da561cc50d2a889cf Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 17 Apr 2016 18:09:55 -0700 Subject: [PATCH 08/12] entry 3 --- Entry 3 -- April 17.md | 65 +++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/Entry 3 -- April 17.md b/Entry 3 -- April 17.md index bafd527..ea4b951 100755 --- a/Entry 3 -- April 17.md +++ b/Entry 3 -- April 17.md @@ -2,22 +2,46 @@ ## Last week's critique -**TODO:** Fill in this part with a summary and reflection on the critque you -received for last week's work. Answer questions such as: How, specifically, did -the feedback help improve the project? Did the feedback point out or offer -something you hadn't considered? Did it help you make a design decision? Was it -helpful in addressing the most pressing issues in your project? How will you -incorporate the feedback into your work? Will you change something about the -design, implementation, or evaluation as a result? +William's critique was extremely helpful in laying out a road map of features to implement. Before talking to William, I had a few features in mind (rhythm generation, GUI version, syntax highlighting), but I wasn't sure how to prioritize them. I was actually leaning towards rhythm generation, since it seemed to be the most interesting of the bunch. William, however, suggested that I push it to the side for the time being, as it's more back-end heavy than anything else. Instead he suggested I first work on the GUI version of the DSL and then focus on syntax highlighting/user feedback. +I've decided to do just that (this week I focused mainly on the GUI version of the DSL), and I think my project is much better off for it. I could've very easily fallen into a pattern of adding support for more and more backend-heavy parameters. By instead focusing on newer, more language-y features, by the end of the semester I should have a decently-comprehensive vertical slice of my DSL. + +William suggested some specific libraries/plugins I can use to define custom syntax highlighting for my DSL. I haven't gone over them too in-depth yet, but from what I seem they're a much better option than my previous plan of writing a bunch of javascript to manipulate a textarea HTML element. + +He also answered my questions about the intuitiveness of some specific parameter names, giving some suggestions that I might end up using. He suggested that instead of going the camelCase route with "absRange," I should have users explicitly write "absolute range." This makes sense at the moment, but I'll probably talk with some members of my target audience before I settle on a naming convention. ## Description -**TODO:** Fill in this part with information about your work this week: -important design decisions, changes to previous decisions, open questions, -exciting milestones, preliminary results, etc. Feel free to include images -(e.g., a sketch of the design or a screenshot of a running program), links to -code, and any other resources that you think will help clearly convey your -design process. +The majority of my time this week was spent designing and implementing the GUI version of my DSL (the code for which is viewable [here](https://github.com/milohan/sheet-music-gen/blob/master/dsl_ui.html)). In doing so I mostly stuck to my original plan of using GUI elements to mirror the original DSL in a one-to-one, but simplified, manner. However, I did make two important design changes in the process. +- For the GUI version of the DSL, I've decided to get rid of default stave parameters. The main reason for this change is to prevent confusion on the user's end. The GUI version of the DSL is targeted at users who have no experience with coding, and possibly very little experience with technology in general. To this audience, having a set of stave parameters that don't actually define a stave may not make much sense, and the ability to define default parameters doesn't actually save much time unless you're defining a huge number of similar staves (for such a case, I may eventually add a "Copy Stave" button). +- Decided to convert from GUI form elements to DSL code, instead of directly to internal representation of data. Once I have the code, I can output sheet music using the same javascript code that I wrote for the original DSL. This has two benefits: + - Because the GUI version mirrors the UI version in a one-to-one manner (i.e. for every parameter there is a corresponding form element) it's actually simpler to create lines of "code" than it is to create a Javascript object of arrays. + - The ability to export DSL code means that users can start a program in the GUI version and then easily switch over to the code version at any time. This is beneficial because the GUI version offers slightly less flexibility than the code version (for example, "polyphony" can only be a range of integers in the GUI version, but it can be specified as an integer, a range of integers, or a list of integers in code). + +#### GUI Version of DSL: +![](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-17_gui.png) + +#### Code output: +![](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-17_gui_code_output.png) + +**Monday**: 1.5 hours +-Started critique for Aaron +-Refactoring (started getting rid of unnecessary reorganization of data in "parse" method). + +**Tuesday**: 1 hour +-Finished critique for Aaron + +**Wednesday**: 1 hour +-Refactoring + +**Friday**: 1 hour +-Designed and started implemenitng GUI version of DSL + +**Saturday**: 4.5 hours +-Worked on frontend for GUI version of DSL +-Started conversion from form elements to DSL code + +**Sunday**: 1.5 hours +-Wrote notebook entry ## Questions @@ -25,10 +49,23 @@ design process. you need to make, what implementation issue are you trying to solve, or how are you evaluating your design and implementation?** +I'm currently trying to figure out how I'll provide error messages/feedback for the GUI version of my DSL. Currently, the only way users can create an invalid program is by doing one or more of the following: +- Leaving the "measures" field blank +- Entering a negative value in the "measures" field (the field is number-only, so I don't have to worry about other invalid types of input) +- Selecting a max "polyphony" from the dropdown menu that's lower than the min "polyphony". + +As feedback, I could simply return the same parse/logic errors I'd return in the code version of my DSL. However, a better method would probably be to prevent users from clicking the "generate" button until they have a valid program. In the case of the "polyphony" error, I could prevent it from ever occurring by blanking out max "polyphony" values that are lower than min "polyphony values" (and min values that are greater than max values). For the "measure" errors I could display some sort of warning when users enter something invalid. + **What questions do you have for your critique partners? How can they best help you?** +Questions on specific form elements: +- For the "clef" form element: There are actually 4 clefs that I support in the code version of my DSL (treble, bass, alto, tenor), but the alto and tenor clefs look exactly the same (one is simply placed higher in the stave than the other). Since I'm using images of the clefs in my form, it would be confusing to have both alto and tenor, so I left one out. Is there any way you can think of to include both without causing confusion? I was thinking of just adding a label, but that would still look kind of weird imo. +- How should I make the "range" element clearer? I like the current setup of the double slider, but there isn't any feedback yet of what notes the user is actually setting the min/max to. I'm planning on adding a label for the current min/max note in scientific pitch notation (eg "C4"), but that still doesn't mean much to many instrumentalists. Maybe add a mini cutout of a score with the min note and max note on it? Or is that overkill? + +What do you think of the direction of my GUI so far? Any elements other than the two I listed above that could use some reworking? + **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** - +Spent 10-11 hours on the project this week. \ No newline at end of file From b1296ba8ca069d7135d6de8740e0c2e23e322a37 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Mon, 18 Apr 2016 00:52:26 -0700 Subject: [PATCH 09/12] updated work log --- Entry 3 -- April 17.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Entry 3 -- April 17.md b/Entry 3 -- April 17.md index ea4b951..c6da644 100755 --- a/Entry 3 -- April 17.md +++ b/Entry 3 -- April 17.md @@ -40,8 +40,9 @@ The majority of my time this week was spent designing and implementing the GUI v -Worked on frontend for GUI version of DSL -Started conversion from form elements to DSL code -**Sunday**: 1.5 hours +**Sunday**: 2.5 hours -Wrote notebook entry +-Worked on GUI DSL - now outputs sheet music ## Questions @@ -68,4 +69,4 @@ What do you think of the direction of my GUI so far? Any elements other than th **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** -Spent 10-11 hours on the project this week. \ No newline at end of file +Spent 11-12 hours on the project this week. \ No newline at end of file From 89e25cde280569215f3fe4355f384fdaf4a45e20 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 24 Apr 2016 15:16:33 -0700 Subject: [PATCH 10/12] syntax highlighting image --- images/4-24_syntax_highlighting.png | Bin 0 -> 17898 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/4-24_syntax_highlighting.png diff --git a/images/4-24_syntax_highlighting.png b/images/4-24_syntax_highlighting.png new file mode 100644 index 0000000000000000000000000000000000000000..957d1a77c89d5ea479ea5fbbfcc0941ae51be35b GIT binary patch literal 17898 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 Date: Sun, 24 Apr 2016 21:04:00 -0700 Subject: [PATCH 11/12] notebook 4 --- Entry 4 -- April 24.md | 63 ++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/Entry 4 -- April 24.md b/Entry 4 -- April 24.md index 72425b0..492ad10 100755 --- a/Entry 4 -- April 24.md +++ b/Entry 4 -- April 24.md @@ -2,22 +2,49 @@ ## Last week's critique -**TODO:** Fill in this part with a summary and reflection on the critque you -received for last week's work. Answer questions such as: How, specifically, did -the feedback help improve the project? Did the feedback point out or offer -something you hadn't considered? Did it help you make a design decision? Was it -helpful in addressing the most pressing issues in your project? How will you -incorporate the feedback into your work? Will you change something about the -design, implementation, or evaluation as a result? +Didn't receive a critique last week :/ + +I did, however, get some solid advice from Prof Ben during class. He told me about the difference between syntax and run-time errors and gave me some advice on using the syntax highlighter CodeMirror. + +I also got some advice from William and Aaron on my GUI layout. I asked them how I could have two different buttons for both tenor and alto clef, when their symbol looks the same. They suggested I include the stave lines in the icon (they're placed differently on the stave), which I went ahead and did. ## Description -**TODO:** Fill in this part with information about your work this week: -important design decisions, changes to previous decisions, open questions, -exciting milestones, preliminary results, etc. Feel free to include images -(e.g., a sketch of the design or a screenshot of a running program), links to -code, and any other resources that you think will help clearly convey your -design process. +This week my time was split pretty evenly over three different tasks. +- Cleaning up my code and GUI layout. Nothing too interesting here, but there are details in my work log below. +- Implementing basic syntax highlighting with CodeMirror. This ended up taking a decent amount of time. I used CodeMirror's [Simple Mode](http://codemirror.net/demo/simplemode.html) to define my highlighter in order to speed up the process, but it ended up being slightly less powerful than I would have liked. For example, there's no way for me to define multiple "next" states for a given rule (this should make sense if you skim the documentation + example that I linked). +- Added more syntax errors to parser. At this point I think I've covered most of the reasonable syntax error that could occur for the average user. The code for my parser is starting to get bloated. Not sure how I can better organize this. See below for more on this. + + + +#### Work Log + +**Monday**: 2 hours +-Critique for William + +**Tuesday**: 1.5 hours +-readded seeding (was removed while refactoring a while ago) +-refactored javascript, code is now more properly segregated +-GUI design work (redid clef buttons to differentiate alto, tenor) + +**Wednesday**: 1.5 hours +-GUI - max values smaller than min value automatically disabled (prevents integer-range errors from occuring) + +**Friday**: 1 hour +-Started implementing code highlighting with CodeMirror + +**Saturday**: 3 hours +-Finished writing DSL "mode" for basic syntax highlighting +-Added a bunch of errors + +**Sunday**: 2 hours +-Notebook entry +-Prepared presentation + +#### Basic Syntax Highlighting: + +![highlighting](https://raw.githubusercontent.com/milohan/project-notebook/master/images/4-24_syntax_highlighting.png) + ## Questions @@ -25,10 +52,18 @@ design process. you need to make, what implementation issue are you trying to solve, or how are you evaluating your design and implementation?** +The [grammar](https://github.com/milohan/sheet-music-gen/blob/master/parserGrammar.js) for my parser is starting to get unwieldy. Since I test and write my code in the [online version](http://pegjs.org/online) of PEG.js, there's no way for me to split the parser up into multiple files. Even if I could, I don't know how I'd organize the different parts of the parser. Currently my general structure is having "bigger" rules (eg Program, Stave) higher up, and smaller rules (IntegerRange, AlphaNumeric) further down. Even with this general structure, it's starting to take longer and longer to find specific pieces of code, and it's also becoming more difficult to keep track of how the rules fit together. + +Also, the simplest way I could come up with to handle certain types of errors was to make rules whose sole purpose is to return an error. For example, see the "ImproperlyPlacedParameter" and "MissingValue" rules in the grammar code I linked above. I'm not sure if there's a better method I could be using. + **What questions do you have for your critique partners? How can they best help you?** +Do you have any suggestions on how I can organize my code for my parser, given that I'm writing/editing it using this [this](http://pegjs.org/online) web page? + +Is the method I'm sometimes using for error checking (creating "error" rules) bad practice? In general, is there a universal way you're supposed to check for syntax errors when building a parser? Currently I'm just doing whatever will work for each error. It's working okay so far, but I'm worried about scalability. + **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** - +~11 hours \ No newline at end of file From b21a06794a577aefdc7cf8f97ab17ef0f533bbc1 Mon Sep 17 00:00:00 2001 From: Milo Han Date: Sun, 24 Apr 2016 23:34:36 -0700 Subject: [PATCH 12/12] updated entry --- Entry 4 -- April 24.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Entry 4 -- April 24.md b/Entry 4 -- April 24.md index 492ad10..4949f9e 100755 --- a/Entry 4 -- April 24.md +++ b/Entry 4 -- April 24.md @@ -13,8 +13,15 @@ I also got some advice from William and Aaron on my GUI layout. I asked them ho This week my time was split pretty evenly over three different tasks. - Cleaning up my code and GUI layout. Nothing too interesting here, but there are details in my work log below. - Implementing basic syntax highlighting with CodeMirror. This ended up taking a decent amount of time. I used CodeMirror's [Simple Mode](http://codemirror.net/demo/simplemode.html) to define my highlighter in order to speed up the process, but it ended up being slightly less powerful than I would have liked. For example, there's no way for me to define multiple "next" states for a given rule (this should make sense if you skim the documentation + example that I linked). -- Added more syntax errors to parser. At this point I think I've covered most of the reasonable syntax error that could occur for the average user. The code for my parser is starting to get bloated. Not sure how I can better organize this. See below for more on this. +- Added more syntax errors to parser. At this point I think I've covered most of the reasonable syntax error that could occur for the average user. The code for my parser is starting to get bloated. Not sure how I can better organize this (see below for more on organization issues). +Errors I currently support are as follows: +- Invalid parameter value +- Missing semicolon +- Missing parameter value +- Missing stave definition +- Missing closing curly brace +- Min range value greater than max value (this isn't actually a syntax error. I'll eventually move it from parser and check at runtime). #### Work Log @@ -37,7 +44,7 @@ This week my time was split pretty evenly over three different tasks. -Finished writing DSL "mode" for basic syntax highlighting -Added a bunch of errors -**Sunday**: 2 hours +**Sunday**: 3 hours -Notebook entry -Prepared presentation @@ -66,4 +73,4 @@ Is the method I'm sometimes using for error checking (creating "error" rules) ba **How much time did you spend on the project this week? If you're working in a team, how did you share the labor?** -~11 hours \ No newline at end of file +~12 hours \ No newline at end of file