Browse Source

add option to switch two groups positions

master
Nils 2 years ago
parent
commit
bfdaff075e
  1. 3
      CHANGELOG
  2. 70
      engine/api.py
  3. 2
      engine/pattern.py
  4. 2
      qtgui/mainwindow.py
  5. 5
      qtgui/pattern_grid.py
  6. 1247
      qtgui/resources.py
  7. BIN
      qtgui/resources/translations/de.qm
  8. 206
      qtgui/resources/translations/de.ts
  9. 5
      qtgui/songeditor.py

3
CHANGELOG

@ -1,5 +1,8 @@
2021-04-15 Version 2.1.0
Full Undo/Redo
Add option to change the midi channel for a track in the tracks context menu.
Add switch group places to song-structure context menus.
2021-01-15 Version 2.0.0
Big new features increase the MAJOR version. Old save files can still be loaded.

70
engine/api.py

@ -767,6 +767,76 @@ def duplicateSwitchGroup(startMeasureForGroup:int, endMeasureExclusive:int):
session.data.buildAllTracks()
updatePlayback()
def exchangeSwitchGroupWithGroupToTheRight(startMeasureForGroup:int, endMeasureExclusive:int):
"""The group is defined by the given measure range. The group right of it has the same dimensions.
In a GUI you can use that to move groups left and right. We only supply the "switch with right"
variant (and not left) because that is easier to comprehend.
"""
with session.history.sequence("Exchange Group Order"):
for track in session.data.tracks:
_registerHistoryWholeTrackSwitches(track)
thisTrackStartMeasure = startMeasureForGroup // track.patternLengthMultiplicator #integer division
thisTrackEndMeasure = endMeasureExclusive // track.patternLengthMultiplicator
groupSize = thisTrackEndMeasure - thisTrackStartMeasure
assert thisTrackStartMeasure + groupSize == thisTrackEndMeasure, (thisTrackStartMeasure, groupSize, thisTrackEndMeasure)
tempStructure = set() #integers
tempScaleTransposed = dict() #position:integers
tempHalfToneTransposed = dict() #position:integers
#Remember for later testing
lenStructure = len(track.structure)
lenScaleTransposed = len(track.whichPatternsAreScaleTransposed.keys())
lenHalfToneTransposed = len(track.whichPatternsAreHalftoneTransposed.keys())
#First move right group into a temporary buffer to have it out of the way
for switch in range(thisTrackStartMeasure+groupSize, thisTrackEndMeasure+groupSize): #switch is a number
if switch in track.structure:
tempStructure.add(switch)
track.structure.remove(switch)
if switch in track.whichPatternsAreScaleTransposed:
tempScaleTransposed[switch] = track.whichPatternsAreScaleTransposed[switch]
del track.whichPatternsAreScaleTransposed[switch]
if switch in track.whichPatternsAreHalftoneTransposed:
tempHalfToneTransposed[switch] = track.whichPatternsAreHalftoneTransposed[switch]
del track.whichPatternsAreHalftoneTransposed[switch]
#Now move current group to the right, which is now empty.
for switch in range(thisTrackStartMeasure, thisTrackEndMeasure): #switch is a number
if switch in track.structure:
track.structure.add(switch + groupSize)
track.structure.remove(switch)
if switch in track.whichPatternsAreScaleTransposed:
track.whichPatternsAreScaleTransposed[switch+groupSize] = track.whichPatternsAreScaleTransposed[switch]
del track.whichPatternsAreScaleTransposed[switch]
if switch in track.whichPatternsAreHalftoneTransposed:
track.whichPatternsAreHalftoneTransposed[switch+groupSize] = track.whichPatternsAreHalftoneTransposed[switch]
del track.whichPatternsAreHalftoneTransposed[switch]
#Move old right-group into its new place
for sw in tempStructure:
track.structure.add(sw-groupSize)
for stPos, stVal in tempScaleTransposed.items():
track.whichPatternsAreScaleTransposed[stPos-groupSize] = stVal
for htPos, htVal in tempScaleTransposed.items():
track.whichPatternsAreHalftoneTransposed[hPos-groupSize] = htVal
callbacks._trackStructureChanged(track)
#Do some tests
assert lenStructure == len(track.structure), (lenStructure, len(track.structure))
assert lenScaleTransposed == len(track.whichPatternsAreScaleTransposed.keys()), (lenScaleTransposed, len(track.whichPatternsAreScaleTransposed.keys()))
assert lenHalfToneTransposed == len(track.whichPatternsAreHalftoneTransposed.keys()), (lenHalfToneTransposed, len(track.whichPatternsAreHalftoneTransposed.keys()))
callbacks._dataChanged() #register undo
session.data.buildAllTracks()
updatePlayback()
def clearSwitchGroupTranspositions(startMeasureForGroup:int, endMeasureExclusive:int):
"""startMeasureForGroup and endMeasureExclusive are in the global, un-multiplied measure counting
format."""

2
engine/pattern.py

@ -260,7 +260,7 @@ class Pattern(object):
note = {}
note["pitch"] = pattern["pitch"]
note["index"] = pattern["index"]
note["factor"] = pattern["factor"]
note["factor"] = pattern["factor"] #size multiplier -> longer or short note
note["velocity"] = pattern["velocity"]
note["midipitch"] = self.scale[pattern["pitch"]] #we always report the untransposed note. For a GUI the pattern gets transposed, not the note.
note["exceedsPlayback"] = False #This is set by buildPattern.

2
qtgui/mainwindow.py

@ -69,6 +69,7 @@ class MainWindow(TemplateMainWindow):
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Set Half Tone Shift")
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Change Group")
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Insert/Duplicate Group")
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Exchange Group Order")
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Clear all Group Transpositions")
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Delete whole Group")
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Change Step")
@ -87,6 +88,7 @@ class MainWindow(TemplateMainWindow):
QtCore.QT_TRANSLATE_NOOP("NOOPengineHistory", "Number of Notes in Pattern")
def __init__(self):
"""The order of calls is very important.
The split ploint is calling the super.__init. Some functions need to be called before,

5
qtgui/pattern_grid.py

@ -452,6 +452,11 @@ class PatternGrid(QtWidgets.QGraphicsScene):
Same is true if the source has more notes (pitches) than ours. We do naive x/y mapping.
Making sense of that is up to the user :)
It is not a bug that shadows always appear as exactly one step wide. The factor is ignored
because the user needs to click on the shadow field to activate it. We use the actual
step-rectangles as shadows, which need to be clickable and not covered by another, overlong
shadow-note.
"""
for x, y in ((s["index"], s["pitch"]) for s in exportDict["pattern"]):
if (x,y) in self._steps:

1247
qtgui/resources.py

File diff suppressed because it is too large

BIN
qtgui/resources/translations/de.qm

Binary file not shown.

206
qtgui/resources/translations/de.ts

@ -4,32 +4,32 @@
<context>
<name>About</name>
<message>
<location filename="../../mainwindow.py" line="106"/>
<location filename="../../mainwindow.py" line="108"/>
<source>Prefer clone track over adding a new empty track when creating a new pattern for an existing &apos;real world&apos; instrument.</source>
<translation>Spuren zu klonen ist meist besser als eine neue, leere Spur zu erstellen. Benutze Klonen immer wenn du ein neues Pattern für ein existierendes Instrument komponieren möchtest.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="107"/>
<location filename="../../mainwindow.py" line="109"/>
<source>You can run multiple Patroneo instances in parallel to create complex polyrhythms.</source>
<translation>Um komplexe Rhythmen zu erstellen versuche Patroneo mehrmals zu starten und verschiedene Taktarten einzustellen.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="108"/>
<location filename="../../mainwindow.py" line="110"/>
<source>To revert all steps that are longer or shorter than default invert the pattern twice in a row.</source>
<translation>Alle gedehnten oder verkürzte Noten im Takt bekommst du am einfachsten zurück auf die normale Länge wenn du zweimal hintereinander die &amp;quot;Umkehren&amp;quot; Funktion benutzt.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="109"/>
<location filename="../../mainwindow.py" line="111"/>
<source>Control a synth with MIDI Control Changes (CC) by routing a Patroneo track into a midi plugin that converts notes to CC.</source>
<translation>MIDI Control Changes (CC) werden nicht direkt von Patroneo erzeugt. Route eine Extraspur in ein Konverterplugin, dass aus Pitch und Velocity CC und Value macht.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="110"/>
<location filename="../../mainwindow.py" line="112"/>
<source>The mouse wheel is very powerful: Use it to transpose measures (with or without Shift pressed), it resizes the measure number line, zooms when Ctrl is held down, changes row volumes in the pattern with the Alt key or sounds a preview if pressed on a step.</source>
<translation>Das Mausrad ist sehr wichtig: Es transponiert Takte (mit oder ohne Umschalttaste), verändert die Größe der Taktgruppen, zoomed wenn Strg gedrückt ist, ändert die Lautstärke einer ganzen Reihe zusammen mit der Alt-Taste oder lässt eine Note erklingen wenn man es auf einem Schritt drückt.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="111"/>
<location filename="../../mainwindow.py" line="113"/>
<source>Many elements have context menus with unique functions: Try right clicking on a Step, the Track name or a measure in the song editor.</source>
<translation>Die meisten Bedienelemente haben ein Kontextmenü. Versuche auf alles mit der rechten Maustaste zu klicken: Schritte, Takte, der Spurname etc.</translation>
</message>
@ -93,12 +93,12 @@
<context>
<name>Menu</name>
<message>
<location filename="../../mainwindow.py" line="117"/>
<location filename="../../mainwindow.py" line="119"/>
<source>Convert Grouping</source>
<translation>Gruppierung umwandeln</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="117"/>
<location filename="../../mainwindow.py" line="119"/>
<source>Change step-grouping but keep your music the same</source>
<translation>Taktartaufspaltung durch Gruppierung umwandeln, versucht die Musik gleich klingen zu lassen</translation>
</message>
@ -246,105 +246,110 @@
<translation>Gruppe einfügen/duplizieren</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="72"/>
<location filename="../../mainwindow.py" line="73"/>
<source>Clear all Group Transpositions</source>
<translation>Alle Transpositionen der Taktgruppe zurücksetzen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="73"/>
<location filename="../../mainwindow.py" line="74"/>
<source>Delete whole Group</source>
<translation>Taktgruppe Löschen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="74"/>
<location filename="../../mainwindow.py" line="75"/>
<source>Change Step</source>
<translation>Schritt verändern</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="75"/>
<location filename="../../mainwindow.py" line="76"/>
<source>Remove Step</source>
<translation>Schritt aus</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="76"/>
<location filename="../../mainwindow.py" line="77"/>
<source>Set Scale</source>
<translation>Benutze Tonleiter</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="77"/>
<location filename="../../mainwindow.py" line="78"/>
<source>Note Names</source>
<translation>Notennamen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="78"/>
<location filename="../../mainwindow.py" line="79"/>
<source>Transpose Scale</source>
<translation>Tonleiter transponieren</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="79"/>
<location filename="../../mainwindow.py" line="80"/>
<source>Invert Steps</source>
<translation>Schritte invertieren</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="80"/>
<location filename="../../mainwindow.py" line="81"/>
<source>All Steps On</source>
<translation>Alle Schritte an</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="81"/>
<location filename="../../mainwindow.py" line="82"/>
<source>All Steps Off</source>
<translation>Alles Schritte aus</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="82"/>
<location filename="../../mainwindow.py" line="83"/>
<source>Invert Row</source>
<translation>Reihe umkehren</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="83"/>
<location filename="../../mainwindow.py" line="84"/>
<source>Clear Row</source>
<translation>Reihe löschen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="84"/>
<location filename="../../mainwindow.py" line="85"/>
<source>Fill Row with Repeat</source>
<translation>Reihenwiederholung</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="85"/>
<location filename="../../mainwindow.py" line="86"/>
<source>Change Row Velocity</source>
<translation>Reihenlautstärke</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="86"/>
<location filename="../../mainwindow.py" line="87"/>
<source>Change Pattern Velocity</source>
<translation>Taktlautstärke</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="87"/>
<location filename="../../mainwindow.py" line="88"/>
<source>Number of Notes in Pattern</source>
<translation>Anzahl der Tonhöhen im Takt</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="72"/>
<source>Exchange Group Order</source>
<translation>Gruppenreihenfolge tauschen</translation>
</message>
</context>
<context>
<name>PlaybackControls</name>
<message>
<location filename="../../mainwindow.py" line="136"/>
<location filename="../../mainwindow.py" line="138"/>
<source>[Space] Play / Pause</source>
<translation>[Leertaste] Play / Pause</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="143"/>
<location filename="../../mainwindow.py" line="145"/>
<source>[L] Loop current Measure</source>
<translation>[L] Aktueller Takt in Schleife spielen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="164"/>
<location filename="../../mainwindow.py" line="166"/>
<source>[Home] Jump to Start</source>
<translation>[Pos1] Springe zum Anfang</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="157"/>
<location filename="../../mainwindow.py" line="159"/>
<source>Number of measures in the loop</source>
<translation>Anzahl der Takte pro Schleife</translation>
</message>
@ -352,72 +357,72 @@
<context>
<name>Scale</name>
<message>
<location filename="../../pattern_grid.py" line="758"/>
<location filename="../../pattern_grid.py" line="763"/>
<source>Major</source>
<translation>Dur</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="759"/>
<location filename="../../pattern_grid.py" line="764"/>
<source>Minor</source>
<translation>Moll</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="760"/>
<location filename="../../pattern_grid.py" line="765"/>
<source>Dorian</source>
<translation>Dorisch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="761"/>
<location filename="../../pattern_grid.py" line="766"/>
<source>Phrygian</source>
<translation>Phrygisch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="762"/>
<location filename="../../pattern_grid.py" line="767"/>
<source>Lydian</source>
<translation>Lydisch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="763"/>
<location filename="../../pattern_grid.py" line="768"/>
<source>Mixolydian</source>
<translation>Mixolydisch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="764"/>
<location filename="../../pattern_grid.py" line="769"/>
<source>Locrian</source>
<translation>Lokrisch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="765"/>
<location filename="../../pattern_grid.py" line="770"/>
<source>Blues</source>
<translation>Blues</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="766"/>
<location filename="../../pattern_grid.py" line="771"/>
<source>Hollywood</source>
<translation>Hollywood</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="769"/>
<location filename="../../pattern_grid.py" line="774"/>
<source>English</source>
<translation>Englisch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="770"/>
<location filename="../../pattern_grid.py" line="775"/>
<source>Lilypond</source>
<translation>Lilypond</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="771"/>
<location filename="../../pattern_grid.py" line="776"/>
<source>German</source>
<translation>Deutsch</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="772"/>
<location filename="../../pattern_grid.py" line="777"/>
<source>Drums GM</source>
<translation>Drums GM</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="767"/>
<location filename="../../pattern_grid.py" line="772"/>
<source>Chromatic</source>
<translation>Chromatisch</translation>
</message>
@ -440,45 +445,50 @@
<translation>Leere Taktgruppe vor dieser einfügen</translation>
</message>
<message>
<location filename="../../songeditor.py" line="379"/>
<location filename="../../songeditor.py" line="380"/>
<source>Delete whole group</source>
<translation>Lösche diese Taktgruppe</translation>
</message>
<message>
<location filename="../../songeditor.py" line="380"/>
<location filename="../../songeditor.py" line="381"/>
<source>Duplicate whole group including measures</source>
<translation>Verdopple diese Taktgruppe inkl. Struktur</translation>
</message>
<message>
<location filename="../../songeditor.py" line="381"/>
<location filename="../../songeditor.py" line="382"/>
<source>Clear all group transpositions</source>
<translation>Setze alle Transpositionen dieser Taktgruppe zurück</translation>
</message>
<message>
<location filename="../../songeditor.py" line="379"/>
<source>Exchange group with right neigbour</source>
<translation>Tausche Gruppe mit rechter Nachbargruppe</translation>
</message>
</context>
<context>
<name>TimeSignature</name>
<message>
<location filename="../../mainwindow.py" line="403"/>
<location filename="../../mainwindow.py" line="405"/>
<source>Whole</source>
<translation>Ganze</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="404"/>
<location filename="../../mainwindow.py" line="406"/>
<source>Half</source>
<translation>Halbe</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="405"/>
<location filename="../../mainwindow.py" line="407"/>
<source>Quarter</source>
<translation>Viertel</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="406"/>
<location filename="../../mainwindow.py" line="408"/>
<source>Eigth</source>
<translation>Achtel</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="407"/>
<location filename="../../mainwindow.py" line="409"/>
<source>Sixteenth</source>
<translation>Sechzehntel</translation>
</message>
@ -494,32 +504,32 @@
<context>
<name>Toolbar</name>
<message>
<location filename="../../mainwindow.py" line="316"/>
<location filename="../../mainwindow.py" line="318"/>
<source>BPM/Tempo: </source>
<translation>BPM/Tempo: </translation>
</message>
<message>
<location filename="../../mainwindow.py" line="317"/>
<location filename="../../mainwindow.py" line="319"/>
<source>Deactivate to beccome JACK Transport Slave. Activate for Master.</source>
<translation>Aus: JACK Transport Slave. An: JACK Master (eigenes Tempo).</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="370"/>
<location filename="../../mainwindow.py" line="372"/>
<source>Overall length of the song</source>
<translation>Länge des Stückes in Takten</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="387"/>
<location filename="../../mainwindow.py" line="389"/>
<source>Please read the manual!</source>
<translation>Bitte im Handbuch nachlesen!</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="414"/>
<location filename="../../mainwindow.py" line="416"/>
<source>Length of the pattern (bottom part of the program)</source>
<translation>Länge des Musters in Schritten (untere Hälfte des Programms)</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="418"/>
<location filename="../../mainwindow.py" line="420"/>
<source>How long is each main step</source>
<translation>Welchen Notenwert repräsentiert ein Schritt</translation>
</message>
@ -534,47 +544,47 @@
<translation type="obsolete">Taktartaufspaltung durch Gruppierung umwandeln, versucht die Musik gleich klingen zu lassen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="492"/>
<location filename="../../mainwindow.py" line="494"/>
<source>Clone Selected Track</source>
<translation>Klone ausgewählte Spur</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="493"/>
<location filename="../../mainwindow.py" line="495"/>
<source>Use this! Create a new track that inherits everything but the content from the original. Already jack connected!</source>
<translation>Das hier benutzen! Neue Spur, die alle Eigenschaften außer der Musik selbst vom Original erbt. Ist bereits in JACK verbunden!</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="494"/>
<location filename="../../mainwindow.py" line="496"/>
<source>Add Track</source>
<translation>Neue Spur</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="495"/>
<location filename="../../mainwindow.py" line="497"/>
<source>Add a complete empty track that needs to be connected to an instrument manually.</source>
<translation>Eine neue, leere Spur, bei der man noch per Hand ein Instrument mit JACK verbinden muss.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="500"/>
<location filename="../../mainwindow.py" line="502"/>
<source>Measures per Track: </source>
<translation>Takte pro Spur: </translation>
</message>
<message>
<location filename="../../mainwindow.py" line="506"/>
<location filename="../../mainwindow.py" line="508"/>
<source>Steps per Pattern:</source>
<translation>Schritte pro Takt:</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="511"/>
<location filename="../../mainwindow.py" line="513"/>
<source> in groups of: </source>
<translation> gruppiert in je: </translation>
</message>
<message>
<location filename="../../mainwindow.py" line="516"/>
<location filename="../../mainwindow.py" line="518"/>
<source> so that each group produces a:</source>
<translation> und jede Gruppe ergibt eine:</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="522"/>
<location filename="../../mainwindow.py" line="524"/>
<source>Set the swing factor. 0 is off. Different effect for different rhythm-grouping!</source>
<translation>Swing-Anteil. 0 ist aus. Andere rhythmische Gruppierungen haben einen anderen Effekt!</translation>
</message>
@ -582,12 +592,12 @@
<context>
<name>TrackLabel</name>
<message>
<location filename="../../songeditor.py" line="792"/>
<location filename="../../songeditor.py" line="793"/>
<source>grab and move to reorder tracks</source>
<translation>mit der maus halten und ziehen um Spuren anzuordnen</translation>
</message>
<message>
<location filename="../../songeditor.py" line="801"/>
<location filename="../../songeditor.py" line="802"/>
<source>change track color</source>
<translation>setze Farbe der Spur</translation>
</message>
@ -595,27 +605,27 @@
<context>
<name>TrackLabelContext</name>
<message>
<location filename="../../songeditor.py" line="717"/>
<location filename="../../songeditor.py" line="718"/>
<source>Invert Measures</source>
<translation>Taktauswahl umdrehen</translation>
</message>
<message>
<location filename="../../songeditor.py" line="718"/>
<location filename="../../songeditor.py" line="719"/>
<source>All Measures On</source>
<translation>Alle Takte anschalten</translation>
</message>
<message>
<location filename="../../songeditor.py" line="719"/>
<location filename="../../songeditor.py" line="720"/>
<source>All Measures Off</source>
<translation>Alle Takte ausschalten</translation>
</message>
<message>
<location filename="../../songeditor.py" line="720"/>
<location filename="../../songeditor.py" line="721"/>
<source>Clone this Track</source>
<translation>Spur klonen</translation>
</message>
<message>
<location filename="../../songeditor.py" line="721"/>
<location filename="../../songeditor.py" line="722"/>
<source>Delete Track</source>
<translation>Spur löschen</translation>
</message>
@ -625,17 +635,17 @@
<translation type="obsolete">Übernimm Struktur von</translation>
</message>
<message>
<location filename="../../songeditor.py" line="738"/>
<location filename="../../songeditor.py" line="739"/>
<source>Merge/Copy Measure-Structure from</source>
<translation>Übernimm und ergänze Struktur von</translation>
</message>
<message>
<location filename="../../songeditor.py" line="752"/>
<location filename="../../songeditor.py" line="753"/>
<source>Replace Pattern with</source>
<translation>Ersetze Noten des Taktes durch</translation>
</message>
<message>
<location filename="../../songeditor.py" line="766"/>
<location filename="../../songeditor.py" line="767"/>
<source>Send on MIDI Channel</source>
<translation>Sende auf MIDI Kanal</translation>
</message>
@ -643,72 +653,72 @@
<context>
<name>TransposeControls</name>
<message>
<location filename="../../pattern_grid.py" line="786"/>
<location filename="../../pattern_grid.py" line="791"/>
<source>+Half Tone</source>
<translation>+Halbton</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="788"/>
<location filename="../../pattern_grid.py" line="793"/>
<source>Transpose the whole scale up a half tone (+1 midi note)</source>
<translation>Transponiere die Tonleiter einen Halbton aufwärts (+1 MIDI Tonhöhe)</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="791"/>
<location filename="../../pattern_grid.py" line="796"/>
<source>-Half Tone</source>
<translation>-Halbton</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="793"/>
<location filename="../../pattern_grid.py" line="798"/>
<source>Transpose the whole scale down a half tone (-1 midi note)</source>
<translation>Transponiere die Tonleiter einen Halbton abwärts (-1 MIDI Tonhöhe)</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="796"/>
<location filename="../../pattern_grid.py" line="801"/>
<source>+Octave</source>
<translation>+Oktave</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="798"/>
<location filename="../../pattern_grid.py" line="803"/>
<source>Transpose the whole scale up an octave (+12 midi notes)</source>
<translation>Transponiere die Tonleiter eine Oktave aufwärts (+12 MIDI Tonhöhe)</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="801"/>
<location filename="../../pattern_grid.py" line="806"/>
<source>-Octave</source>
<translation>-Oktave</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="803"/>
<location filename="../../pattern_grid.py" line="808"/>
<source>Transpose the whole scale down an octave (-12 midi notes)</source>
<translation>Transponiere die Tonleiter eine Oktave abwärts (-12 MIDI Tonhöhe)</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="810"/>
<location filename="../../pattern_grid.py" line="815"/>
<source>Set Scale to:</source>
<translation>Benutze Tonleiter:</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="812"/>
<location filename="../../pattern_grid.py" line="817"/>
<source>Take the bottom note and build a predefined scale from it upwards.</source>
<translation>Ändere die Tonleiter des Musters auf die Ausgewählte. Referenzton ist die unterste Reihe des Musters.</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="818"/>
<location filename="../../pattern_grid.py" line="823"/>
<source>Set Notenames to:</source>
<translation>Benutze Notennamen:</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="820"/>
<location filename="../../pattern_grid.py" line="825"/>
<source>Use this scheme as note names.</source>
<translation>Use this scheme as note names.</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="824"/>
<location filename="../../pattern_grid.py" line="829"/>
<source>Choose how many different notes does this pattern should have.</source>
<translation>Anzahl der verschiedenen Tonhöhen-Stufen aus.</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="827"/>
<location filename="../../pattern_grid.py" line="832"/>
<source> Notes</source>
<translation> Noten</translation>
</message>
@ -716,22 +726,22 @@
<context>
<name>VelocityControls</name>
<message>
<location filename="../../pattern_grid.py" line="1004"/>
<location filename="../../pattern_grid.py" line="1009"/>
<source>+Velocity</source>
<translation>+Velocity</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="1007"/>
<location filename="../../pattern_grid.py" line="1012"/>
<source>Make everything louder. Hover and mousewheel up/down to go in steps of 10.</source>
<translation>Alle Töne lauter machen. Mit dem Mauszeiger über dem Knopf bleiben und das Mausrad auf oder ab bewegen für 10er Schritte.</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="1010"/>
<location filename="../../pattern_grid.py" line="1015"/>
<source>-Velocity</source>
<translation>-Velocity</translation>
</message>
<message>
<location filename="../../pattern_grid.py" line="1013"/>
<location filename="../../pattern_grid.py" line="1018"/>
<source>Make everything softer. Hover and mousewheel up/down to go in steps of 10.</source>
<translation>Alle Töne leiser machen. Mit dem Mauszeiger über dem Knopf bleiben und das Mausrad auf oder ab bewegen für 10er Schritte.</translation>
</message>
@ -739,27 +749,27 @@
<context>
<name>convertSubdivisionsSubMenu</name>
<message>
<location filename="../../mainwindow.py" line="566"/>
<location filename="../../mainwindow.py" line="568"/>
<source>New Grouping</source>
<translation>Neue Gruppierung</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="569"/>
<location filename="../../mainwindow.py" line="571"/>
<source>Do nothing</source>
<translation>Nichts machen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="569"/>
<location filename="../../mainwindow.py" line="571"/>
<source>Delete wrong steps</source>
<translation>Falsche Schritte löschen</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="569"/>
<location filename="../../mainwindow.py" line="571"/>
<source>Merge wrong steps</source>
<translation>Falsche Schritte mit einbinden</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="574"/>
<location filename="../../mainwindow.py" line="576"/>
<source>If not possible</source>
<translation>Falls unmöglich</translation>
</message>

5
qtgui/songeditor.py

@ -375,8 +375,9 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
endMeasureExclusive = startMeasureForGroup + measuresPerGroup
listOfLabelsAndFunctions = [
(QtCore.QCoreApplication.translate("SongStructure", "Insert empty group before this one").format(measuresPerGroup), lambda: api.insertSilence(howMany=measuresPerGroup, beforeMeasureNumber=startMeasureForGroup)),
(QtCore.QCoreApplication.translate("SongStructure", "Delete whole group").format(measuresPerGroup), lambda: api.deleteSwitches(howMany=measuresPerGroup, fromMeasureNumber=startMeasureForGroup)),
(QtCore.QCoreApplication.translate("SongStructure", "Insert empty group before this one"), lambda: api.insertSilence(howMany=measuresPerGroup, beforeMeasureNumber=startMeasureForGroup)),
(QtCore.QCoreApplication.translate("SongStructure", "Exchange group with right neigbour"), lambda: api.exchangeSwitchGroupWithGroupToTheRight(startMeasureForGroup, endMeasureExclusive)),
(QtCore.QCoreApplication.translate("SongStructure", "Delete whole group"), lambda: api.deleteSwitches(howMany=measuresPerGroup, fromMeasureNumber=startMeasureForGroup)),
(QtCore.QCoreApplication.translate("SongStructure", "Duplicate whole group including measures"), lambda: api.duplicateSwitchGroup(startMeasureForGroup, endMeasureExclusive)),
(QtCore.QCoreApplication.translate("SongStructure", "Clear all group transpositions"), lambda: api.clearSwitchGroupTranspositions(startMeasureForGroup, endMeasureExclusive)),
]

Loading…
Cancel
Save