Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local modem = peripheral.find("modem") or error("No modem attached!")
- rednet.open(peripheral.getName(modem))
- local song_data = nil
- local song_name = nil
- local song_file = "song.lua"
- -- DOWNLOAD SONG DATA FROM PASTEBIN
- local function download_song()
- term.clear()
- term.setCursorPos(1, 1)
- write("Enter Pastebin code: ")
- local code = read()
- write("Enter song name to save as: ")
- song_name = read()
- if fs.exists(song_file) then fs.delete(song_file) end
- shell.run("pastebin", "get", code, song_file)
- if fs.exists(song_file) then
- song_data = dofile(song_file)
- print("Song downloaded and loaded!")
- else
- print("Failed to download.")
- end
- sleep(2)
- end
- -- SEND ONLY RELEVANT INSTRUMENT DATA TO SUBS
- local function send_song()
- if not song_data then
- print("No song loaded. Download first.")
- sleep(2)
- return
- end
- if not song_name then
- print("No song name entered.")
- sleep(2)
- return
- end
- print("Broadcasting to find sub-computers...")
- rednet.broadcast("__ping__")
- local found = {}
- local timer = os.startTimer(2)
- while true do
- local id, msg = rednet.receive(2)
- if msg == "__identify__" then
- rednet.send(id, "__get_instrument__")
- local _, instrument = rednet.receive(id, 2)
- if instrument and song_data[instrument] then
- table.insert(found, {id=id, instrument=instrument})
- end
- elseif id == "timer" then
- break
- end
- end
- print("Sending song data...")
- for _, sub in ipairs(found) do
- print(" → ID "..sub.id.." ("..sub.instrument..")")
- rednet.send(sub.id, {
- type = "song_data",
- name = song_name,
- instrument = sub.instrument,
- notes = song_data[sub.instrument]
- })
- end
- print("Finished.")
- sleep(2)
- end
- -- REMOTE SONG LIST + SYNCHRONIZED START
- local function play_song_on_subs()
- print("Requesting song lists from subs...")
- rednet.broadcast("__list_songs__")
- local responses = {}
- local known_songs = {}
- local seen = {}
- local timer = os.startTimer(2)
- while true do
- local id, msg = rednet.receive(2)
- if type(msg) == "table" and msg.type == "song_list" then
- responses[id] = msg.songs
- for _, song in ipairs(msg.songs) do
- if not seen[song] then
- table.insert(known_songs, song)
- seen[song] = true
- end
- end
- elseif id == "timer" then
- break
- end
- end
- if #known_songs == 0 then
- print("No songs found.")
- sleep(2)
- return
- end
- print("Available songs:")
- for i, name in ipairs(known_songs) do
- print(i .. ". " .. name)
- end
- write("Choose song number to play: ")
- local sel = tonumber(read())
- local chosen = known_songs[sel]
- if not chosen then
- print("Invalid selection.")
- sleep(2)
- return
- end
- local start_time = os.time() + 5
- print("Scheduling playback in 5 seconds (at time " .. start_time .. ")")
- for id, song_list in pairs(responses) do
- for _, song in ipairs(song_list) do
- if song == chosen then
- rednet.send(id, {
- type = "__play_song__",
- name = chosen,
- start = start_time
- })
- break
- end
- end
- end
- print("Sent to all matching subs.")
- sleep(2)
- end
- -- LOCAL PLAYBACK FOR TESTING
- local function play_song()
- if not song_data then
- print("No song loaded.")
- sleep(2)
- return
- end
- print("Local playback (all instruments)...")
- for inst, notes in pairs(song_data) do
- print("Playing: " .. inst)
- for _, note in ipairs(notes) do
- redstone.setBundledOutput(note.side, note.color)
- sleep(note.duration)
- redstone.setBundledOutput(note.side, 0)
- end
- end
- sleep(1)
- end
- -- MAIN MENU
- while true do
- term.clear()
- term.setCursorPos(1, 1)
- print("=== Music Hub ===")
- print("1. Download song from Pastebin")
- print("2. Send song to sub-computers")
- print("3. Play song on subs (synchronized)")
- print("4. Play song locally")
- print("5. Exit")
- write("Choose an option: ")
- local choice = read()
- if choice == "1" then
- download_song()
- elseif choice == "2" then
- send_song()
- elseif choice == "3" then
- play_song_on_subs()
- elseif choice == "4" then
- play_song()
- elseif choice == "5" then
- break
- else
- print("Invalid option.")
- sleep(1.5)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement