@@ -1273,9 +1273,9 @@ void testMonitor() {
12731273 // Test basic note tracking via polling
12741274 {
12751275 GingoMonitor mon;
1276- mon.noteOn (60 , 100 ); // C4
1277- mon.noteOn (64 , 100 ); // E4
1278- mon.noteOn (67 , 100 ); // G4
1276+ mon.noteOn (1 , 60 , 100 ); // C4
1277+ mon.noteOn (1 , 64 , 100 ); // E4
1278+ mon.noteOn (1 , 67 , 100 ); // G4
12791279 // Should detect CM chord
12801280 CHECK (mon.hasChord (), " 3 notes β chord detected" );
12811281 CHECK (strcmp (mon.currentChord ().name (), " CM" ) == 0 , " C+E+G = CM" );
@@ -1284,23 +1284,23 @@ void testMonitor() {
12841284 // Note off removes note, chord may change
12851285 {
12861286 GingoMonitor mon;
1287- mon.noteOn (60 , 100 ); // C
1288- mon.noteOn (64 , 100 ); // E
1289- mon.noteOn (67 , 100 ); // G
1287+ mon.noteOn (1 , 60 , 100 ); // C
1288+ mon.noteOn (1 , 64 , 100 ); // E
1289+ mon.noteOn (1 , 67 , 100 ); // G
12901290 CHECK (mon.hasChord (), " CM detected before noteOff" );
1291- mon.noteOff (67 ); // remove G
1291+ mon.noteOff (1 , 67 ); // remove G
12921292 // C+E alone β not enough for a chord
12931293 CHECK (!mon.hasChord (), " C+E alone not a chord" );
12941294 }
12951295
12961296 // Sustain pedal keeps notes
12971297 {
12981298 GingoMonitor mon;
1299- mon.noteOn (60 , 100 ); // C
1300- mon.noteOn (64 , 100 ); // E
1301- mon.noteOn (67 , 100 ); // G
1299+ mon.noteOn (1 , 60 , 100 ); // C
1300+ mon.noteOn (1 , 64 , 100 ); // E
1301+ mon.noteOn (1 , 67 , 100 ); // G
13021302 mon.sustainOn ();
1303- mon.noteOff (67 ); // G sustained
1303+ mon.noteOff (1 , 67 ); // G sustained
13041304 // Chord should still be detected (G is sustained)
13051305 CHECK (mon.hasChord (), " sustain keeps chord" );
13061306 CHECK (strcmp (mon.currentChord ().name (), " CM" ) == 0 , " sustained chord still CM" );
@@ -1311,14 +1311,62 @@ void testMonitor() {
13111311 // Reset clears everything
13121312 {
13131313 GingoMonitor mon;
1314- mon.noteOn (60 , 100 );
1315- mon.noteOn (64 , 100 );
1316- mon.noteOn (67 , 100 );
1314+ mon.noteOn (1 , 60 , 100 );
1315+ mon.noteOn (1 , 64 , 100 );
1316+ mon.noteOn (1 , 67 , 100 );
13171317 CHECK (mon.hasChord (), " chord before reset" );
13181318 mon.reset ();
13191319 CHECK (!mon.hasChord (), " reset clears chord" );
13201320 }
13211321
1322+ // Channel filter β setChannel / channel()
1323+ {
1324+ GingoMonitor mon;
1325+ mon.setChannel (2 );
1326+ CHECK (mon.channel () == 2 , " setChannel(2) stored" );
1327+
1328+ // Events on channel 2 must pass
1329+ mon.noteOn (2 , 60 , 100 );
1330+ mon.noteOn (2 , 64 , 100 );
1331+ mon.noteOn (2 , 67 , 100 );
1332+ CHECK (mon.hasChord (), " channel 2 events accepted" );
1333+
1334+ // Events on channel 1 must be silently ignored
1335+ mon.reset ();
1336+ mon.noteOn (1 , 60 , 100 );
1337+ mon.noteOn (1 , 64 , 100 );
1338+ mon.noteOn (1 , 67 , 100 );
1339+ CHECK (!mon.hasChord (), " channel 1 events rejected by filter" );
1340+ }
1341+
1342+ // Channel filter 0 = accept all
1343+ {
1344+ GingoMonitor mon;
1345+ mon.setChannel (0 );
1346+ mon.noteOn (3 , 60 , 100 );
1347+ mon.noteOn (5 , 64 , 100 );
1348+ mon.noteOn (9 , 67 , 100 );
1349+ CHECK (mon.hasChord (), " channel filter 0 accepts all channels" );
1350+ }
1351+
1352+ // noteOff filtered too
1353+ {
1354+ GingoMonitor mon;
1355+ mon.setChannel (1 );
1356+ mon.noteOn (1 , 60 , 100 );
1357+ mon.noteOn (1 , 64 , 100 );
1358+ mon.noteOn (1 , 67 , 100 );
1359+ CHECK (mon.hasChord (), " noteOff filter test: CM detected ch1" );
1360+
1361+ // noteOff on wrong channel must not remove note
1362+ mon.noteOff (2 , 67 );
1363+ CHECK (mon.hasChord (), " noteOff on ch2 ignored, chord remains" );
1364+
1365+ // noteOff on correct channel removes note
1366+ mon.noteOff (1 , 67 );
1367+ CHECK (!mon.hasChord (), " noteOff on ch1 removes note, chord gone" );
1368+ }
1369+
13221370#if GINGODUINO_TIER >= 3
13231371 // Lambda callback (std::function, Tier 3)
13241372 {
@@ -1328,16 +1376,16 @@ void testMonitor() {
13281376 (void )ctx;
13291377 noteCount++;
13301378 });
1331- mon.noteOn (60 , 100 );
1332- mon.noteOn (64 , 100 );
1379+ mon.noteOn (1 , 60 , 100 );
1380+ mon.noteOn (1 , 64 , 100 );
13331381 CHECK (noteCount == 2 , " onNoteOn lambda called 2 times" );
13341382
13351383 bool chordFired = false ;
13361384 mon.onChordDetected ([&chordFired](const GingoChord& c) {
13371385 (void )c;
13381386 chordFired = true ;
13391387 });
1340- mon.noteOn (67 , 100 ); // completes CM
1388+ mon.noteOn (1 , 67 , 100 ); // completes CM
13411389 CHECK (chordFired, " onChordDetected lambda fired" );
13421390 }
13431391#endif
0 commit comments