A Python piano video exporter.


Keywords
opencv, piano, pianovis, pygame, python, video
Licenses
GPL-3.0/GPL-3.0+
Install
pip install piano-vis==0.2.1

Documentation

logo

PianoVis 0.2.1

A Python piano video exporter.

Examples:


Quick Start

  1. Install PianoVis: pip install piano-vis
    • Dependencies:
      • pygame
      • opencv-python
      • mido
      • colorama
      • vext (optional, for playing sound during preview)
      • vext.gi (optional, for playing sound during preview)
      • playsound (optional, for playing sound during preview)
      • win10toast (only on Windows)
  2. Follow this code format:
import pianovis

resolution = (1920, 1080)
fps = 30
offset = 1

vid = pianovis.Video(resolution, fps, offset)
vid.add_midi("midi1.mid")
vid.add_midi("midi2.mid")
vid.set_audio("audio.mp3")
vid.export("video.mp4")

pianovis.Video

pianovis.Video is the main video class which stores all midi and audio files, and exports the final video.

  • Video.__init__(resolution: Tuple[int, int], fps: int, offset: int) -> None
    • Initializes video.
    • resolution: (x, y) pixel resolution of video.
    • fps: FPS (frames per second) of video.
    • offset: Offset (frames) of video from audio. Usually, a value of 1 makes the video look lined up with the audio.
    • decor_surf=None Decoration surface, blitted under the piano.
  • Video.configure(path: str, value: Any) -> None
    • Sets an option for the video (read more in the Customization section).
    • path: Option path.
    • value: Value to set path to.
  • Video.add_midi(path: str) -> None
    • Appends path to midi list.
    • path: Midi file path.
  • Video.set_audio(path: str) -> None
    • Sets audio file to path.
    • path: Audio file path.
  • Video.preview(resolution: Tuple[int, int] = (1600, 900), show_meta: bool = True) -> None:
    • Opens a pygame window to preview the animation.
    • resolution=(1600, 900): Resolution of pygame window.
    • show_meta=True: Show metadata in the corner of window.
    • audio=True: Play audio along preview.
  • Video.export(self, path: str, multicore: bool = False, max_cores: int = multiprocessing.cpu_count(), notify: bool = False) -> None:
    • Exports video to path.
    • path: Path to export (mp4)
    • multicore=False: Use multiple cores to export. Can be faster, but will take more power.
    • max_cores=multiprocessing.cpu_count(): Maximum cores to use. Only relevant if using multicore.
    • notify=False: Sends notification when done exporting. Requires win10toast on Windows.

Customization

Run Video.configure to change options.

  • keys.white.gap: Gap (pixels) between white keys.
  • keys.white.color: Color (RGB) of white keys.
  • keys.black.width_fac: Factor of white key width.
  • keys.black.height_fac: Factor of white key height.
  • keys.black.color: Color (RGB) of black keys.
  • blocks.speed: Speed (pixels per second) of blocks.
  • blocks.border: Border width (pixels) of blocks.
  • blocks.color_grad: Color gradient of blocks: ((fac1, hsv1), (fac2, hsv2)...)
  • blocks.color_hue: Hue adjustment (additive) to color.
  • blocks.color_saturation: Saturation adjustment (multiplicative) to color.
  • blocks.color_value: Value adjustment (multiplicative) to color.
  • blocks.color_border: Color (RGB) of border.
  • blocks.rounding: Rounding radius of blocks.
  • blocks.motion_blur: Use motion blur in blocks.
  • blocks.light: Light up blocks when hit. Still in development.

How It Works

  • The user adds midis and sets an audio.
  • When the user calls Video.export, a few things happen:
    • All midis are parsed.
    • Single core:
      • Each frame is rendered with pygame, saved, and encoded with opencv.
      • All temporary files are deleted.
    • Multi core:
      • Each core is assigned a chunk of frames and renders and saves them.
      • Each frame is encoded with opencv.
      • All temporary files are deleted.
    • The audio is combined with video with ffmpeg.

Extras

Constants (pianovis.constants)

Note: pianovis.BLACK == pianovis.constants.BLACK

  • Colors (Normalized HSV)
  • Block color gradient presets.

App (pianovis.app)

  • Create piano videos in a GUI.
  • Currently version 1 (in development)
  • Run pianovis.app.launch() to launch the latest version.