From 88916400d2efdfc1cc5e54609d172f8e39ede85d Mon Sep 17 00:00:00 2001 From: Jan-Henrik Bruhn Date: Sun, 6 Oct 2019 12:55:04 +0200 Subject: [PATCH] Create Part class, think about output assignments --- midi2cv/midi2cv.cc | 139 +++++++++++++++++----------------- midi2cv/output_assignment.ods | Bin 0 -> 11101 bytes midi2cv/part.h | 63 +++++++++------ 3 files changed, 109 insertions(+), 93 deletions(-) create mode 100644 midi2cv/output_assignment.ods diff --git a/midi2cv/midi2cv.cc b/midi2cv/midi2cv.cc index 0db43b4..03dd69a 100644 --- a/midi2cv/midi2cv.cc +++ b/midi2cv/midi2cv.cc @@ -2,9 +2,9 @@ #include "drivers/display.h" #include "drivers/gpio.h" +#include "part.h" #include "stmlib/system/system_clock.h" #include "ui.h" -#include "part.h" using namespace stmlib; @@ -12,29 +12,30 @@ GPIO gpio; Display display; UI ui; //SystemClock system_clock; +Part part[4]; // Default interrupt handlers. extern "C" { void NMI_Handler() {} void HardFault_Handler() { - while (1) - ; + while (1) + ; } void MemManage_Handler() { - while (1) - ; + while (1) + ; } void BusFault_Handler() { - while (1) - ; + while (1) + ; } void UsageFault_Handler() { - while (1) - ; + while (1) + ; } void SVC_Handler() {} void DebugMon_Handler() {} @@ -43,87 +44,87 @@ void PendSV_Handler() {} // called every 1ms void SysTick_Handler() { - IWDG_ReloadCounter(); - system_clock.Tick(); + IWDG_ReloadCounter(); + system_clock.Tick(); } void TIM2_IRQHandler(void) { - if (TIM_GetITStatus(TIM2, TIM_IT_Update) == RESET) { - return; - } - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); + if (TIM_GetITStatus(TIM2, TIM_IT_Update) == RESET) { + return; + } + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); - // this will get called with 192 kHz (foof) - // we want to reduce the amount of times the ui gets polled to 1kHz - // which still is a lot (60fps would be enough tbh) + // this will get called with 192 kHz (foof) + // we want to reduce the amount of times the ui gets polled to 1kHz + // which still is a lot (60fps would be enough tbh) - static uint8_t count = 0; - count++; - if (count % 192 == 0) { - ui.Flush(); - count = 0; - } + static uint8_t count = 0; + count++; + if (count % 192 == 0) { + ui.Flush(); + count = 0; + } - if (count % 48 == 0) { // write audiodac1 - } - if (count % 48 == 1) { // write audiodac2 - } - if (count % 48 == 2) { // write audiodac3 - } - if (count % 48 == 3) { // write audiodac4 - } + if (count % 48 == 0) { // write audiodac1 + } + if (count % 48 == 1) { // write audiodac2 + } + if (count % 48 == 2) { // write audiodac3 + } + if (count % 48 == 3) { // write audiodac4 + } } } void InitTimers(void) { - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); - TIM_TimeBaseInitTypeDef timer_init; - timer_init.TIM_Period = F_CPU / (48000 * 4) - 1; // 192 kHz, 48kHz for each audio DAC - timer_init.TIM_Prescaler = 0; - timer_init.TIM_ClockDivision = TIM_CKD_DIV1; - timer_init.TIM_CounterMode = TIM_CounterMode_Up; - timer_init.TIM_RepetitionCounter = 0; - //TIM_InternalClockConfig(TIM2); - TIM_TimeBaseInit(TIM2, &timer_init); - TIM_Cmd(TIM2, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + TIM_TimeBaseInitTypeDef timer_init; + timer_init.TIM_Period = F_CPU / (48000 * 4) - 1; // 192 kHz, 48kHz for each audio DAC + timer_init.TIM_Prescaler = 0; + timer_init.TIM_ClockDivision = TIM_CKD_DIV1; + timer_init.TIM_CounterMode = TIM_CounterMode_Up; + timer_init.TIM_RepetitionCounter = 0; + //TIM_InternalClockConfig(TIM2); + TIM_TimeBaseInit(TIM2, &timer_init); + TIM_Cmd(TIM2, ENABLE); - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2.2 priority split. + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2.2 priority split. - // DAC interrupt is given highest priority - NVIC_InitTypeDef timer_interrupt; - timer_interrupt.NVIC_IRQChannel = TIM2_IRQn; - timer_interrupt.NVIC_IRQChannelPreemptionPriority = 0; - timer_interrupt.NVIC_IRQChannelSubPriority = 1; - timer_interrupt.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&timer_interrupt); - TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); + // DAC interrupt is given highest priority + NVIC_InitTypeDef timer_interrupt; + timer_interrupt.NVIC_IRQChannel = TIM2_IRQn; + timer_interrupt.NVIC_IRQChannelPreemptionPriority = 0; + timer_interrupt.NVIC_IRQChannelSubPriority = 1; + timer_interrupt.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&timer_interrupt); + TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); } void Init(void) { - //SystemInit(); - NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000); - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); - IWDG_SetPrescaler(IWDG_Prescaler_16); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); + SystemInit(); + NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000); + IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); + IWDG_SetPrescaler(IWDG_Prescaler_16); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); - system_clock.Init(); - SysTick_Config(F_CPU / 8000); - IWDG_Enable(); - gpio.Init(); - // asm("bkpt #0"); - display.Init(); - InitTimers(); + system_clock.Init(); + SysTick_Config(F_CPU / 8000); + IWDG_Enable(); + gpio.Init(); + // asm("bkpt #0"); + display.Init(); + InitTimers(); } int main(void) { - Init(); - while (1) { - // In this loop we do things that dont depend on any timing, but that have to be done. - // you should not write on spi here because that should happen in the TIM2 interrupt - ui.Update(); - } + Init(); + while (1) { + // In this loop we do things that dont depend on any timing, but that have to be done. + // you should not write on spi here because that should happen in the TIM2 interrupt + ui.Update(); + } } diff --git a/midi2cv/output_assignment.ods b/midi2cv/output_assignment.ods new file mode 100644 index 0000000000000000000000000000000000000000..9eabfb1910371589dbfc0dabb2fb4240f64b7e3c GIT binary patch literal 11101 zcmb7q1y~$ew{77P+}+*XB}kCq7F-%=w9y8Fy9NywT!KSz2!Y_iCAbGjfIxyvowIAJE5X6z0RS=p%si7*3xf#1-~a&N;kf?^aIkd% zyLmZ-LC($)TMLkzt&=0ChodEj69{Sx<#2KaJ6bwfxI2Iy-8i7mu3(TQ)CLT8Q~wVq zGBWaiIPYox+aBGwESwzO9sr&WkUe8VXu&%if60#SuVo^QTQC+7##%pyg^W>453Q8p zX*%A452&R?Zs8J!;c*5Gv$q}^Tw{4 z)sVP2v?=|Z^A1UWjpCbC&f61gc7kGzEyT$=0k_E4v=QTX;)_d1n;hX3H;9pv104LRjaoAhc9}@<%m>| zy#&5&%1p0=pX^RkEJ6gdZYsFTtgX;0%K}zc#J;iG!1cO`!IF_X`VdF>^!7Xob>Ix~ zFGPGrYYw-NPOF8AAfXj$Zl~5?tmFxUQJOSfSLWrzyJ%@jnxKQ&r}ZP%tm-yNXON@!WsQx7%81x=I+i*-AAspBazP^2g4tFSTzi`Bj*#D%2C)D zHIOsd9g4qxJMQt)lX&MVY$Z9ZdYPHy#hNsvPN_2^;%OEU$ol)3(temEXBk3`vB=aE z2dqt(D5Al*e}RK!A4z~|0JW%LX465mHS?q7uG{X=XAKAD#D&sP3Fbc2nplx9Mb%DK zG0x4?KaN3$d#V`RPr{t6tcVh7=W~74K*89mqLxN?PrU+sHYB!+)m7fdnMN|Wy2ah*NG?fK*p>YXac zqJq#iI5UhcP)3Ba;my&E!RCkb!nZBAOhTj8ckzAbTD{{*HnxWY`}~G$KDv(F)Ir#L z9&C=7OF|6@)&;3rEGYq>oI1hdh!-&K!|yMM0!anWgAZa>Pj0O*FfVHN#es+xQ9Dx_ zo}~tpv8y`-j^o?hJQR}4wrpzR%DPYtV<9uuqI$TpH??J~w?f=?w_6`^+zNY>!XQ^yQ5ll<4x%@u)^!>#Wg0bLkO-yJupklu@9O{$aUtkO0iWan;*!d)z_m|Lny?oZ$LD7 z=GKdlMjm?2*^E}N>QvNuoeawc{mw*TU_o%jHuB2Gd7FniQceF9r>51@VGKfL*B`RK z<+oJGSRBevca5L@@U;;0x6M4j~{6d5Fc@Z~dPEios8 zZR(pJ(PhAmZ!2yAJZY~KhVt9BPLX{<+>P*9gmEDUDRUUagTbfSjbY|66eW}US2pr| z%?H-8uWP~SraSf6c=6!^$%t{|c}Kpnm%O6pJn8%pdTgajJCuBQ>XXlhCK;mPokN%Pv7l?n+y+2^)p3PSt zYfCKB8Q!FFg-CcamcaFRKZv{ZNp@0N9p0g82NyI)dYh1=``VEz3b^9KF8gE=hY>fZ z*#QF=D*cyG1ghNh*fPGV|RE;EV8zqz&)|zc)AxT{4BlstPSC~ z>fLVQ^|qm#JYvnPI(0RN!#Q#>=y3<(^7oe>?C#<@kI4FwzVNA_Ee*$j1?qfUyaG;c z&Z?e!-QDcJgvH|9r|EhZ{{jCLjhhe8-*RD4(lDdfa<$z|tEhB_zSoyJ$D!zA{r2+M zj-tq&Ozgqen1xKE0-49WhSeK9w@e1d?1{Y<=(=$SbGLE=q97+LSEu2&QP_gVPdwe8b$iNV*QMEJNL$=cxr_j z7Rp#T@x%%dXmx3{L~J71qO*}yD`zEGE~7-1!z>chwu=;mgau%09h1Guz@`{mpkJL= zq|4xYCRdcieIR2gUA!UOg1<^XbM&t5?$ev+t^TdoN^Jq}cHj8y#!xCe&vGZp{Al;i zjiNEFc>wj2l}!mCh#>wffiYdLRdsv2Sh^>QNBn$rJ6k)oGdGu_y8PhOwmCMns&giU zoIAQ4V}HGAM=}#=3Un6>em{o9={7|>fPcYMACh?@6X5G}U9o^W*tHvBM4!b{WU!B; z+VxqdN4T`sS@J+aYS2!@by~OO6+UZ=EU~&OZ%JaZvRtKYU#5>xW?zAD|M}rfK9ltt zxfUy886=cG^T&a#dmC30`$jk2_>qO8%3@0dz)7`P{KA{=Y`y((-;dEhZ^0t4fnHAP zsp-?H417-%)`hMY*7~|sRQ>Z-Fl7{X)OiHS$8>rHh_^c>@2f~I_#VfF#gh;gxg#xG zd|ek;_{sF4YFHhh1!I4oOybg^_`1eXfQ+1_YVUo)dna7cLsE6nZsh0v?sh%g+9}oR zb9wgD*u(l_vc`;Ju^7=d~(L6=WZ)RgV15mALz8LBtE|IN^6!5tO8}EUID_Dn$nr?_AOSMtDntZ zaiP+^Sgcp@iAk1Fq|_=iei|@HyIFuG%GqPV(YSvu?y{wcpzXgJz|lAz0_o?g$kR@U zl&v6Al`S-Q1f7hvv@iesk#0yiS_0o>)vx{1`-voK`x~vrbrq|vsDvh~r%Cz*wXCFd z9c8;};QQNOfBHP#pvpFB?uT+b5IXOZy=$4t#JK}8~cad>La|QQOyJ}j~b?_kxHkdO^2b)#2N0AMl^0RDMhhE_cYSjCRQ4u4;4@L(cYZ)LW*YJzP4R^0Qk z<(J9H6`2ll^7bPLpr4I|ad1wd&>r)|lDQSrgVl>yE2Gz$tf_SHUzn_HQoa~nO0Q_K z$vqV&)aa^Jmu8BM#UG+V+HX1-6bJUZU zoHr*}5ldML)to86gTeD;#1`_3XJ;DOx}KP;0E49dO}`s5UU$F!*F+R{^T-8zKHuA{gb`9F0I{GT4YGN&`r` z?_lP#*St}_vo{b1t_Qp5^Wz$!IU&PUjfI7#4ROG(bRc+-%-!hrrc~DNR1DJMz{*zNReIAWclFZaM9dYPMG?o|e^(K65Lq*PPcr{N6~=M&h#l=QT0oSM~>ndR#{q z=oSbor65g<8@w$R)!ycLENYU-V1>fBY5W^K&d7-G@%)){_rrP?WK@GBV3nH1qlC6B zvO4kE#~44lelIA)rvyC}N8+T4V2E-w}`+q&NY=j(?+@x!x7R1-VLtYRL8=GZ;1ZQ z_DeJN+`UUkY`UfN3r)u8H~!W<(^5CrLscAKX{H7uzHV|Ho;@x&W}$7?|E^U;n3SxL zUn+>}KJV6SqjorSx&A{J=9}&MVG-^dx z;^M?xePwrxuG79TMik_VX`CkE%H5fGo#-R@<(clM^~f&>sOtFYkode|r@BmYZHvB& z>y-7wS_ESkvqemss++ows>B&uXrk*{EV8WEN&pD!ugcfuf;DjBbBqx$D*{rg>0Rt3 zD(MgzmDfo7EN{UB`|%ZpW(r2K*?Gv9u$5lb*ENi%xQN9*80+%%Z>+RZa*wb@W6IJf z2EuzT2`H-QcBD>)-Pytp=#p7o$}#RzYA=|UiVXWtg`|u7BO1)HjEvmgl$1bvMOzbn zb!oO}ii|G86L>PSvy*ebEL6x&aVKDfiacM|!a2s=_*u(1=%?9U-f05;c=1yg9(OCj zh;j2oKUr)aa)T?)GFj3L7V^?V+9zWBJU|+r*kECoZ@H%2csPGHKQRlf(3tf2l-*}N zeinJMmozCLuCR3asiAjs3Il#uJc5PuM>A(gBGoFoP>JSlh0Xj^fwgw_y73*LF_-hZ ze7T*>5ibF&_>f=oJUz5*|M59xY;v9KvT&*C=;I&tso?bTSDW8cUrOhc!@R(y$Hn$Q@(*|_|8c*-^2t(HF>hY)U0|!qt)N%MDxO;3nDzV2wZ$r}&iQt7 zjJ_{LTHEtwa5p*{S~3aB6Vog&pQV}lp!;Q8iW`mPJr83+;$dRJooUfQZ7h;e)88Q< zudUHP-_qR_chNyq_J=~D2xnnMh4Zu^&OMQ+QS|jiB`W+_LDGy&yE935wy$9x zOA^m=A{^T@-h2(_ouRtPdz9C^E;HTEzKTX+<}qnLYvPiHWA*5&*3u9rEx`INQFc;f z+9Y6=rjXl0#*)N#ESl&kVa3mgxJwGZ5>;9J0aKZl$@rcS=go*9N+Zt`Dx%B-DyFva z&YzgHTQx6ekZDegg_m{YRPJ)B-jc27Rhg|cj#$^X1gB(|5=cEi581!FPQOEX&>$@X z?{#HF01&48Hw{92&>*mzo2{eue^hACU`cab4$E&$SKS-Q6tLcdbs~lfdQ-2SN`;Yj;@#Yrqd-ML$r8YYvq7OdyClbdk4&QP{B_e^HXlzldQvr;h=-- zN@1rxvwkndA{s|k#Og@zAcF!^+CxFv0BNR19uZhSOOrIYWs2iEZZl|P-Hyqrs-m+` zP{k^p8sk3mYb0eoKXw@=FQHJGF8JrL_I~n{=9^#a;Gvt4W5{S)iE9kl$X7q>*s))y z@SAYlj*=>j5~|`?u`PwuR_3JU7x^>HtVI4em!{J4h#U&S;>${rh4Luf_}nMxbbYrK zmuhOEcleFWHoWo@(&Vorc#=5wKDxa3TPy<^qQid;XFe7??IqF`>@>0qiy?}_MFEq* zeQVn0n4XphZaXUZ#!Nc-qm6);d)-Mv-1B8{-mWM8>z;I_64Z#@XA8jyxMaLV)GFm7 zXmp+Tm(>Iw=_bN^$=cCqld4i=dy#eanxvIn)wq3wW$q@Uvp$qzKVwV=cfO3xaG><@5$DjEHcGosPa@vOUB z)3L+4-lQA4H)pRcJYtBooWSOJu1t>}rW>9Z2J0?AkBR!JO{3h*^7BMl3nP0~K>zmy z6r|S6^EGPc^l*DcX_CnP(~hW{TUgDW(>Bbo0-03qq*7XQnb){bCOA23&EOX}kiDCr zpO?1v^kNLq@1oqN>ginO>P>xF2tQLKESpke&(ZCxHB_5-f<0GOw+oiAaZeK3$W0x5 zOq<18pQ}a5S+~Rv(-M{f<_)A|p(GI_P-))Rj)of!y?t!LGm5rBJ{g|$Y>9%#r0G@-4pHlyqL1CJk-JHWbiE*tlADeIC9aHFi{opM3`f-_lOL` zLof?X8R8Q?ZM}jU!kr~V- zL{6sh$6_P?ias~ZLdIxv7{sDJ2ywU$ ztrU4FK7*{FYX1DPR=fL&ui_HNZ=NxCZDXfygYxq%qdy9|1AcAC;gj4ih-hezJLQb- zZiikXqJ!N+WJ8{wn#J$Q+P^MPD+RNDcJ??!LRK@sJZ#r8ShLYTwq6knxRNuJw1l+b zbQNA*mcl$*B9=Ujv(gBh%}o6oZ5O{@u2T}JP2b#1>v|AS>JRrYr?DD zoc@t!U)lb~n0mkGc{qsfWk=h_-ND=uWD9|Ey8Y4QaCWqgQdgBnMAC;|qkLdK}#;75`+XtDsH3;_2dG6VoAF)=d$fB=9S0Qdlav^1ck z1ZZgiMn-@X1nmhFUBLrg$rr=Y5`aJeKP$B7&jDXwKt@JJNl8gtTiejk(89vP-rnBb z&CSQhM>QBzEd)zF6jLJ%OFITjHvwBe8QVA=$25-4EC<)(HLg_|o^2(bLp{FBdxGb0 zncceyp7#)W_7Zya6L}2~`V15Kj}wOiKnwsR0YD}Ig(%UT3YVf+poJjdU|?>hli)9r>I{~(Wj7QjFDhp6fD8G z=q1^WrCOS4>|#|RI2t@njr?lc_Y6xHZ{2lO=s%Y?P@#`pSNg#%jLNC0NFh*ct-S04 zpGW-6x?1sD6|&|Z0>Tiv0%6e1063yf;5W^*uC4(cFK4daqk0%Ss}-s43o725DCV(L zJGhXt)ZtkFZr`h1rS;Xj7C!%t>HxYb@)JB$k^osjqLs`K$eK;ultz+Pk>tjGWYzpU zj|jPQwZbRX60qyp;*S)P&qfqJs4_4qf1*+Q7+&UNMcW#f-Rgm0VH_&vUys|?GBG!z zpz0imAJXx<1Aym>BjLs%rg(a4p`b8%M`A5ef;m+nh0FEIeDf7oPFze4B(kU@{fQo% zEq!C5EmB_kvLTA&J zgQN8=me0<)zBMO>cieSjJ4s`pJ}Xoo%rlSk{v2^9^V_#4-wqE4H>B>YH+_Az<`;5A z<}-btF|~I1luFz&K9_8{Qp`V`ppH!|yJ0jX@Sup@leqIdRyw}E;uT$rNH)jVS5*?`XWAWAjvL+8eDO2*^fbNN>Mf-&f1~)xyBY9w-`Prm-z8VPg42Tkal6$U zt|Bj`y;D;$#Pi$pxd86ieQE}P0Z;uNQjgJxwk#ZNV-AG-;ha3W-CM+IoH+P zK+hURTWgH4);q=Gc=)Wt1wSiLvGKgdSPw&B!>EOXE~3YR2_8*lX$_-Cd4edSV`QPZ z6UUl?Q*!Vn_36Zw<09_fPw6+c;<5<_y!BB(AM&IMeH{332B9?bx6k5o-T1NiB$##% zzTX8m4%3Ni<;PVu;fd(&8VS;$h&&2aaNz$CP1Y0& zr^*(mpocf$S%6zAK7~e_%|5cm=jH1%Z{urNc-G)0LeMzP4?*hPlQ?mR1aQ%? z%_yf(=~FLWXK9a#?bCQ^seZ~S zC|}yKZ3xkLo=UsDMrmO?L7X~pF{UKmHT~(unqACXie{O1RSUT283&82Vfyz1DQK1d zW~Db?(HEA~n-aS!qoPD#hqV2(^dwr-qHP`SqB_%TnN&Y(Yt$klui2u3b@Z=KYW1p0 ziAC5O^?~j;Irz@9@w9JD`j63uInE)D&wTUab{unkjdbEZ?VHbhb(vcvwwBYap)(6{ zBy_a7OZjGe7&1TW3Q~#uCIt{Mri`&kAR`2ebKQcSZAibc?(pKf4 ztW;&Cfe6<8PS#u`Fj=Ne@Rawjl9VRZ4{7DTg0cLoM&+X=?a=ob?w%5jhbt>Kq$;LY zR(MqK#~nA-+e|^4s95XtD(yGWsgp)icPTcf=Z?~g5z^Uy%5KiUI1GJx9EE2`KEA24 zEScxvS<%i)HeQSqzrsm6;v!+ zdE;bu)YpH@TMp>6D;6~}7d(QN(;4B61U&Z_PlK$IYp+y&*@~GXS@L0E`4FF$et{ z>UZaJc6G9L1w*0#jwJcb`JiqfH~0Ss?swy~f;fTP!2dSR-=Xe{X59b($N1nAXOJTp z@-M#p-L*M8IlDVQobq3Al)v$btpms!4CR!zb#nkYL;o-Mca=S8_h1K*qpcMf>c-(} zX*HTO>KMX>6?z~R2L3qzm=giPm1(HiF1M3ETn~ZsI0I*;Juc~)Mq&AO?(}+<9Pese zL*^ccY#_R>v`d@Mf|-6u!KU#$tH^tf=AtE$#re0alo{klb|FQ%EG^F+S%ghf!`KDU zAY=8fnLIO2#MD}8x@Lr26wvw_;*e1&Vx?_=Z1|E0e_TVc($#R=$xHA$rxK4|7AecC zLj}FnY>RkH^)l#jEQ<0_s9OkGi>gvDZ|aGLa994`TEAJ_RLE;FvqRRnvH6uqwBoNO zpWABojY3v^Q*6BVExg^QdXH9Vlg+Yt_SLrEi+bH{-ExfG5wBG@c*sH?e=M-ROxS8T zrqq$Ie%J*zoZCzy-0uQI{(BerJNMz=yHDkbwiLUfsvPHk`|*C8Uzwz0_kjy5>|8u- z;;o)tJqwL0L0ArzcpytGSr8x2CCcC)E2*dpa}ZHolGyq|n_$e_tNQv;6muR5(PPzB z1vsWQp84k+SBEqH2{-%T9e5IS=98b}(|26P)#S|B&4hz=aotjD`mU5f%Bx-&tJ|jB z_@{GA-JRjeHalO$pcZ4+31&fE$iw>)zD_C@a#CaMMQ@X1TW-GfLXMsG72zm%a8d524! zegs9*v(E%Y!7^qBXemnFL(M9yHrkgkUlxCe#JUXMwp}dW-=j##stq6AcaaUe}0eoP{sDkwC|gLs%iT>@XyI-)L*Fk7UaJB>!s)4 zaevMTJv>~$>=5g(iR!;2|D1Pt$Qb>yr2E_KzM$_v`J+Ejf5h>>=OliitO@@)L-BW( zUnl^0h|a%^_dc`r_Xz)2ZTRan{X+g%j^tP0;WtdbwBnyx{yLt5-?02uJN}vJA;SK$ z<=-&?ey7#@262aLb2=>Px# literal 0 HcmV?d00001 diff --git a/midi2cv/part.h b/midi2cv/part.h index 6180608..b93715d 100644 --- a/midi2cv/part.h +++ b/midi2cv/part.h @@ -5,50 +5,65 @@ enum MIDIThruMode { OFF, ON, POLYCHAIN }; -enum BiOutputMode { - PITCH_UNI, - PITCH_BI, - SAWTOOTH, - SQUARE, - SINE, - TRIANGLE +enum BiOutputType { + BI_OFF = 0, + BI_PITCH_UNI, + BI_PITCH_BI, + BI_SAWTOOTH, + BI_SQUARE, + BI_SINE, + BI_TRIANGLE }; -enum UniOutputMode { - PITCH, - VELOCITY, - AFTERTOUCH +enum UniOutputType { + UNI_OFF = 0, + UNI_PITCH, + UNI_VELOCITY, + UNI_MODULATION, + UNI_AFTERTOUCH, + UNI_BREATH, + UNI_EXP, + UNI_GATE }; -enum GateOutputMode { - GATE, - TRIGGER +enum GateOutputType { + GATE_OFF = 0, + GATE_GATE, + GATE_TRIGGER }; class Part { public: Part() - : voice_count(1) + : poly_voice_count(1) + , output_column_count(1) , midi_filter_channel_enabled(true) , midi_filter_channel(1) + , midi_filter_lowest_note(0) + , midi_filter_highest_note(127) , midi_thru_mode(OFF) - , output_mode_0(PITCH_UNI) - , output_mode_1(VELOCITY) - , output_mode_2(AFTERTOUCH) - , output_mode_3(GATE) { + for (int i = 0; i < 4; i++) { + output_type_row_0[i] = BI_OFF; + output_type_row_1[i] = UNI_OFF; + output_type_row_2[i] = UNI_OFF; + output_type_row_3[i] = GATE_OFF; + } } void ProcessMidiInput(/* TODO: Inputs */); private: - uint8_t voice_count; + uint8_t poly_voice_count; + uint8_t output_column_count; bool midi_filter_channel_enabled; uint8_t midi_filter_channel; + uint8_t midi_filter_lowest_note; + uint8_t midi_filter_highest_note; MIDIThruMode midi_thru_mode; - BiOutputMode output_mode_0; - UniOutputMode output_mode_1; - UniOutputMode output_mode_2; - GateOutputMode output_mode_3; + BiOutputType output_type_row_0[4]; + UniOutputType output_type_row_1[4]; + UniOutputType output_type_row_2[4]; + GateOutputType output_type_row_3[4]; }; #endif