Mouse Input
Example script (scamp): examples/Tutorial/27_mouse_input.py
Download: 27_mouse_input.py
(WARNING: consumes mouse events and makes the mouse otherwise unresponsive. To avoid this, you can remove the suppress=True flag under register_mouse_listener) Demonstration of receiving computer mouse events and using them to play notes based on x and y position. Notes are started on mouse down and released on mouse up. Left click plays a piano note, and right click plays a flute note. X position controls pitch, Y controls volume. By moving the mouse after clicking, the pitch can be bent up and down and the volume can be changed.
Topics: Interactivity & visualization › Mouse input
from scamp import *
s = Session()
piano = s.new_part("piano")
flute = s.new_part("flute")
# information about a note that has been started
note_started = None
def mouse_down(x, y, button):
global note_started
pitch = 50 + 49 * x
note_started = {
# fixed=False so we can freely animate both pitch and volume (up or down); the explicit velocity=1 leaves
# expression headroom for volume to rise above its start value
"handle": (piano if button == "left" else flute).start_note(pitch, 1 - 0.8 * y, fixed=False, velocity=1),
"start_pitch": pitch,
"start_x": x
}
def mouse_up(x, y, button):
global note_started
if note_started is not None:
note_started["handle"].end()
note_started = None
def mouse_move(x, y):
if note_started is not None:
note_started["handle"].change_pitch(note_started["start_pitch"] + 4 * (x - note_started["start_x"]), 0.1)
note_started["handle"].change_volume(1 - 0.8*y, 0.1)
# note: suppress=True causes mouse events to be consumed by this script, effectively disabling the mouse
s.register_mouse_listener(on_move=mouse_move, on_press=mouse_down, on_release=mouse_up,
relative_coordinates=True, suppress=True)
s.wait_forever()