MIDIPianoRollView 0.0.1

MIDIPianoRollView 0.0.1

Cem Olcay 维护。



  • cemolcay

MIDIPianoRollView

一个可自定义的 UIScrollView 子类,用于在钢琴卷视图中渲染/编辑 MIDI 音符。

演示

alt tag

要求

  • iOS 9.0+
  • Swift 4.2+
  • Xcode 10.0+

用法

从 storyboard(UIScrollView 子类)或以编程方式创建 MIDIPianoRollView

MIDIPianoRollView.Keys

  • 一个枚举,表示钢琴卷键的数据源。
  • 可以是以下之一
    • 一个如 30...50UInt8 MIDI 音符的范围(30号音符到50号音符)
    • 指定音阶范围内的音符 Scale
    • 或自定义无序音高。

MIDIPianoRollView.Bars

  • 表示钢琴卷帘音高上的小节数量的枚举。
  • 可以是以下之一
    • .fixed(barCount)确定的固定值
    • .auto通过数据源自动计算小节数量。

MIDIPianoRollNote

  • 通过设置notes数据源数组来弹出音符。
  • 它是一个包含每个音符的起始位置、持续时间、MIDI音高和速度数据的[MIDIPianoRollNote]数组。

MIDIPianoRollPosition

  • 这代表钢琴卷帘上音符的位置和持续时间值。包含barbeatsubbeatcent值。
  • 它们都是Int类型,符合ComparableEquatableCodable以及自定义的+-运算符。
  • 每个bar根据钢琴卷帘的timesignature包含若干个beat
  • 每个beat有4个subbeat
  • 每个subbeat有240个cent进行微调。

MIDIPianoRollCellView

  • 钢琴卷帘上的每个单元格都是MIDIPianoRollCellView的子类。
  • 您可以通过继承它来基本创建自己的单元格视图。

MIDIPianoRollRowView

  • 钢琴卷帘右侧的每个键视图是MIDIPianoRollRowView的子类。
  • 您可以通过添加一些钢琴键图片来自定义子类并在钢琴卷帘上渲染。

MIDIPianoRollMeasureView

  • 度量是一个自定义视图,包含多个CALayer,用于渲染位置文本和引导线。
  • 您可以设置网格线宽度和颜色。
  • 您可以设置度量位置标签字体和文字颜色。
  • 如果您不想渲染度量,可以将isMeasureEnabled属性设置为false。

MIDIPianoRollView.ZoomLevel

  • 缩放级别表示在钢琴卷上当前渲染的节拍值。
  • 它具有可自定义的minZoomLevelmaxZoomLevel范围。
  • 每个缩放级别都有音符速率,例如,
    • .halfNotes表示一节有2拍,有2个半音符,
    • .quarterNotes表示一节有4拍,有4个四分音符。
  • 如果您将isZoomingEnabled设置为true,则可以在可自定义的minBeatWidthmaxBeatWidth值之间通过水平捏合来放大或缩小,以设置当前的beatWidth
  • beatWidth达到限制时,根据缩放方向,缩放级别将前进到下一个级别。
  • 您可以设置isZoomingEnabled属性为false来禁用此行为。
  • 相同的也是控制行高缩放。如果垂直捏合缩放,则当前的rowHeight将在minRowHeightmaxRowHeight属性之间缩放。

MIDIPianoRollView.GridLine

  • 包含网格线样式的属性。
  • 您可以设置每条线的宽度、颜色或虚线图案样式。

编辑

  • 您可以通过将isEditing属性设置为true来进入单元格编辑模式。
  • 在编辑模式下,您不能滚动视图,但可以平移单元格以移动或调整大小。
  • 您可以通过设置isMultipleEditingEnabled属性为true来启用/禁用多选编辑。
    • 启用后,您可以通过拖动手指来渲染多选视图以选择拖动框下所有的单元格。
    • 然后您可以移动或调整所选单元格的大小。
  • 编辑完成后,钢琴卷会通知其代理。

MIDIPianoRollViewDelegate

  • 当单元格被编辑时会通知代理。
  • 您可以在代理调用中更新您的notes数据源。
  func midiPianoRollView(_ midiPianoRollView: MIDIPianoRollView,
                         didMove cellView: MIDIPianoRollCellView,
                         to newPosition: MIDIPianoRollPosition,
                         pitch: UInt8)
  • 会通知代理单元格已移动到新的位置和/或行。
  • 您可以使用pitch值来判断单元格移动到了哪一行。
func midiPianoRollView(_ midiPianoRollView: MIDIPianoRollView,
                         didResize cellView: MIDIPianoRollCellView,
                         to newDuration: MIDIPianoRollPosition)
  • 会通知代理单元格的时长已更改。
  • 当单元格被调整大小时会调用。
func midiPianoRollViewMultipleEditingDraggingView(_ midiPianoRollView: MIDIPianoRollView) -> UIView?
  • 如果您想渲染自定义拖选视图,请返回一个自定义的UIView。

示例项目

  • 查看示例项目以获取更多实现信息。

文档

您可以在这里找到文档。