better integration of generic flag

This commit is contained in:
hneemann 2019-06-28 20:23:53 +02:00
parent 9013bd6fbe
commit 3354028b11
11 changed files with 216 additions and 169 deletions

View File

@ -7,7 +7,6 @@ package de.neemann.digital.core.element;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.draw.elements.PinException;
import de.neemann.digital.gui.Main;
import de.neemann.digital.lang.Lang;
import java.lang.reflect.Constructor;
@ -71,8 +70,6 @@ public class ElementTypeDescription {
if (p.getDirection() != PinDescription.Direction.input)
throw new RuntimeException("pin direction error");
attributeList = new ArrayList<>();
if (Main.isExperimentalMode())
attributeList.add(Keys.GENERIC);
}
/**

View File

@ -790,4 +790,10 @@ public final class Keys {
public static final Key<String> GENERIC =
new Key.LongString("generic").allowGroupEdit();
/**
* Circuit is generic
*/
public static final Key<Boolean> IS_GENERIC =
new Key<Boolean>("isGeneric", false).setSecondary();
}

View File

@ -79,6 +79,8 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
ATTR_LIST.add(Keys.PRELOAD_PROGRAM);
ATTR_LIST.add(Keys.PROGRAM_TO_PRELOAD);
ATTR_LIST.add(Keys.TRANSISTORS);
if (Main.isExperimentalMode())
ATTR_LIST.add(Keys.IS_GENERIC);
}
/**
@ -1021,14 +1023,13 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
}
private void editAttributes(VisualElement element, MouseEvent e) {
String name = element.getElementName();
try {
ElementTypeDescription elementType = library.getElementType(name);
ArrayList<Key> list = elementType.getAttributeList();
ArrayList<Key> list = getAttributeList(element);
if (list.size() > 0) {
Point p = new Point(e.getX(), e.getY());
SwingUtilities.convertPointToScreen(p, CircuitComponent.this);
AttributeDialog attributeDialog = new AttributeDialog(parent, p, list, element.getElementAttributes()).setVisualElement(element);
ElementTypeDescription elementType = library.getElementType(element.getElementName());
if (elementType instanceof ElementLibrary.ElementTypeDescriptionCustom) {
attributeDialog.addButton(Lang.get("attr_openCircuitLabel"), new ToolTipAction(Lang.get("attr_openCircuit")) {
@Override
@ -1179,7 +1180,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
for (VisualElement ve : getCircuit().getElements())
if (ve.matches(min, max)) {
elementList.add(ve);
for (Key k : library.getElementType(ve.getElementName()).getAttributeList()) {
for (Key k : getAttributeList(ve)) {
if (k.isGroupEditAllowed()) {
if (keyList.contains(k)) {
if (!ve.getElementAttributes().get(k).equals(attr.get(k))) {
@ -1207,7 +1208,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
if (ad.getCheckBoxes().get(key).isSelected()) {
Object newVal = mod.get(key);
for (VisualElement ve : elementList) {
if (library.getElementType(ve.getElementName()).getAttributeList().contains(key)) {
if (getAttributeList(ve).contains(key)) {
if (!ve.getElementAttributes().get(key).equals(newVal))
modBuilder.add(new ModifyAttribute<>(ve, key, newVal));
}
@ -1218,10 +1219,19 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
}
} catch (ElementNotFoundException e) {
// Do nothing if an element is not in library
// Do nothing if an element is not in the library
}
}
private ArrayList<Key> getAttributeList(VisualElement ve) throws ElementNotFoundException {
ArrayList<Key> list = library.getElementType(ve.getElementName()).getAttributeList();
if (getCircuit().getAttributes().get(Keys.IS_GENERIC)) {
list = new ArrayList<>(list);
list.add(Keys.GENERIC);
}
return list;
}
/**
* @return true if circuit is modified
*/

View File

@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<circuit>
<version>1</version>
<attributes/>
<attributes>
<entry>
<string>isGeneric</string>
<boolean>true</boolean>
</entry>
</attributes>
<visualElements>
<visualElement>
<elementName>In</elementName>

View File

@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<circuit>
<version>1</version>
<attributes/>
<attributes>
<entry>
<string>isGeneric</string>
<boolean>true</boolean>
</entry>
</attributes>
<visualElements>
<visualElement>
<elementName>In</elementName>
@ -11,7 +16,7 @@
<string>en</string>
</entry>
</elementAttributes>
<pos x="-140" y="660"/>
<pos x="-100" y="580"/>
</visualElement>
<visualElement>
<elementName>Clock</elementName>
@ -33,7 +38,7 @@
<int>2</int>
</entry>
</elementAttributes>
<pos x="620" y="240"/>
<pos x="620" y="260"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@ -43,7 +48,7 @@
<string>dir</string>
</entry>
</elementAttributes>
<pos x="-140" y="280"/>
<pos x="-100" y="280"/>
</visualElement>
<visualElement>
<elementName>Out</elementName>
@ -61,7 +66,7 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="740" y="180"/>
<pos x="740" y="200"/>
</visualElement>
<visualElement>
<elementName>Out</elementName>
@ -71,7 +76,7 @@
<string>ovf</string>
</entry>
</elementAttributes>
<pos x="740" y="620"/>
<pos x="740" y="540"/>
</visualElement>
<visualElement>
<elementName>D_FF</elementName>
@ -89,7 +94,7 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="640" y="180"/>
<pos x="640" y="200"/>
</visualElement>
<visualElement>
<elementName>Multiplexer</elementName>
@ -103,7 +108,7 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="400" y="140"/>
<pos x="400" y="160"/>
</visualElement>
<visualElement>
<elementName>Multiplexer</elementName>
@ -131,12 +136,12 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="40" y="160"/>
<pos x="80" y="160"/>
</visualElement>
<visualElement>
<elementName>Ground</elementName>
<elementAttributes/>
<pos x="20" y="220"/>
<pos x="60" y="220"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -150,12 +155,12 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="-60" y="160"/>
<pos x="-20" y="160"/>
</visualElement>
<visualElement>
<elementName>And</elementName>
<elementAttributes/>
<pos x="360" y="600"/>
<pos x="360" y="520"/>
</visualElement>
<visualElement>
<elementName>Multiplexer</elementName>
@ -169,7 +174,7 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="-40" y="160"/>
<pos x="0" y="160"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -187,7 +192,7 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="-60" y="200"/>
<pos x="-20" y="200"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@ -223,7 +228,7 @@
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="240" y="580"/>
<pos x="240" y="500"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -246,7 +251,7 @@ if (orig.maxValue=0) {
}</string>
</entry>
</elementAttributes>
<pos x="-60" y="580"/>
<pos x="-20" y="500"/>
</visualElement>
<visualElement>
<elementName>Or</elementName>
@ -300,7 +305,7 @@ if (orig.maxValue=0) {
</inverterConfig>
</entry>
</elementAttributes>
<pos x="20" y="300"/>
<pos x="60" y="300"/>
</visualElement>
<visualElement>
<elementName>Multiplexer</elementName>
@ -314,7 +319,7 @@ if (orig.maxValue=0) {
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="560" y="160"/>
<pos x="560" y="180"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@ -338,7 +343,7 @@ if (orig.maxValue=0) {
<string>clr</string>
</entry>
</elementAttributes>
<pos x="-140" y="440"/>
<pos x="-100" y="440"/>
</visualElement>
<visualElement>
<elementName>Multiplexer</elementName>
@ -356,7 +361,7 @@ if (orig.maxValue=0) {
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="160" y="580"/>
<pos x="160" y="500"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -374,12 +379,12 @@ if (orig.maxValue=0) {
<string>this.Bits=orig.Bits;</string>
</entry>
</elementAttributes>
<pos x="140" y="620"/>
<pos x="140" y="540"/>
</visualElement>
<visualElement>
<elementName>XOr</elementName>
<elementAttributes/>
<pos x="-120" y="400"/>
<pos x="-80" y="400"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -395,12 +400,12 @@ if (orig.maxValue=0) {
}</string>
</entry>
</elementAttributes>
<pos x="-140" y="400"/>
<pos x="-100" y="400"/>
</visualElement>
<visualElement>
<elementName>XOr</elementName>
<elementAttributes/>
<pos x="-120" y="620"/>
<pos x="-80" y="540"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -416,12 +421,12 @@ if (orig.maxValue=0) {
}</string>
</entry>
</elementAttributes>
<pos x="-140" y="620"/>
<pos x="-100" y="540"/>
</visualElement>
<visualElement>
<elementName>XOr</elementName>
<elementAttributes/>
<pos x="-120" y="240"/>
<pos x="-80" y="240"/>
</visualElement>
<visualElement>
<elementName>Const</elementName>
@ -437,7 +442,7 @@ if (orig.maxValue=0) {
}</string>
</entry>
</elementAttributes>
<pos x="-140" y="240"/>
<pos x="-100" y="240"/>
</visualElement>
<visualElement>
<elementName>XOr</elementName>
@ -507,107 +512,99 @@ if (orig.inverterConfig.in) {
</visualElements>
<wires>
<wire>
<p1 x="440" y="160"/>
<p2 x="560" y="160"/>
<p1 x="60" y="160"/>
<p2 x="80" y="160"/>
</wire>
<wire>
<p1 x="20" y="160"/>
<p2 x="40" y="160"/>
<p1 x="-20" y="160"/>
<p2 x="0" y="160"/>
</wire>
<wire>
<p1 x="-60" y="160"/>
<p2 x="-40" y="160"/>
</wire>
<wire>
<p1 x="100" y="160"/>
<p1 x="140" y="160"/>
<p2 x="320" y="160"/>
</wire>
<wire>
<p1 x="80" y="320"/>
<p1 x="380" y="160"/>
<p2 x="400" y="160"/>
</wire>
<wire>
<p1 x="120" y="320"/>
<p2 x="300" y="320"/>
</wire>
<wire>
<p1 x="-60" y="640"/>
<p2 x="340" y="640"/>
</wire>
<wire>
<p1 x="340" y="640"/>
<p2 x="360" y="640"/>
</wire>
<wire>
<p1 x="-60" y="420"/>
<p2 x="-20" y="420"/>
</wire>
<wire>
<p1 x="-20" y="420"/>
<p2 x="20" y="420"/>
</wire>
<wire>
<p1 x="20" y="420"/>
<p2 x="400" y="420"/>
</wire>
<wire>
<p1 x="-60" y="260"/>
<p2 x="-20" y="260"/>
<p1 x="-20" y="260"/>
<p2 x="20" y="260"/>
</wire>
<wire>
<p1 x="-20" y="260"/>
<p1 x="20" y="260"/>
<p2 x="180" y="260"/>
</wire>
<wire>
<p1 x="-60" y="580"/>
<p2 x="100" y="580"/>
<p1 x="-100" y="580"/>
<p2 x="-80" y="580"/>
</wire>
<wire>
<p1 x="220" y="580"/>
<p2 x="240" y="580"/>
<p1 x="380" y="200"/>
<p2 x="400" y="200"/>
</wire>
<wire>
<p1 x="100" y="580"/>
<p2 x="160" y="580"/>
<p1 x="60" y="200"/>
<p2 x="80" y="200"/>
</wire>
<wire>
<p1 x="20" y="200"/>
<p2 x="40" y="200"/>
</wire>
<wire>
<p1 x="-60" y="200"/>
<p2 x="-40" y="200"/>
<p1 x="-20" y="200"/>
<p2 x="0" y="200"/>
</wire>
<wire>
<p1 x="260" y="200"/>
<p2 x="280" y="200"/>
</wire>
<wire>
<p1 x="620" y="200"/>
<p1 x="700" y="200"/>
<p2 x="720" y="200"/>
</wire>
<wire>
<p1 x="600" y="200"/>
<p2 x="640" y="200"/>
</wire>
<wire>
<p1 x="500" y="200"/>
<p2 x="560" y="200"/>
<p1 x="720" y="200"/>
<p2 x="740" y="200"/>
</wire>
<wire>
<p1 x="300" y="520"/>
<p2 x="360" y="520"/>
</wire>
<wire>
<p1 x="200" y="520"/>
<p2 x="240" y="520"/>
</wire>
<wire>
<p1 x="20" y="300"/>
<p2 x="60" y="300"/>
</wire>
<wire>
<p1 x="360" y="140"/>
<p2 x="400" y="140"/>
<p2 x="380" y="140"/>
</wire>
<wire>
<p1 x="-20" y="300"/>
<p2 x="20" y="300"/>
<p1 x="-20" y="560"/>
<p2 x="340" y="560"/>
</wire>
<wire>
<p1 x="140" y="620"/>
<p2 x="160" y="620"/>
<p1 x="340" y="560"/>
<p2 x="360" y="560"/>
</wire>
<wire>
<p1 x="420" y="620"/>
<p2 x="440" y="620"/>
</wire>
<wire>
<p1 x="-140" y="620"/>
<p2 x="-120" y="620"/>
</wire>
<wire>
<p1 x="440" y="620"/>
<p2 x="740" y="620"/>
</wire>
<wire>
<p1 x="20" y="80"/>
<p1 x="60" y="80"/>
<p2 x="220" y="80"/>
</wire>
<wire>
@ -615,96 +612,104 @@ if (orig.inverterConfig.in) {
<p2 x="720" y="80"/>
</wire>
<wire>
<p1 x="100" y="240"/>
<p1 x="140" y="240"/>
<p2 x="280" y="240"/>
</wire>
<wire>
<p1 x="-140" y="240"/>
<p2 x="-120" y="240"/>
<p1 x="-100" y="240"/>
<p2 x="-80" y="240"/>
</wire>
<wire>
<p1 x="-140" y="400"/>
<p2 x="-120" y="400"/>
<p1 x="-100" y="400"/>
<p2 x="-80" y="400"/>
</wire>
<wire>
<p1 x="700" y="180"/>
<p2 x="720" y="180"/>
<p1 x="440" y="180"/>
<p2 x="560" y="180"/>
</wire>
<wire>
<p1 x="360" y="180"/>
<p2 x="400" y="180"/>
<p1 x="40" y="180"/>
<p2 x="80" y="180"/>
</wire>
<wire>
<p1 x="0" y="180"/>
<p2 x="40" y="180"/>
<p1 x="-20" y="500"/>
<p2 x="140" y="500"/>
</wire>
<wire>
<p1 x="600" y="180"/>
<p2 x="640" y="180"/>
<p1 x="220" y="500"/>
<p2 x="240" y="500"/>
</wire>
<wire>
<p1 x="720" y="180"/>
<p2 x="740" y="180"/>
<p1 x="140" y="500"/>
<p2 x="160" y="500"/>
</wire>
<wire>
<p1 x="-20" y="340"/>
<p2 x="0" y="340"/>
<p1 x="20" y="340"/>
<p2 x="40" y="340"/>
</wire>
<wire>
<p1 x="-140" y="660"/>
<p2 x="-120" y="660"/>
</wire>
<wire>
<p1 x="-140" y="440"/>
<p2 x="-120" y="440"/>
</wire>
<wire>
<p1 x="300" y="600"/>
<p2 x="360" y="600"/>
</wire>
<wire>
<p1 x="200" y="600"/>
<p2 x="240" y="600"/>
<p1 x="-100" y="440"/>
<p2 x="-80" y="440"/>
</wire>
<wire>
<p1 x="220" y="120"/>
<p2 x="320" y="120"/>
</wire>
<wire>
<p1 x="-140" y="280"/>
<p2 x="-120" y="280"/>
<p1 x="-100" y="280"/>
<p2 x="-80" y="280"/>
</wire>
<wire>
<p1 x="620" y="220"/>
<p2 x="640" y="220"/>
</wire>
<wire>
<p1 x="500" y="220"/>
<p2 x="560" y="220"/>
</wire>
<wire>
<p1 x="320" y="220"/>
<p2 x="360" y="220"/>
<p2 x="380" y="220"/>
</wire>
<wire>
<p1 x="140" y="540"/>
<p2 x="160" y="540"/>
</wire>
<wire>
<p1 x="420" y="540"/>
<p2 x="440" y="540"/>
</wire>
<wire>
<p1 x="-100" y="540"/>
<p2 x="-80" y="540"/>
</wire>
<wire>
<p1 x="440" y="540"/>
<p2 x="740" y="540"/>
</wire>
<wire>
<p1 x="480" y="400"/>
<p2 x="480" y="420"/>
</wire>
<wire>
<p1 x="420" y="180"/>
<p1 x="420" y="200"/>
<p2 x="420" y="340"/>
</wire>
<wire>
<p1 x="100" y="240"/>
<p2 x="100" y="580"/>
</wire>
<wire>
<p1 x="580" y="200"/>
<p1 x="580" y="220"/>
<p2 x="580" y="340"/>
</wire>
<wire>
<p1 x="360" y="180"/>
<p2 x="360" y="220"/>
</wire>
<wire>
<p1 x="520" y="400"/>
<p2 x="520" y="420"/>
</wire>
<wire>
<p1 x="620" y="200"/>
<p2 x="620" y="240"/>
<p1 x="140" y="240"/>
<p2 x="140" y="500"/>
</wire>
<wire>
<p1 x="620" y="220"/>
<p2 x="620" y="260"/>
</wire>
<wire>
<p1 x="300" y="240"/>
@ -716,43 +721,35 @@ if (orig.inverterConfig.in) {
</wire>
<wire>
<p1 x="720" y="80"/>
<p2 x="720" y="180"/>
<p2 x="720" y="200"/>
</wire>
<wire>
<p1 x="400" y="400"/>
<p2 x="400" y="420"/>
</wire>
<wire>
<p1 x="-20" y="200"/>
<p2 x="-20" y="260"/>
<p1 x="20" y="200"/>
<p2 x="20" y="260"/>
</wire>
<wire>
<p1 x="-20" y="340"/>
<p2 x="-20" y="420"/>
<p1 x="20" y="340"/>
<p2 x="20" y="420"/>
</wire>
<wire>
<p1 x="-20" y="260"/>
<p2 x="-20" y="300"/>
<p1 x="20" y="260"/>
<p2 x="20" y="300"/>
</wire>
<wire>
<p1 x="500" y="200"/>
<p1 x="500" y="220"/>
<p2 x="500" y="340"/>
</wire>
<wire>
<p1 x="340" y="160"/>
<p2 x="340" y="640"/>
</wire>
<wire>
<p1 x="20" y="80"/>
<p2 x="20" y="160"/>
</wire>
<wire>
<p1 x="20" y="200"/>
<p2 x="20" y="220"/>
<p2 x="340" y="560"/>
</wire>
<wire>
<p1 x="180" y="260"/>
<p2 x="180" y="580"/>
<p2 x="180" y="500"/>
</wire>
<wire>
<p1 x="600" y="400"/>
@ -760,7 +757,23 @@ if (orig.inverterConfig.in) {
</wire>
<wire>
<p1 x="440" y="400"/>
<p2 x="440" y="620"/>
<p2 x="440" y="540"/>
</wire>
<wire>
<p1 x="380" y="200"/>
<p2 x="380" y="220"/>
</wire>
<wire>
<p1 x="380" y="140"/>
<p2 x="380" y="160"/>
</wire>
<wire>
<p1 x="60" y="80"/>
<p2 x="60" y="160"/>
</wire>
<wire>
<p1 x="60" y="200"/>
<p2 x="60" y="220"/>
</wire>
<wire>
<p1 x="220" y="80"/>
@ -768,7 +781,7 @@ if (orig.inverterConfig.in) {
</wire>
<wire>
<p1 x="220" y="120"/>
<p2 x="220" y="580"/>
<p2 x="220" y="500"/>
</wire>
</wires>
<measurementOrdering/>

View File

@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<circuit>
<version>1</version>
<attributes/>
<attributes>
<entry>
<string>isGeneric</string>
<boolean>true</boolean>
</entry>
</attributes>
<visualElements>
<visualElement>
<elementName>D_FF</elementName>

View File

@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<circuit>
<version>1</version>
<attributes/>
<attributes>
<entry>
<string>isGeneric</string>
<boolean>true</boolean>
</entry>
</attributes>
<visualElements>
<visualElement>
<elementName>D_FF</elementName>

View File

@ -1343,6 +1343,9 @@ Sind evtl. die Namen der Variablen nicht eindeutig?</string>
<string name="key_generic">Generisch</string>
<string name="key_generic_tt">Anweisung um eine generische Schaltung anzupassen.</string>
<string name="key_isGeneric">Schaltung ist generisch</string>
<string name="key_isGeneric_tt">Erlaubt die Erzeugung von generischen Schaltungen.</string>
<string name="mod_insertWire">Leitung eingefügt.</string>
<string name="mod_insertCopied">Aus Zwischenablage eingefügt.</string>
<string name="mod_setKey_N0_in_element_N1">Wert ''{0}'' in Element ''{1}'' verändert.</string>

View File

@ -1314,7 +1314,7 @@
<string name="key_midiInstrument_tt">The MIDI instrument to use.</string>
<string name="key_midiProgChange">Allow program change</string>
<string name="key_midiProgChange_tt">Adds a new input PC. If this input is set to high,
the value at input N is used to change te program (instrument).</string>
the value at input N is used to change the program (instrument).</string>
<string name="key_transistors">Transistors</string>
<string name="key_transistors_tt">Number of transistors required. Used for circuit statistics.
@ -1331,6 +1331,9 @@
<string name="key_generic">Generic</string>
<string name="key_generic_tt">Statements used to generify a circuit.</string>
<string name="key_isGeneric">Circuit is generic</string>
<string name="key_isGeneric_tt">Allows to create a generic circuit.</string>
<string name="mod_insertWire">Inserted wire.</string>
<string name="mod_insertCopied">Insert from clipboard.</string>
<string name="mod_setKey_N0_in_element_N1">Value ''{0}'' in component ''{1}'' modified.</string>

View File

@ -1176,7 +1176,7 @@
<string name="key_midiInstrument_tt">The MIDI instrument to use.</string>
<string name="key_midiProgChange">Allow program change</string>
<string name="key_midiProgChange_tt">Adds a new input PC. If this input is set to high,
the value at input N is used to change te program (instrument).</string>
the value at input N is used to change the program (instrument).</string>
<string name="mod_insertWire">Inserted wire.</string>
<string name="mod_insertCopied">Insert from clipboard.</string>
<string name="mod_setKey_N0_in_element_N1">Value ''{0}'' in component ''{1}'' modified.</string>

View File

@ -1305,7 +1305,7 @@
<string name="key_midiInstrument_tt">The MIDI instrument to use.</string>
<string name="key_midiProgChange">Allow program change</string>
<string name="key_midiProgChange_tt">Adds a new input PC. If this input is set to high,
the value at input N is used to change te program (instrument).</string>
the value at input N is used to change the program (instrument).</string>
<string name="mod_insertWire">Inserted wire.</string>
<string name="mod_insertCopied">Insert from clipboard.</string>