From 7664a7e232a5e252b0f9ecc06b445cab7cb7a1b5 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 1 Apr 2021 16:11:19 +0300 Subject: [PATCH] New pywasm3 example: Hondarribia by Peter Salomonsen --- platforms/python/examples/pygame-audio.py | 75 ++++++++++++++++++ .../python/examples/wasm/hondarribia.wasm | Bin 0 -> 15166 bytes 2 files changed, 75 insertions(+) create mode 100644 platforms/python/examples/pygame-audio.py create mode 100644 platforms/python/examples/wasm/hondarribia.wasm diff --git a/platforms/python/examples/pygame-audio.py b/platforms/python/examples/pygame-audio.py new file mode 100644 index 0000000..c4deb6c --- /dev/null +++ b/platforms/python/examples/pygame-audio.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +import os, struct, time +import multiprocessing as mp +import wasm3 +import numpy + +os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "true" + +def consumer(conn): + import pygame + pygame.mixer.pre_init(frequency=44100, size=-16, channels=2) + pygame.init() + + channel = pygame.mixer.Channel(0) + while True: + chunk = pygame.mixer.Sound(buffer=conn.recv()) + + indicator = '|' if channel.get_queue() else '.' + print(indicator, end='', flush=True) + while channel.get_queue() != None: + time.sleep(0.01) + + channel.queue(chunk) + + pygame.quit() + + +if __name__ == '__main__': + print("Hondarribia - Intro song WebAssembly Summit 2020 by Peter Salomonsen") + print("Source: https://petersalomonsen.com/webassemblymusic/livecodev2/?gist=5b795090ead4f192e7f5ee5dcdd17392") + print("Synthesized: https://soundcloud.com/psalomo/hondarribia") + + conn, child_conn = mp.Pipe() + p = mp.Process(target=consumer, args=(child_conn,)) + p.start() + + scriptpath = os.path.dirname(os.path.realpath(__file__)) + wasm_fn = os.path.join(scriptpath, "./wasm/hondarribia.wasm") + + # Prepare Wasm3 engine + + env = wasm3.Environment() + rt = env.new_runtime(1024) + with open(wasm_fn, "rb") as f: + mod = env.parse_module(f.read()) + rt.load(mod) + + buff = b'' + buff_sz = 256 + print("Pre-buffering...") + + def fd_write(fd, wasi_iovs, iows_len, nwritten): + global buff, buff_sz + mem = rt.get_memory(0) + + # decode + (off, size) = struct.unpack(" buff_sz*1024: + conn.send(buff) + buff = b'' + buff_sz = 64 + + return size + + mod.link_function("wasi_unstable", "fd_write", "i(i*i*)", fd_write) + + wasm_start = rt.find_function("_start") + wasm_start() + + p.join() diff --git a/platforms/python/examples/wasm/hondarribia.wasm b/platforms/python/examples/wasm/hondarribia.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e58fbd73c4c8df7ff44fbcaf87dc3c45aa8b5fda GIT binary patch literal 15166 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 literal 0 HcmV?d00001