From 83ec2070a7211611558790c6cf6d55b7282a93ed Mon Sep 17 00:00:00 2001 From: Brian Whitman Date: Fri, 17 Sep 2021 13:28:31 -0400 Subject: [PATCH] better max patch --- alles.maxpat | 57 ++++++++++++++++++++++--------------------------- amy_headers.py | 9 ++++---- deb_menu.mid | Bin 0 -> 21487 bytes 3 files changed, 30 insertions(+), 36 deletions(-) create mode 100644 deb_menu.mid diff --git a/alles.maxpat b/alles.maxpat index f7d5739..cf25c91 100644 --- a/alles.maxpat +++ b/alles.maxpat @@ -4,13 +4,13 @@ "appversion" : { "major" : 8, "minor" : 1, - "revision" : 3, + "revision" : 11, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 156.0, 269.0, 676.0, 540.0 ], + "rect" : [ 1075.0, 270.0, 676.0, 540.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -37,6 +37,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "id" : "obj-20", @@ -45,8 +46,7 @@ "numinlets" : 1, "numoutlets" : 0, "patching_rect" : [ 348.5, 315.0, 167.0, 47.0 ], - "presentation_linecount" : 2, - "text" : "w6, which means, use the karplus-strong oscillators. easy to change and play with!" + "text" : "w5, which means, use the karplus-strong oscillators. easy to change and play with!" } } @@ -58,7 +58,6 @@ "numinlets" : 1, "numoutlets" : 0, "patching_rect" : [ 23.0, 467.0, 265.0, 47.0 ], - "presentation_linecount" : 6, "text" : "This patch plays a midi file to all booted synths, playing each note sequentially to the next synth in a row. Instant surround sound!" } @@ -71,7 +70,6 @@ "numinlets" : 1, "numoutlets" : 0, "patching_rect" : [ 378.5, 273.0, 137.0, 33.0 ], - "presentation_linecount" : 2, "text" : "cpuclock is the host time base" } @@ -84,7 +82,6 @@ "numinlets" : 1, "numoutlets" : 0, "patching_rect" : [ 23.0, 226.0, 137.0, 74.0 ], - "presentation_linecount" : 4, "text" : "% 6 means play each note on 6 synths in a row.. if you have less than 6 it will wrap around" } @@ -96,8 +93,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 378.5, 70.0, 153.0, 33.0 ], - "presentation_linecount" : 2, + "patching_rect" : [ 378.5, 70.0, 155.0, 33.0 ], "text" : "Replace this with whatever midi file you want to play" } @@ -109,8 +105,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 198.5, 30.0, 150.0, 33.0 ], - "presentation_linecount" : 2, + "patching_rect" : [ 198.5, 30.0, 153.0, 33.0 ], "text" : "Start 1024 plays a midi file at normal speed" } @@ -263,8 +258,8 @@ "numinlets" : 4, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 156.333333333333314, 311.0, 149.0, 22.0 ], - "text" : "sprintf c%dn%dw6a%ft%d" + "patching_rect" : [ 156.333333333333314, 311.0, 189.0, 22.0 ], + "text" : "sprintf c%dn%dw5l%ft%db0.997Z" } } @@ -335,13 +330,27 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "int", "bang" ], - "patching_rect" : [ 202.0, 114.0, 269.0, 22.0 ], - "text" : "seq /Users/bwhitman/Downloads/deb_menu.midi" + "patching_rect" : [ 198.5, 109.0, 111.0, 22.0 ], + "text" : "seq deb_menu.mid" } } ], "lines" : [ { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { "patchline" : { "destination" : [ "obj-23", 0 ], "source" : [ "obj-18", 0 ] @@ -437,13 +446,6 @@ "source" : [ "obj-41", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-18", 0 ], - "source" : [ "obj-44", 0 ] - } - } , { "patchline" : { @@ -461,15 +463,8 @@ } , { "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-13", 0 ] + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-44", 0 ] } } diff --git a/amy_headers.py b/amy_headers.py index 5b2720a..0200b79 100644 --- a/amy_headers.py +++ b/amy_headers.py @@ -7,15 +7,14 @@ def generate_alles_pcm_header(pcm_sample_rate=22050): from sf2utils.sf2parse import Sf2File import resampy import numpy as np + # These are the indexes that we liked and fit into the flash on Alles ESP32. You can download the sf2 files here: + # https://github.com/vigliensoni/soundfonts/blob/master/hs_tr808/HS-TR-808-Drums.sf2 + # https://ftp.osuosl.org/pub/musescore/soundfont/MuseScore_General/MuseScore_General.sf2 fns = ( ("/home/bwhitman/sf2/HS-TR-808-Drums.sf2", False), ('/home/bwhitman/sf2/MuseScore_General.sf2', True)) - #good = [0, 3, 8, 11, 14, 16, 17, 18, 20, 23, 25, 26, 29, 30, 31, 32, 37, 39, 40, 42, 47, 49, 50, 52, 58, 63, 69, 74, 76, 77, 80, 82, 83, 85, 86, 95, 96, 99, 100, 101, 107, 108, 109, 112, 116, 117, 118, 120, 127, \ - # 130, 134, 136, 145, 149, 155, 161, 165, 166, 170, 171, 175, 177, 178, 183, 192, 197, 198, 200, 204, 222] good = [0, 3, 8, 11, 14, 16, 17, 18, 20, 23, 25, 26, 29, 30, 31, 32, 37, 39, 40, 42, 47, 49, 50, 52, 58, 63, 69, 74, 76, 80, 83, 85, 86, 95, 96, 99, 100, 101, 107, 108, 109, 112, 116, 117, 118, 120, 127, \ 130, 134, 136, 145, 149, 155, 161, 165, 166, 170, 171, 175, 177, 178, 183, 192, 197, 198, 200, 204] - #good = [0, 3, 8, 11, 14, 16, 17, 18, 20, 23, 25, 26, 29, 30, 32, 37, 39, 40, 42, 49, 52, 58, 63, 69, 74, 76, 83, 85, 86, 95, 96, 99, 100, 101, 107, 108, 116, 117, 118, 120, 127, \ - # 130, 134, 136, 145, 149, 155, 161, 165, 166, 170, 171, 177, 178, 183, 192, 197, 198, 200, 204] p = open("main/amy/pcm.h", "w") - p.write("// Automatically generated by alles.generate_pcm_header()\n") + p.write("// Automatically generated by amy_headers.generate_pcm_header()\n") p.write("#ifndef __PCM_H\n#define __PCM_H\n") offsets = [] offset = 0 diff --git a/deb_menu.mid b/deb_menu.mid new file mode 100644 index 0000000000000000000000000000000000000000..b48a7a986ebaa0d22ae902bdeb69bbd016de196d GIT binary patch literal 21487 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