Browse Source

Add a basic pianoroll track type.

pyside
Ben Niemann 3 years ago
parent
commit
f81b4e3889
  1. 2
      3rdparty/typeshed/PyQt5/QtWidgets.pyi
  2. 156
      data/icons/pianoroll-arrange-segments.svg
  3. 171
      data/icons/pianoroll-edit-events.svg
  4. 148
      data/icons/pianoroll-edit-velocity.svg
  5. 178
      data/icons/pianoroll-select-events.svg
  6. 135
      data/icons/pianoroll-split-segment.svg
  7. 13
      data/icons/placeholders/error.svg
  8. 166
      data/icons/track-type-pianoroll.svg
  9. 6
      data/icons/wscript
  10. 2
      noisicaa/audioproc/engine/double_buffered_state_manager.h
  11. 4
      noisicaa/audioproc/engine/double_buffered_state_manager.inl.h
  12. 2
      noisicaa/audioproc/public/musical_time.pyi
  13. 6
      noisicaa/audioproc/public/musical_time.pyx
  14. 76
      noisicaa/builtin_nodes/beat_track/track_ui.py
  15. 2
      noisicaa/builtin_nodes/control_track/processor.cpp
  16. 2
      noisicaa/builtin_nodes/control_track/processor.h
  17. 131
      noisicaa/builtin_nodes/control_track/track_ui.py
  18. 9
      noisicaa/builtin_nodes/model_registry.proto
  19. 6
      noisicaa/builtin_nodes/model_registry.py
  20. 2
      noisicaa/builtin_nodes/node_description_registry.py
  21. 302
      noisicaa/builtin_nodes/pianoroll/processor.cpp
  22. 61
      noisicaa/builtin_nodes/pianoroll/processor.h
  23. 65
      noisicaa/builtin_nodes/pianoroll/processor_messages.proto
  24. 125
      noisicaa/builtin_nodes/pianoroll/processor_messages.py
  25. 99
      noisicaa/builtin_nodes/pianoroll/processor_test.py
  26. 21
      noisicaa/builtin_nodes/pianoroll_track/__init__.py
  27. 85
      noisicaa/builtin_nodes/pianoroll_track/model.desc.pb
  28. 402
      noisicaa/builtin_nodes/pianoroll_track/model.py
  29. 154
      noisicaa/builtin_nodes/pianoroll_track/model_test.py
  30. 44
      noisicaa/builtin_nodes/pianoroll_track/node_description.py
  31. 76
      noisicaa/builtin_nodes/pianoroll_track/node_ui.py
  32. 119
      noisicaa/builtin_nodes/pianoroll_track/processor_messages.py
  33. 1092
      noisicaa/builtin_nodes/pianoroll_track/track_ui.py
  34. 304
      noisicaa/builtin_nodes/pianoroll_track/track_ui_test.py
  35. 34
      noisicaa/builtin_nodes/pianoroll_track/wscript
  36. 2
      noisicaa/builtin_nodes/processor_message_registry.proto
  37. 2
      noisicaa/builtin_nodes/sample_track/processor.cpp
  38. 2
      noisicaa/builtin_nodes/sample_track/processor.h
  39. 137
      noisicaa/builtin_nodes/sample_track/track_ui.py
  40. 470
      noisicaa/builtin_nodes/score_track/track_ui.py
  41. 4
      noisicaa/builtin_nodes/ui_registry.py
  42. 1
      noisicaa/builtin_nodes/wscript
  43. 2
      noisicaa/ui/graph/canvas.py
  44. 1458
      noisicaa/ui/pianoroll.py
  45. 249
      noisicaa/ui/pianoroll_test.py
  46. 30
      noisicaa/ui/project_view.py
  47. 248
      noisicaa/ui/track_list/base_track_editor.py
  48. 379
      noisicaa/ui/track_list/editor.py
  49. 60
      noisicaa/ui/track_list/editor_test.py
  50. 232
      noisicaa/ui/track_list/measured_track_editor.py
  51. 5
      noisicaa/ui/track_list/time_line.py
  52. 15
      noisicaa/ui/track_list/time_view_mixin.py
  53. 178
      noisicaa/ui/track_list/tools.py
  54. 338
      noisicaa/ui/track_list/track_editor_tests.py
  55. 13
      noisicaa/ui/track_list/view.py
  56. 1
      noisicaa/ui/track_list/wscript
  57. 26
      noisicaa/value_types/midi_event.py
  58. 2
      noisicaa/value_types/pitch.py
  59. 287
      noisidev/uitest.py

2
3rdparty/typeshed/PyQt5/QtWidgets.pyi vendored

@ -1029,11 +1029,11 @@ class QAction(QtCore.QObject):
class QActionGroup(QtCore.QObject):
triggered = ... # type: PYQT_SIGNAL
def __init__(self, parent: QtCore.QObject) -> None: ...
def hovered(self, a0: QAction) -> None: ...
def triggered(self, a0: QAction) -> None: ...
def setExclusive(self, a0: bool) -> None: ...
def setVisible(self, a0: bool) -> None: ...
def setDisabled(self, b: bool) -> None: ...

156
data/icons/pianoroll-arrange-segments.svg

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="30"
id="svg2"
version="1.1"
viewBox="147 151 60 60"
width="30"
sodipodi:docname="pianoroll-arrange-segments.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata3495">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1373"
id="namedview3493"
showgrid="false"
inkscape:zoom="32"
inkscape:cx="6.385936"
inkscape:cy="16.531571"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<defs
id="defs10" />
<g
id="layer2"
style="display:inline"
transform="translate(0,-637.6694)"
inkscape:groupmode="layer"
inkscape:label="Symbol">
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.47799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 171.74514,790.64038 v 55.97211"
id="path4608-6"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.478;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 147.5491,790.6694 h 24.43305"
id="path4608"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.35841447pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,846.6694 h 24.43548"
id="path4608-7"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609"
width="0.5"
height="54.6255"
x="151.1875"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-6"
width="0.5"
height="54.6255"
x="161.41251"
y="791.35663" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.21914601;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888"
width="13.875"
height="2"
x="147.6875"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3"
width="10.5"
height="2"
x="161.46875"
y="818.73187" />
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.47799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 192.32186,790.51288 v 55.97211"
id="path4608-6-6"
inkscape:connector-curvature="0" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-56"
width="0.5"
height="54.6255"
x="202.3125"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.04465544;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-2"
width="10.1875"
height="2"
x="192.34375"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-1"
width="10.5"
height="2"
x="151.1875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-7"
width="10.5"
height="2"
x="192.25"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.65968394;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-0"
width="4.0625"
height="2"
x="202.5"
y="811.79437" />
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.06437325;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3076"
d="m 158.87554,802.46639 v 32.30745 l 7.25974,-7.01887 7.05327,11.90456 h 3.92231 l 0.0688,-3.2686 -6.22752,-11.69812 c 0,0 2.89014,0 4.54162,0 1.93823,0 6.22754,0 6.22754,0 z"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.478;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 192.08749,790.61449 h 14.49555"
id="path4608-2"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.47799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 192.08749,846.48499 h 14.49555"
id="path4608-2-8"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

171
data/icons/pianoroll-edit-events.svg

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="30"
id="svg2"
version="1.1"
viewBox="147 151 60 60"
width="30"
sodipodi:docname="pianoroll-edit-events.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata3495">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1373"
id="namedview3493"
showgrid="false"
inkscape:zoom="32"
inkscape:cx="5.0455068"
inkscape:cy="15.099995"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<defs
id="defs10" />
<g
id="layer2"
style="display:inline"
transform="translate(0,-637.6694)"
inkscape:groupmode="layer"
inkscape:label="Symbol">
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,790.6694 58.9018,0"
id="path4608"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,846.6694 58.9018,0"
id="path4608-7"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609"
width="0.5"
height="54.6255"
x="151.1875"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-6"
width="0.5"
height="54.6255"
x="161.41251"
y="791.35663" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.21914601;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888"
width="13.875"
height="2"
x="147.6875"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-7"
width="0.5"
height="54.6255"
x="171.6375"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3"
width="10.5"
height="2"
x="161.46875"
y="818.73187" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-5"
width="0.5"
height="54.6255"
x="181.8625"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-3"
width="0.5"
height="54.6255"
x="192.08749"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-56"
width="0.5"
height="54.6255"
x="202.3125"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.48189068;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-2"
width="20.5"
height="2"
x="182.03125"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9"
width="10.5"
height="2"
x="171.71875"
y="811.79437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-1"
width="10.5"
height="2"
x="151.1875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-2"
width="10.5"
height="2"
x="171.6875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-7"
width="10.5"
height="2"
x="192.25"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.65968394;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-0"
width="4.0625"
height="2"
x="202.5"
y="811.79437" />
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.00726867;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3076"
d="m 178.23267,810.64877 v 31.41377 l 7.05891,-6.82472 6.85816,11.57526 h 3.81382 l 0.0669,-3.17819 -6.05527,-11.37451 c 0,0 2.81019,0 4.416,0 1.88461,0 6.05527,0 6.05527,0 z"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

148
data/icons/pianoroll-edit-velocity.svg

@ -0,0 +1,148 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="30"
id="svg2"
version="1.1"
viewBox="147 151 60 60"
width="30"
sodipodi:docname="pianoroll-edit-velocity.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata3495">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1373"
id="namedview3493"
showgrid="false"
inkscape:zoom="22.627417"
inkscape:cx="5.8192921"
inkscape:cy="12.671591"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<defs
id="defs10">
<inkscape:path-effect
effect="bspline"
id="path-effect7258"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect7254"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect7250"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect7246"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect7258-9"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
id="layer2"
style="display:inline"
transform="translate(0,-637.6694)"
inkscape:groupmode="layer"
inkscape:label="Symbol">
<g
transform="matrix(0.64989334,0,0,0.62419381,152.26246,783.82476)"
id="g1">
<polygon
id="polygon1"
points="39.389,13.769 22.235,28.606 6,28.606 6,47.699 21.989,47.699 39.389,62.75 "
style="fill:#111111;stroke:#111111;stroke-width:5;stroke-linejoin:round" />
<path
inkscape:connector-curvature="0"
id="path1"
d="m 48.128,49.03 c 1.929,-3.096 3.062,-6.739 3.062,-10.653 0,-3.978 -1.164,-7.674 -3.147,-10.8"
style="fill:none;stroke:#111111;stroke-width:5;stroke-linecap:round" />
<path
inkscape:connector-curvature="0"
id="path2"
d="m 55.082,20.537 c 3.695,4.986 5.884,11.157 5.884,17.84 0,6.621 -2.151,12.738 -5.788,17.699"
style="fill:none;stroke:#111111;stroke-width:5;stroke-linecap:round" />
<path
inkscape:connector-curvature="0"
id="path6316"
d="m 61.71,62.611 c 5.267,-6.666 8.418,-15.08 8.418,-24.233 0,-9.217 -3.192,-17.682 -8.519,-24.368"
style="fill:none;stroke:#111111;stroke-width:5;stroke-linecap:round" />
</g>
<path
style="display:inline;fill:#979797;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.218;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 149.2191,845.46587 c 0,0 36.7809,-0.3986 36.7809,-0.3986 0,0 0,-9.94311 0,-9.94311 0,0 -36.7809,10.34171 -36.7809,10.34171 z"
id="path7256-3"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect7258-9"
inkscape:original-d="M 149.2191,845.46587 186,845.06727 v -9.94311 z"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.218;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 149.2191,845.46587 c 0,0 55.43971,0 55.43971,0 0,0 0,-15.59996 0,-15.59996 0,0 -55.43971,15.59996 -55.43971,15.59996 z"
id="path7256"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect7258"
inkscape:original-d="m 149.2191,845.46587 h 55.43971 v -15.59996 z"
sodipodi:nodetypes="cccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

178
data/icons/pianoroll-select-events.svg

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="30"
id="svg2"
version="1.1"
viewBox="147 151 60 60"
width="30"
sodipodi:docname="pianoroll-select-events.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata3495">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1373"
id="namedview3493"
showgrid="false"
inkscape:zoom="32"
inkscape:cx="16.686132"
inkscape:cy="15.099995"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<defs
id="defs10" />
<g
id="layer2"
style="display:inline"
transform="translate(0,-637.6694)"
inkscape:groupmode="layer"
inkscape:label="Symbol">
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,790.6694 58.9018,0"
id="path4608"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,846.6694 58.9018,0"
id="path4608-7"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609"
width="0.5"
height="54.6255"
x="151.1875"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-6"
width="0.5"
height="54.6255"
x="161.41251"
y="791.35663" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.21914601;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888"
width="13.875"
height="2"
x="147.6875"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-7"
width="0.5"
height="54.6255"
x="171.6375"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3"
width="10.5"
height="2"
x="161.46875"
y="818.73187" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-5"
width="0.5"
height="54.6255"
x="181.8625"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-3"
width="0.5"
height="54.6255"
x="192.08749"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-56"
width="0.5"
height="54.6255"
x="202.3125"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.48189068;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-2"
width="20.5"
height="2"
x="182.03125"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9"
width="10.5"
height="2"
x="171.71875"
y="811.79437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-1"
width="10.5"
height="2"
x="151.1875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-2"
width="10.5"
height="2"
x="171.6875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-7"
width="10.5"
height="2"
x="192.25"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.65968394;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-0"
width="4.0625"
height="2"
x="202.5"
y="811.79437" />
<rect
style="opacity:1;fill:#667cc8;fill-opacity:0.59825326;fill-rule:evenodd;stroke:#000000;stroke-width:0.76644963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect7903"
width="36.421051"
height="33.608551"
x="150.13322"
y="804.36511" />
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.45843065;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3076"
d="m 187.19757,806.43643 v 22.82445 l 5.12883,-4.95867 4.98297,8.41029 h 2.77102 l 0.0486,-2.30919 -4.3996,-8.26444 c 0,0 2.04182,0 3.20855,0 1.36931,0 4.39961,0 4.39961,0 z"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

135
data/icons/pianoroll-split-segment.svg

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="30"
id="svg2"
version="1.1"
viewBox="147 151 60 60"
width="30"
sodipodi:docname="pianoroll-split-segment.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata3495">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1373"
id="namedview3493"
showgrid="false"
inkscape:zoom="32.000001"
inkscape:cx="14.805775"
inkscape:cy="13.993285"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<defs
id="defs10">
<inkscape:path-effect
effect="bspline"
id="path-effect9248"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
id="layer2"
style="display:inline"
transform="translate(0,-637.6694)"
inkscape:groupmode="layer"
inkscape:label="Symbol">
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.742;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 147.5491,790.6694 58.9018,0"
id="path4608"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,846.6694 58.9018,0"
id="path4608-7"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609"
width="0.5"
height="54.6255"
x="151.1875"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-6"
width="0.5"
height="54.6255"
x="161.41251"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-7"
width="0.5"
height="54.6255"
x="171.6375"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-5"
width="0.5"
height="54.6255"
x="181.8625"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-3"
width="0.5"
height="54.6255"
x="192.08749"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-56"
width="0.5"
height="54.6255"
x="202.3125"
y="791.35663" />
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 177,790.9194 c 0,0 0,55.625 0,55.625"
id="path9246"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect9248"
inkscape:original-d="m 177,790.9194 v 55.625"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
class="sharpcorners_een"
d="m 175.16964,824.98633 z m 7.75922,-0.60258 c 2.00957,-1.58991 4.58713,-2.54704 7.39386,-2.54704 6.41068,0 11.62557,4.99231 11.62557,11.12936 0,6.13702 -5.21489,11.12933 -11.62557,11.12933 -6.41066,0 -11.62556,-4.99231 -11.62556,-11.12933 v -3.33722 l -1.50966,-1.98738 -1.50966,1.98738 v 3.33722 c 0,6.13702 -5.2149,11.12933 -11.62556,11.12933 -6.41068,0 -11.62557,-4.99231 -11.62557,-11.12933 0,-6.13705 5.21489,-11.12936 11.62557,-11.12936 2.80673,0 5.38429,0.95713 7.39386,2.54704 l 1.63421,-2.14957 -11.61395,-15.28693 c -5.38595,-7.0894 -0.0115,-10.82885 -0.0115,-10.82885 z m -5.89249,-0.95713 c 0.91675,0 1.66079,-0.71227 1.66079,-1.58991 0,-0.87763 -0.74404,-1.58989 -1.66079,-1.58989 -0.91676,0 -1.6608,0.71226 -1.6608,1.58989 0,0.87764 0.74404,1.58991 1.6608,1.58991 z m 13.28635,3.17981 c -3.66869,0 -6.64317,2.84753 -6.64317,6.35964 0,3.51209 2.97448,6.35961 6.64317,6.35961 3.66871,0 6.6432,-2.84752 6.6432,-6.35961 0,-3.51211 -2.97449,-6.35964 -6.6432,-6.35964 z m -26.27044,0 c -3.66871,0 -6.6432,2.84753 -6.6432,6.35964 0,3.51209 2.97449,6.35961 6.6432,6.35961 3.66869,0 6.64317,-2.84752 6.64317,-6.35961 0,-3.51211 -2.97448,-6.35964 -6.64317,-6.35964 z m 18.26873,-5.72364 10.58759,-13.93554 c 5.38595,-7.0894 0.0115,-10.82885 0.0115,-10.82885 l -14.70636,19.3587 z"
style="fill:#111918;stroke-width:1.624964"
id="path9305" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

13
data/icons/placeholders/error.svg

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 8 2 C 4.6862928 2 2 4.6862997 2 8 C 2 11.3137 4.6862928 14 8 14 C 11.313707 14 14 11.3137 14 8 C 14 4.6862997 11.313707 2 8 2 z M 8 3 C 10.761424 3 13 5.2385763 13 8 C 13 9.199635 12.548037 10.263384 11.84375 11.125 L 4.875 4.15625 C 5.7366165 3.4519627 6.8003651 3 8 3 z M 4.15625 4.875 L 11.125 11.84375 C 10.263384 12.548037 9.199635 13 8 13 C 5.2385763 13 3 10.761424 3 8 C 3 6.8003651 3.4519627 5.7366165 4.15625 4.875 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 766 B

166
data/icons/track-type-pianoroll.svg

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="30"
id="svg2"
version="1.1"
viewBox="147 151 60 60"
width="30"
sodipodi:docname="track-type-pianoroll.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata3495">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1373"
id="namedview3493"
showgrid="false"
inkscape:zoom="32"
inkscape:cx="5.0455068"
inkscape:cy="15.099995"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<defs
id="defs10" />
<g
id="layer2"
style="display:inline"
transform="translate(0,-637.6694)"
inkscape:groupmode="layer"
inkscape:label="Symbol">
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,790.6694 58.9018,0"
id="path4608"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.55646701pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 147.5491,846.6694 58.9018,0"
id="path4608-7"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609"
width="0.5"
height="54.6255"
x="151.1875"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-6"
width="0.5"
height="54.6255"
x="161.41251"
y="791.35663" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.21914601;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888"
width="13.875"
height="2"
x="147.6875"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-7"
width="0.5"
height="54.6255"
x="171.6375"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3"
width="10.5"
height="2"
x="161.46875"
y="818.73187" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-5"
width="0.5"
height="54.6255"
x="181.8625"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-3"
width="0.5"
height="54.6255"
x="192.08749"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06709313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4609-56"
width="0.5"
height="54.6255"
x="202.3125"
y="791.35663" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.48189068;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-2"
width="20.5"
height="2"
x="182.03125"
y="821.29437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9"
width="10.5"
height="2"
x="171.71875"
y="811.79437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-1"
width="10.5"
height="2"
x="151.1875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-2"
width="10.5"
height="2"
x="171.6875"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06055665;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-7"
width="10.5"
height="2"
x="192.25"
y="840.04437" />
<rect
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.65968394;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect888-3-9-0"
width="4.0625"
height="2"
x="202.5"
y="811.79437" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

6
data/icons/wscript

@ -45,6 +45,11 @@ def build(ctx):
ctx.static_file('note-half.svg')
ctx.static_file('note-quarter.svg')
ctx.static_file('note-whole.svg')
ctx.static_file('pianoroll-arrange-segments.svg')
ctx.static_file('pianoroll-edit-events.svg')
ctx.static_file('pianoroll-edit-velocity.svg')
ctx.static_file('pianoroll-select-events.svg')
ctx.static_file('pianoroll-split-segment.svg')
ctx.static_file('pointer.svg')
ctx.static_file('rest-16th.svg')
ctx.static_file('rest-32th.svg')
@ -60,6 +65,7 @@ def build(ctx):
ctx.static_file('track-type-beat.svg')
ctx.static_file('track-type-control.svg')
ctx.static_file('track-type-group.svg')
ctx.static_file('track-type-pianoroll.svg')
ctx.static_file('track-type-sample.svg')
ctx.static_file('track-type-score.svg')
ctx.static_file('track-visible.svg')

2
noisicaa/audioproc/engine/double_buffered_state_manager.h

@ -43,7 +43,7 @@ public:
uint64_t sequence_number = 0;
virtual void apply_mutation(Mutation* mutation) = 0;
virtual void apply_mutation(Logger* logger, Mutation* mutation) = 0;
};
template <class State, class Mutation>

4
noisicaa/audioproc/engine/double_buffered_state_manager.inl.h

@ -80,14 +80,14 @@ void DoubleBufferedStateManager<State, Mutation>::handle_mutation(Mutation* muta
assert(_latest_sequence_number - state->sequence_number == _buffered_mutations.size());
for (const auto& it : _buffered_mutations) {
//_logger->info("Replay %s", it->to_string().c_str());
state->apply_mutation(it.get());
state->apply_mutation(_logger, it.get());
++state->sequence_number;
}
_buffered_mutations.clear();
}
//_logger->info("Apply %s", mutation->to_string().c_str());
state->apply_mutation(mutation);
state->apply_mutation(_logger, mutation);
++state->sequence_number;
// Buffer this mutation, so it can be replayed on the other state (which is now at least

2
noisicaa/audioproc/public/musical_time.pyi

@ -52,6 +52,7 @@ class PyMusicalDuration(value_types.ProtoValue):
@property
def fraction(self) -> fractions.Fraction: ...
def to_float(self) -> float: ...
def as_time(self) -> PyMusicalTime: ...
def __bool__(self) -> bool: ...
def __eq__(self, other: Any) -> bool: ...
def __ne__(self, other: Any) -> bool: ...
@ -93,6 +94,7 @@ class PyMusicalTime(value_types.ProtoValue):
@property
def fraction(self) -> fractions.Fraction: ...
def to_float(self) -> float: ...
def relative_to(self, other: PyMusicalTime) -> PyMusicalTime: ...
def __bool__(self) -> bool: ...
def __eq__(self, other: Any) -> bool: ...
def __ne__(self, other: Any) -> bool: ...

6
noisicaa/audioproc/public/musical_time.pyx

@ -98,6 +98,9 @@ cdef class PyMusicalDuration(object):
def to_float(self):
return float(self._duration.to_float())
def as_time(self):
return PyMusicalTime.create(MusicalTime(self._duration.numerator(), self._duration.denominator()))
def __bool__(PyMusicalDuration self):
return self._duration != MusicalDuration(0, 1)
@ -210,6 +213,9 @@ cdef class PyMusicalTime(object):
def to_float(self):
return float(self._time.to_float())
def relative_to(PyMusicalTime self, PyMusicalTime other):
return (self - other).as_time()
def __bool__(PyMusicalTime self):
return self._time != MusicalTime(0, 1)

76
noisicaa/builtin_nodes/beat_track/track_ui.py

@ -32,6 +32,7 @@ from noisicaa import audioproc
from noisicaa import value_types
from noisicaa.ui.track_list import measured_track_editor
from noisicaa.ui.track_list import tools
from noisicaa.builtin_nodes.pianoroll import processor_messages
from . import model
logger = logging.getLogger(__name__)
@ -47,34 +48,37 @@ class EditBeatsTool(measured_track_editor.MeasuredToolBase):
def iconName(self) -> str:
return 'edit-beats'
def mouseMoveEvent(self, target: Any, evt: QtGui.QMouseEvent) -> None:
assert isinstance(target, BeatMeasureEditor), type(target).__name__
target.setGhostTime(target.xToTime(evt.pos().x()))
super().mouseMoveEvent(target, evt)
def mouseMoveMeasureEvent(
self, measure: measured_track_editor.BaseMeasureEditor, evt: QtGui.QMouseEvent) -> None:
assert isinstance(measure, BeatMeasureEditor), type(measure).__name__
measure.setGhostTime(measure.xToTime(evt.pos().x()))
super().mouseMoveMeasureEvent(measure, evt)
def mousePressEvent(self, target: Any, evt: QtGui.QMouseEvent) -> None:
assert isinstance(target, BeatMeasureEditor), type(target).__name__
def mousePressMeasureEvent(
self, measure: measured_track_editor.BaseMeasureEditor, evt: QtGui.QMouseEvent) -> None:
assert isinstance(measure, BeatMeasureEditor), type(measure).__name__
if (evt.button() == Qt.LeftButton and evt.modifiers() == Qt.NoModifier):
click_time = target.xToTime(evt.pos().x())
click_time = measure.xToTime(evt.pos().x())
for beat in target.measure.beats:
for beat in measure.measure.beats:
if beat.time == click_time:
with self.project.apply_mutations('%s: Remove beat' % target.track.name):
target.measure.delete_beat(beat)
with self.project.apply_mutations('%s: Remove beat' % measure.track.name):
measure.measure.delete_beat(beat)
evt.accept()
return
with self.project.apply_mutations('%s: Insert beat' % target.track.name):
target.measure.create_beat(click_time)
target.track_editor.playNoteOn(target.track.pitch)
with self.project.apply_mutations('%s: Insert beat' % measure.track.name):
measure.measure.create_beat(click_time)
measure.track_editor.playNoteOn(measure.track.pitch)
evt.accept()
return
super().mousePressEvent(target, evt)
super().mousePressMeasureEvent(measure, evt)
def wheelEvent(self, target: Any, evt: QtGui.QWheelEvent) -> None:
assert isinstance(target, BeatMeasureEditor), type(target).__name__
def wheelMeasureEvent(
self, measure: measured_track_editor.BaseMeasureEditor, evt: QtGui.QWheelEvent) -> None:
assert isinstance(measure, BeatMeasureEditor), type(measure).__name__
if evt.modifiers() in (Qt.NoModifier, Qt.ShiftModifier):
if evt.modifiers() == Qt.ShiftModifier:
@ -82,25 +86,25 @@ class EditBeatsTool(measured_track_editor.MeasuredToolBase):
else:
vel_delta = (10 if evt.angleDelta().y() > 0 else -10)
click_time = target.xToTime(evt.pos().x())
click_time = measure.xToTime(evt.pos().x())
for beat in target.measure.beats:
for beat in measure.measure.beats:
if beat.time == click_time:
with self.project.apply_mutations(
'%s: Change beat velocity' % target.track.name):
'%s: Change beat velocity' % measure.track.name):
beat.velocity = max(0, min(127, beat.velocity + vel_delta))
evt.accept()
return
super().wheelEvent(target, evt)
super().wheelMeasureEvent(measure, evt)
class BeatToolBox(tools.ToolBox):
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.addTool(measured_track_editor.ArrangeMeasuresTool(context=self.context))
self.addTool(EditBeatsTool(context=self.context))
self.addTool(measured_track_editor.ArrangeMeasuresTool)
self.addTool(EditBeatsTool)
class BeatMeasureEditor(measured_track_editor.MeasureEditor):
@ -228,35 +232,35 @@ class BeatMeasureEditor(measured_track_editor.MeasureEditor):
class BeatTrackEditor(measured_track_editor.MeasuredTrackEditor):
measure_editor_cls = BeatMeasureEditor
toolBoxClass = BeatToolBox
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.__play_last_pitch = None # type: value_types.Pitch
self.setHeight(60)
self.setFixedHeight(60)
@property
def track(self) -> model.BeatTrack:
return down_cast(model.BeatTrack, super().track)
def createToolBox(self) -> BeatToolBox:
return BeatToolBox(track=self, context=self.context)
def playNoteOn(self, pitch: value_types.Pitch) -> None:
self.playNoteOff()
# TODO: use messages instead
# self.call_async(
# self.audioproc_client.add_event(
# 'track:%s' % self.track.id,
# audioproc.NoteOnEvent(-1, pitch)))
if self.playerState().playerID():
self.call_async(self.project_view.sendNodeMessage(
processor_messages.note_on_event(
self.track.pipeline_node_id, 0, pitch.midi_note, 100)))
self.__play_last_pitch = pitch
self.__play_last_pitch = pitch
def playNoteOff(self) -> None:
if self.__play_last_pitch is not None:
# TODO: use messages instead
# self.call_async(
# self.audioproc_client.add_event(
# 'track:%s' % self.track.id,
# audioproc.NoteOffEvent(-1, self.__play_last_pitch)))
if self.playerState().playerID():
self.call_async(self.project_view.sendNodeMessage(
processor_messages.note_off_event(
self.track.pipeline_node_id, 0, self.__play_last_pitch.midi_note)))
self.__play_last_pitch = None

2
noisicaa/builtin_nodes/control_track/processor.cpp

@ -44,7 +44,7 @@ bool control_point_comp(const ControlPoint &e1, const ControlPoint &e2) {
namespace noisicaa {
void CVRecipe::apply_mutation(pb::ProcessorMessage* msg) {
void CVRecipe::apply_mutation(Logger* logger, pb::ProcessorMessage* msg) {
if (msg->HasExtension(pb::cvgenerator_add_control_point)) {
const pb::CVGeneratorAddControlPoint& m =
msg->GetExtension(pb::cvgenerator_add_control_point);

2
noisicaa/builtin_nodes/control_track/processor.h

@ -56,7 +56,7 @@ public:
int offset = -1;
MusicalTime current_time = MusicalTime(0, 1);
void apply_mutation(pb::ProcessorMessage* msg) override;
void apply_mutation(Logger* logger, pb::ProcessorMessage* msg) override;
private:
};

131
noisicaa/builtin_nodes/control_track/track_ui.py

@ -41,6 +41,8 @@ logger = logging.getLogger(__name__)
class EditControlPointsTool(tools.ToolBase):
track = None # type: ControlTrackEditor
def __init__(self, **kwargs: Any) -> None:
super().__init__(
type=tools.ToolType.EDIT_CONTROL_POINTS,
@ -56,15 +58,13 @@ class EditControlPointsTool(tools.ToolBase):
def iconName(self) -> str:
return 'edit-control-points'
def mousePressEvent(self, target: Any, evt: QtGui.QMouseEvent) -> None:
assert isinstance(target, ControlTrackEditor), type(target).__name__
target.updateHighlightedPoint()
def mousePressEvent(self, evt: QtGui.QMouseEvent) -> None:
self.track.updateHighlightedPoint()
if (evt.button() == Qt.LeftButton
and evt.modifiers() == Qt.NoModifier
and target.highlightedPoint() is not None):
self.__moving_point = target.highlightedPoint()
and self.track.highlightedPoint() is not None):
self.__moving_point = self.track.highlightedPoint()
self.__moving_point_original_pos = self.__moving_point.pos()
self.__moving_point_offset = evt.pos() - self.__moving_point.pos()
self.__move_mode = 'any'
@ -72,14 +72,14 @@ class EditControlPointsTool(tools.ToolBase):
point_index = self.__moving_point.index
if point_index > 0:
range_left = target.points[point_index - 1].pos().x() + 1
range_left = self.track.points[point_index - 1].pos().x() + 1
else:
range_left = target.timeToX(audioproc.MusicalTime(0, 1))
range_left = self.track.timeToX(audioproc.MusicalTime(0, 1))
if point_index < len(target.points) - 1:
range_right = target.points[point_index + 1].pos().x() - 1
if point_index < len(self.track.points) - 1:
range_right = self.track.points[point_index + 1].pos().x() - 1
else:
range_right = target.timeToX(target.projectEndTime())
range_right = self.track.timeToX(self.track.projectEndTime())
self.__move_range = (range_left, range_right)
@ -88,24 +88,22 @@ class EditControlPointsTool(tools.ToolBase):
if (evt.button() == Qt.LeftButton
and evt.modifiers() == Qt.ShiftModifier
and target.highlightedPoint() is not None):
with self.project.apply_mutations('%s: Remove control point' % target.track.name):
target.track.delete_control_point(target.highlightedPoint().point)
and self.track.highlightedPoint() is not None):
with self.project.apply_mutations('%s: Remove control point' % self.track.track.name):
self.track.track.delete_control_point(self.track.highlightedPoint().point)
evt.accept()
return
if evt.button() == Qt.RightButton and self.__moving_point is not None:
target.setPointPos(self.__moving_point, self.__moving_point_original_pos)
self.track.setPointPos(self.__moving_point, self.__moving_point_original_pos)
self.__moving_point = None
evt.accept()
return
super().mousePressEvent(target, evt)
def mouseMoveEvent(self, target: Any, evt: QtGui.QMouseEvent) -> None:
assert isinstance(target, ControlTrackEditor), type(target).__name__
super().mousePressEvent(evt)
def mouseMoveEvent(self, evt: QtGui.QMouseEvent) -> None:
if self.__moving_point is not None:
new_pos = evt.pos() - self.__moving_point_offset
@ -132,78 +130,75 @@ class EditControlPointsTool(tools.ToolBase):
if new_pos.y() < 0:
new_pos.setY(0)
elif new_pos.y() > target.height() - 1:
new_pos.setY(target.height() - 1)
elif new_pos.y() > self.track.height() - 1:
new_pos.setY(self.track.height() - 1)
target.setPointPos(self.__moving_point, new_pos)
self.track.setPointPos(self.__moving_point, new_pos)
evt.accept()
return
target.updateHighlightedPoint()
self.track.updateHighlightedPoint()
super().mouseMoveEvent(target, evt)
def mouseReleaseEvent(self, target: Any, evt: QtGui.QMouseEvent) -> None:
assert isinstance(target, ControlTrackEditor), type(target).__name__
super().mouseMoveEvent(evt)
def mouseReleaseEvent(self, evt: QtGui.QMouseEvent) -> None:
if evt.button() == Qt.LeftButton and self.__moving_point is not None:
pos = self.__moving_point.pos()
self.__moving_point = None
if self.__move_mode != 'vertical':
new_time = target.xToTime(pos.x())
new_time = self.track.xToTime(pos.x())
else:
new_time = None
if self.__move_mode != 'horizontal':
new_value = target.yToValue(pos.y())
new_value = self.track.yToValue(pos.y())
else:
new_value = None
with self.project.apply_mutations('%s: Change control point' % target.track.name):
target.highlightedPoint().point.time = new_time
target.highlightedPoint().point.value = new_value
with self.project.apply_mutations('%s: Change control point' % self.track.track.name):
self.track.highlightedPoint().point.time = new_time
self.track.highlightedPoint().point.value = new_value
</