create_drum_kit_actions.py•2.65 kB
#!/usr/bin/env python3
"""
Create a drum kit in REAPER using OSC action IDs
This script uses REAPER's specific action IDs to create tracks properly
"""
import sys
import time
from pythonosc import udp_client
# OSC settings (matching our server configuration)
REAPER_OSC_HOST = "192.168.1.110"
REAPER_OSC_PORT = 8000
# REAPER Action IDs
ACTION_NEW_PROJECT = 40023
ACTION_INSERT_TRACK = 40001
ACTION_SELECT_TRACK_1 = 40939
ACTION_SELECT_TRACK_2 = 40940
ACTION_SELECT_TRACK_3 = 40941
ACTION_SELECT_TRACK_4 = 40942
ACTION_INSERT_MIDI_ITEM = 40214
ACTION_SET_TEMPO = 40364
def main():
    print("Creating a drum kit in REAPER using action IDs...")
    
    # Create OSC client
    client = udp_client.SimpleUDPClient(REAPER_OSC_HOST, REAPER_OSC_PORT)
    
    # Create a new project
    print("Creating a new project...")
    client.send_message("/action", [ACTION_NEW_PROJECT])
    time.sleep(1.5)
    
    # Create drum tracks (we need to create 4 tracks)
    track_names = ["Kick", "Snare", "Hi-Hat", "Crash"]
    
    for i, name in enumerate(track_names):
        if i > 0:  # First track already exists, create additional tracks
            print(f"Creating track {i+1}...")
            client.send_message("/action", [ACTION_INSERT_TRACK])
            time.sleep(0.8)
        
        # Select the track (track 1 is already selected after creation)
        if i == 1:
            client.send_message("/action", [ACTION_SELECT_TRACK_2])
        elif i == 2:
            client.send_message("/action", [ACTION_SELECT_TRACK_3])
        elif i == 3:
            client.send_message("/action", [ACTION_SELECT_TRACK_4])
        time.sleep(0.5)
        
        # Name the track
        print(f"Naming track: {name}...")
        client.send_message(f"/track/{i}/name", [name])
        time.sleep(0.5)
        
        # Insert MIDI item
        print(f"Adding MIDI item to {name} track...")
        client.send_message("/action", [ACTION_INSERT_MIDI_ITEM])
        time.sleep(0.8)
    
    # Set project tempo to 120 BPM
    print("Setting project tempo to 120 BPM...")
    # First select tempo dialog
    client.send_message("/action", [ACTION_SET_TEMPO])
    time.sleep(0.8)
    # Then send the tempo value (this might not work via OSC, but worth trying)
    client.send_message("/tempo", [120.0])
    time.sleep(0.5)
    
    print("\nDrum kit created with the following tracks:")
    for name in track_names:
        print(f"- {name}")
    
    print("\nCheck REAPER to see if the tracks were created properly.")
    print("You may need to manually set the tempo to 120 BPM if that didn't work via OSC.")
if __name__ == "__main__":
    main()