@@ -112,6 +112,10 @@ const modeColourPool = {
112
112
"sd" : [ "ffe1a5" , "804e00" ] ,
113
113
"sg" : [ "ffdddd" , "990022" ]
114
114
} ;
115
+ /*const modeGlobalClasses = [];
116
+ for (let mode in modeNames) {
117
+ modeGlobalClasses.push(`cambiare-mode-${mode}`);
118
+ };*/
115
119
116
120
piMulti . forEach ( ( e , i , a ) => {
117
121
a [ i ] = Math . PI * i / 12 ;
@@ -239,6 +243,8 @@ let Cambiare = class extends RootDisplay {
239
243
#canvas;
240
244
#pixelProfile;
241
245
#accent = "fcdaff" ;
246
+ #chAccent = new Array ( allocated . ch ) ;
247
+ #chMode = new Array ( allocated . ch ) ;
242
248
#foreground = "ffffff" ;
243
249
#mode = "?" ;
244
250
#sectInfo = { } ;
@@ -253,7 +259,7 @@ let Cambiare = class extends RootDisplay {
253
259
#style = "comb" ;
254
260
glyphs = new MxFont40 ( ) ;
255
261
panStyle = 11 ; // Block, Pin, Arc, Dash
256
- #drawNote( context , note , velo , state = 0 , pitch = 0 ) {
262
+ #drawNote( context , note , velo , state = 0 , pitch = 0 , part ) {
257
263
// Param calculation
258
264
let upThis = this ;
259
265
let { width, height} = context . canvas ;
@@ -290,7 +296,7 @@ let Cambiare = class extends RootDisplay {
290
296
} ;
291
297
} ;
292
298
// Colours
293
- context . fillStyle = `#${ isBlackKey ? ( upThis . #accent ) : ( upThis . #foreground) } ${ ( ( velo << 1 ) | ( velo >> 6 ) ) . toString ( 16 ) . padStart ( 2 , "0" ) } ` ;
299
+ context . fillStyle = `#${ isBlackKey ? ( upThis . getChAccent ( part ) ) : ( upThis . #foreground) } ${ ( ( velo << 1 ) | ( velo >> 6 ) ) . toString ( 16 ) . padStart ( 2 , "0" ) } ` ;
294
300
context . strokeStyle = context . fillStyle ;
295
301
context . lineWidth = range == 1 ? 4 : 2 ;
296
302
context . lineDashOffset = 0 ;
@@ -360,7 +366,7 @@ let Cambiare = class extends RootDisplay {
360
366
let context = upThis . #sectPart[ part >> 4 ] [ part & 15 ] . cxt ;
361
367
context . clearRect ( 0 , 0 , context . canvas . width , context . canvas . height ) ;
362
368
sum . chKeyPr [ part ] . forEach ( ( { v, s} , note ) => {
363
- upThis . #drawNote( context , note , v , s , upThis . device . getPitchShift ( part ) ) ;
369
+ upThis . #drawNote( context , note , v , s , upThis . device . getPitchShift ( part ) , part ) ;
364
370
} ) ;
365
371
} ;
366
372
} ) ;
@@ -429,13 +435,13 @@ let Cambiare = class extends RootDisplay {
429
435
chOff = part * allocated . cc ,
430
436
aceOff = part * allocated . ace ,
431
437
e = upThis . #sectPart[ port ] [ part & 15 ] ;
432
- if ( sum . chInUse [ part ] && port >= upThis . #renderPort && port < renderPortMax ) {
438
+ if ( visualizer . device . getActive ( ) [ part ] && port >= upThis . #renderPort && port < renderPortMax ) {
433
439
// Render CC draw calls
434
440
ccCandidates [ 8 ] = sum . ace [ aceOff + 0 ] || 256 ;
435
441
ccCandidates [ 9 ] = sum . ace [ aceOff + 1 ] || 256 ;
436
442
e . ccVis . clearRect ( 0 , 0 , 109 , 25 ) ;
437
- e . ccVis . fillStyle = `#${ upThis . #accent } ` ;
438
- e . ccVis . strokeStyle = `#${ upThis . #accent } ` ;
443
+ e . ccVis . fillStyle = `#${ upThis . getChAccent ( part ) } ` ;
444
+ e . ccVis . strokeStyle = `#${ upThis . getChAccent ( part ) } ` ;
439
445
e . ccVis . lineWidth = 2 ;
440
446
for ( let cci = 0 ; cci < ccCandidates . length ; cci ++ ) {
441
447
let cce = ccCandidates [ cci ] ;
@@ -601,7 +607,7 @@ let Cambiare = class extends RootDisplay {
601
607
e . extVis . lineTo ( 7 + velocity , 12 ) ;
602
608
e . extVis . lineTo ( 0 , 12 + mouth + 3 ) ;
603
609
e . extVis . fill ( ) ;
604
- e . extVis . fillStyle = `#${ upThis . #accent } ` ;
610
+ e . extVis . fillStyle = `#${ upThis . getChAccent ( part ) } ` ;
605
611
e . extVis . beginPath ( ) ;
606
612
e . extVis . ellipse ( 43 , 12 , 4 , 4 + breathNoise , 0 , 0 , fullRotation ) ;
607
613
e . extVis . fill ( ) ;
@@ -612,7 +618,7 @@ let Cambiare = class extends RootDisplay {
612
618
let dxView = sum . chContr . subarray ( chOff + ccToPos [ 142 ] , chOff + ccToPos [ 157 ] + 1 ) ;
613
619
dxView . forEach ( ( v , i ) => {
614
620
if ( i >= 8 ) {
615
- e . extVis . fillStyle = `#${ upThis . #accent } ` ;
621
+ e . extVis . fillStyle = `#${ upThis . getChAccent ( part ) } ` ;
616
622
} ;
617
623
let x = i * 3 ;
618
624
let size = ( v - 64 ) / 5.82 ;
@@ -650,7 +656,7 @@ let Cambiare = class extends RootDisplay {
650
656
sum . extraNotes . forEach ( ( ev ) => {
651
657
let { part, note, velo, state} = ev ;
652
658
let context = upThis . #sectPart[ part >> 4 ] [ part & 15 ] . cxt ;
653
- upThis . #drawNote( context , note , velo , state , upThis . device . getPitchShift ( part ) ) ;
659
+ upThis . #drawNote( context , note , velo , state , upThis . device . getPitchShift ( part ) , part ) ;
654
660
//console.debug(part, note);
655
661
} ) ;
656
662
// Write to the new pixel display buffers
@@ -775,6 +781,24 @@ let Cambiare = class extends RootDisplay {
775
781
classOff ( upThis . #canvas, [ `cambiare-style-block` , `cambiare-style-comb` , `cambiare-style-piano` , `cambiare-style-line` ] ) ;
776
782
classOn ( upThis . #canvas, [ `cambiare-style-${ value } ` ] ) ;
777
783
} ;
784
+ getChMode ( part = 0 , disableFallback ) {
785
+ if ( part >= allocated . ch ) {
786
+ throw ( new RangeError ( "Invalid part number" ) ) ;
787
+ } ;
788
+ let upThis = this ;
789
+ if ( disableFallback ) {
790
+ return upThis . #chMode[ part ] ;
791
+ } else {
792
+ return upThis . #chMode[ part ] ?? upThis . #mode;
793
+ } ;
794
+ } ;
795
+ getChAccent ( part = 0 ) {
796
+ if ( part >= allocated . ch ) {
797
+ throw ( new RangeError ( "Invalid part number" ) ) ;
798
+ } ;
799
+ let upThis = this ;
800
+ return upThis . #chAccent[ part ] ?? upThis . #accent;
801
+ } ;
778
802
setClockSource ( clockSource ) {
779
803
this . #clockSource = clockSource ;
780
804
} ;
@@ -797,19 +821,48 @@ let Cambiare = class extends RootDisplay {
797
821
} ;
798
822
setMode ( mode ) {
799
823
let upThis = this ;
800
- classOff ( upThis . #canvas, [ `cambiare-mode-gm` , `cambiare-mode-xg` , `cambiare-mode-gs` , `cambiare-mode-sc` , `cambiare-mode-ns5r` , `cambiare-mode-05rw` , `cambiare-mode-x5d` , `cambiare-mode-k11` , `cambiare-mode-sg` , `cambiare-mode-g2` , `cambiare-mode-mt32` , `cambiare-mode-doc` , `cambiare-mode-qy10` , `cambiare-mode-qy20` , `cambiare-mode-sd` , `cambiare-mode-krs` , `cambiare-mode-s90es` , `cambiare-mode-motif` ] ) ;
801
- if ( mode != "?" ) {
802
- classOn ( upThis . #canvas, [ `cambiare-mode-${ mode } ` ] ) ;
803
- } ;
804
824
upThis . #mode = mode ;
805
825
upThis . #accent = ( modeColourPool [ mode ] || [ "fcdaff" , "742b81" ] ) [ upThis . #scheme] ;
826
+ //classOff(upThis.#canvas, modeGlobalClasses);
827
+ for ( let className of upThis . #canvas. classList ) {
828
+ if ( className . substring ( 0 , 14 ) === "cambiare-mode-" ) {
829
+ upThis . #canvas. classList . remove ( className ) ;
830
+ } ;
831
+ } ;
832
+ if ( mode != "?" ) {
833
+ upThis . #canvas. classList . add ( `cambiare-mode-${ mode } ` ) ;
834
+ } ;
835
+ } ;
836
+ setChMode ( part , mode ) {
837
+ let upThis = this ;
838
+ upThis . #chMode[ part ] = mode ;
839
+ let partViewer = upThis . #sectPart[ part >> 4 ] [ part & 15 ] ;
840
+ for ( let className of partViewer . root . classList ) {
841
+ if ( className . substring ( 0 , 10 ) == "part-mode-" ) {
842
+ partViewer . root . classList . remove ( className ) ;
843
+ } ;
844
+ } ;
845
+ if ( mode != "?" ) {
846
+ partViewer . root . classList . add ( `part-mode-${ mode } ` ) ;
847
+ } ;
806
848
} ;
807
849
setScheme ( scheme = 0 ) {
808
850
let upThis = this ;
809
851
upThis . #scheme = scheme ? 1 : 0 ;
810
852
upThis . #foreground = [ "ffffff" , "000000" ] [ upThis . #scheme] ;
811
853
[ classOff , classOn ] [ upThis . #scheme] ( upThis . #canvas, [ `cambiare-scheme-light` ] ) ;
812
854
upThis . #accent = ( modeColourPool [ upThis . #mode] || [ "fcdaff" , "742b81" ] ) [ upThis . #scheme] ;
855
+ for ( let part = 0 ; part < allocated . ch ; part ++ ) {
856
+ if ( upThis . device . getChActive ( part ) === 0 ) {
857
+ continue ;
858
+ } ;
859
+ if ( upThis . #chAccent[ part ] ) {
860
+ let targetColour = modeColourPool [ upThis . #chMode[ part ] ] ;
861
+ if ( targetColour ) {
862
+ upThis . #chAccent[ part ] = targetColour [ upThis . #scheme] ;
863
+ } ;
864
+ } ;
865
+ } ;
813
866
} ;
814
867
#setPortView( canvasUpdate ) {
815
868
let upThis = this ;
@@ -1270,6 +1323,8 @@ let Cambiare = class extends RootDisplay {
1270
1323
let upThis = this ;
1271
1324
upThis . #resizer = upThis . #resizerSrc. bind ( this ) ;
1272
1325
upThis . #renderer = upThis . #rendererSrc. bind ( this ) ;
1326
+ upThis . #chAccent. fill ( null ) ;
1327
+ upThis . #chMode. fill ( null ) ;
1273
1328
if ( attachElement ) {
1274
1329
upThis . attach ( attachElement ) ;
1275
1330
} ;
@@ -1284,6 +1339,8 @@ let Cambiare = class extends RootDisplay {
1284
1339
upThis . #metaType = "" ;
1285
1340
upThis . #metaLastLine = null ;
1286
1341
upThis . #underlinedCh = allocated . invalidCh ;
1342
+ upThis . #chAccent. fill ( null ) ;
1343
+ upThis . #chMode. fill ( null ) ;
1287
1344
try {
1288
1345
// Remove all meta
1289
1346
let list = upThis . #sectMeta. view . children ;
@@ -1315,6 +1372,18 @@ let Cambiare = class extends RootDisplay {
1315
1372
upThis.#noteEvents.push(data);
1316
1373
//console.debug(data);
1317
1374
});*/
1375
+ upThis . addEventListener ( "chmode" , ( { data} ) => {
1376
+ let { part, mode} = data ;
1377
+ /* classOn(upThis.#sectPart[part >> 4][part & 15]?.root, [
1378
+ `part-mode-${mode}`
1379
+ ]); */
1380
+ upThis . setChMode ( part , mode ) ;
1381
+ let resultColour = modeColourPool [ mode ] ;
1382
+ if ( resultColour ) {
1383
+ upThis . #chAccent[ part ] = resultColour [ upThis . #scheme] ;
1384
+ } ;
1385
+ console . debug ( part , mode ) ;
1386
+ } ) ;
1318
1387
upThis . addEventListener ( "pitch" , ( { data} ) => {
1319
1388
upThis . #pitchEvents. push ( data ) ;
1320
1389
} ) ;
0 commit comments