diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml index 295be0b3..bb91f0f0 100644 --- a/diylc/diylc-core/src/main/resources/update.xml +++ b/diylc/diylc-core/src/main/resources/update.xml @@ -397,6 +397,10 @@ 2026-08-06 00:00:00.000 CET + + NEW_FEATURE + Added support for stacked guitar pickups: 'Stacked - North' and 'Stacked - South' are two new options to pick in the Coil(s) property of Single Coil, P-90, P-Bass and Jazz Bass pickups + NEW_FEATURE Added 'Node Name Tooltips' feature that can be toggled in the Config menu; when enabled a tooltip is shown next to the cursor with names of component nodes under the cursor diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/AbstractGuitarPickup.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/AbstractGuitarPickup.java index e67630e2..84e2e093 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/AbstractGuitarPickup.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/AbstractGuitarPickup.java @@ -294,8 +294,13 @@ public abstract class AbstractGuitarPickup extends AbstractLabeledComponent"; else if (index1 == 2 && index2 == 1) diff --git a/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java b/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java index 8e9510d5..976e4fbe 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java +++ b/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java @@ -182,20 +182,25 @@ public class GuitarDiagramAnalyzer extends AbstractNetlistAnalyzer implements IN @Override public void visit(TreeLeaf l) { - if ((l.toString().toLowerCase().contains("north") - && (l.toString().toLowerCase().contains("->"))) - || (l.toString().toLowerCase().contains("south") - && (l.toString().toLowerCase().contains("<-")))) - noiseCount++; - if ((l.toString().toLowerCase().contains("north") - && (l.toString().toLowerCase().contains("<-"))) - || (l.toString().toLowerCase().contains("south") - && (l.toString().toLowerCase().contains("->")))) - noiseCount--; + String s = l.toString().toLowerCase(); + boolean isStacked = s.contains("stacked"); - if (l.toString().toLowerCase().contains("->")) + if (!isStacked) { + if ((s.contains("north") + && (s.contains("->"))) + || (s.contains("south") + && (s.contains("<-")))) + noiseCount++; + if ((s.contains("north") + && (s.contains("<-"))) + || (s.contains("south") + && (s.contains("->")))) + noiseCount--; + } + + if (s.contains("->")) positiveCount++; - if (l.toString().toLowerCase().contains("<-")) + if (s.contains("<-")) negativeCount++; } }); @@ -224,8 +229,9 @@ public class GuitarDiagramAnalyzer extends AbstractNetlistAnalyzer implements IN } else { TreeLeaf leaf = new TreeLeaf(pickup, 1, 2); Tree t = tree.locate(leaf, false); - if (t != null) + if (t != null) { pickupRoots.put(pickup, t); + } } } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/netlist/GuitarDiagramAnalyzerTests.java b/diylc/diylc-library/src/test/java/org/diylc/netlist/GuitarDiagramAnalyzerTests.java index e3c24213..c389ff8d 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/netlist/GuitarDiagramAnalyzerTests.java +++ b/diylc/diylc-library/src/test/java/org/diylc/netlist/GuitarDiagramAnalyzerTests.java @@ -19,13 +19,16 @@ package org.diylc.netlist; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.util.Arrays; +import java.util.List; import org.diylc.components.passive.AxialFilmCapacitor; import org.diylc.components.passive.Resistor; import org.junit.Test; import org.diylc.components.electromechanical.OpenJack1_4; +import org.diylc.components.guitar.AbstractGuitarPickup.Polarity; import org.diylc.components.guitar.HumbuckerPickup; import org.diylc.components.guitar.SingleCoilPickup; import org.diylc.components.passive.PotentiometerPanel; @@ -328,4 +331,155 @@ public class GuitarDiagramAnalyzerTests { "((Volume.3-2 + ((Pickup1.North<- + Pickup1.South<-) || (Pickup2.North<- + Pickup2.South<-) || (Tone1.2-1 + Cap1) || (Tone2.2-1 + Cap2))) || Volume.2-1)", s); } + + @Test + public void testOneStackedNorthPickup() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup = new SingleCoilPickup(); + pickup.setName("Pickup"); + pickup.setPolarity(Polarity.StackedNorth); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 1); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 2); + netlist.add(tipGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("Pickup.StackedNorth<-", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("This configuration is hum-cancelling")); + assertTrue(notes.contains("'Pickup' is the only engaged pickup")); + } + + @Test + public void testOneStackedSouthPickup() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup = new SingleCoilPickup(); + pickup.setName("Pickup"); + pickup.setPolarity(Polarity.StackedSouth); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 1); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 2); + netlist.add(tipGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("Pickup.StackedSouth<-", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("This configuration is hum-cancelling")); + } + + @Test + public void testOneStackedPickupReverse() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup = new SingleCoilPickup(); + pickup.setName("Pickup"); + pickup.setPolarity(Polarity.StackedNorth); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 1); + netlist.add(tipGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("Pickup.StackedNorth->", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("This configuration is hum-cancelling")); + } + + @Test + public void testTwoStackedPickupsParallel() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup1 = new SingleCoilPickup(); + pickup1.setName("Pickup1"); + pickup1.setPolarity(Polarity.StackedNorth); + SingleCoilPickup pickup2 = new SingleCoilPickup(); + pickup2.setName("Pickup2"); + pickup2.setPolarity(Polarity.StackedSouth); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 1); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 2); + netlist.add(tipGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("(Pickup1.StackedNorth<- || Pickup2.StackedSouth<-)", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("This configuration is hum-cancelling")); + assertTrue(notes.contains("All pickup coils are wired in-phase")); + } + + @Test + public void testTwoStackedPickupsParallelOutOfPhase() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup1 = new SingleCoilPickup(); + pickup1.setName("Pickup1"); + pickup1.setPolarity(Polarity.StackedNorth); + SingleCoilPickup pickup2 = new SingleCoilPickup(); + pickup2.setName("Pickup2"); + pickup2.setPolarity(Polarity.StackedSouth); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 1); + netlist.add(tipGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("(Pickup1.StackedNorth<- || Pickup2.StackedSouth->)", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("This configuration is hum-cancelling")); + assertTrue(notes.contains("Some pickup coils are wired OUT-of-phase")); + } + + @Test + public void testStackedPickupAndSingleCoilParallel() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup1 = new SingleCoilPickup(); + pickup1.setName("Pickup1"); + pickup1.setPolarity(Polarity.StackedNorth); + SingleCoilPickup pickup2 = new SingleCoilPickup(); + pickup2.setName("Pickup2"); + pickup2.setPolarity(Polarity.North); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 1); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 2); + netlist.add(tipGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("(Pickup1.StackedNorth<- || Pickup2.North<-)", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("This configuration is NOT hum-cancelling")); + assertTrue(notes.contains("All pickup coils are wired in-phase")); + } + + @Test + public void testStackedPickupAndHumbuckerParallel() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup1 = new SingleCoilPickup(); + pickup1.setName("Pickup1"); + pickup1.setPolarity(Polarity.StackedNorth); + HumbuckerPickup pickup2 = new HumbuckerPickup(); + pickup2.setName("Pickup2"); + Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2)); + Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 0); + Group coilTapGroup = new Group().connect(pickup2, 1).connect(pickup2, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 3); + netlist.add(tipGroup).add(coilTapGroup).add(sleeveGroup); + GuitarDiagramAnalyzer analyzer = new GuitarDiagramAnalyzer(); + Tree tree = analyzer.constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup2.North<- + Pickup2.South<-) || Pickup1.StackedNorth<-)", s); + + List notes = analyzer.collectNotes(netlist); + assertTrue(notes.contains("'Pickup2' pickup wired in humbucking mode with series coils")); + assertTrue(notes.contains("This configuration is hum-cancelling")); + assertTrue(notes.contains("All pickup coils are wired in-phase")); + } }