├── README.md ├── S01_HelloPd ├── S01_HelloPd.pde └── data │ └── test.pd ├── S02_PureDataBasics ├── Main.pd ├── MainPatch.png ├── Node.pd ├── README.md └── sound.wav ├── S03_ProcessingBasics ├── Node.pde └── S03_ProcessingBasics.pde ├── S04_SimpleUIElements ├── Button.pde ├── S04_SimpleUIElements.pde ├── Slider.pde ├── code │ └── sketch.properties └── data │ ├── Main.pd │ ├── sample1.wav │ ├── sample2.wav │ ├── sample3.wav │ └── sample4.wav ├── S05_SoundAnalysis ├── S05_SoundAnalysis.pde └── data │ └── Main.pd ├── S06_ImageSonification ├── S06_ImageSonification.pde └── data │ ├── Main.pd │ ├── Node.pd │ └── Yantra.jpg ├── S07_LiveCamSonification ├── S07_LiveCamSonification.pde └── data │ ├── Main.pd │ └── Node.pd ├── S08_DataSonification ├── S08_DataSonification.pde └── data │ ├── Main.pd │ └── sea-level.csv ├── S09_WebAPISonification ├── S09_WebAPISonification.pde └── data │ └── Main.pd ├── S10_GenerativeMusic ├── S10_GenerativeMusic.pde ├── data │ ├── Main.pd │ └── patches │ │ ├── c_adsr.pd │ │ ├── c_xfade.pd │ │ ├── e_platereverb.pd │ │ ├── m_minorscale.pd │ │ ├── s_rhodey.pd │ │ ├── u_dispatch.pd │ │ ├── u_loader.pd │ │ └── u_sssad.pd └── sketch.properties ├── S11_VisualMusic ├── Particle.pde ├── S11_VisualMusic.pde ├── data │ ├── Main.pd │ ├── patches │ │ ├── createPoly.pd │ │ ├── mycounter.pd │ │ └── playSound.pd │ └── piano.wav └── sketch.properties ├── S12_GranularField ├── S12_GranularField.pde ├── Slider.pde └── data │ ├── Main.pd │ ├── bossa.wav │ ├── patches │ ├── s_graincloud.pd │ ├── s_grainvoice.pd │ └── u_dispatch.pd │ └── tribal.wav └── S13_WebApp ├── data ├── apple-touch-icon.png ├── jquery-1.11.3.min.js ├── main.pd ├── p5.js ├── sketch.js ├── startup-image.png └── webpd-latest.min.js └── index.html /README.md: -------------------------------------------------------------------------------- 1 | # Sonic-Code-Workshops 2 | Sample code for "Sonic instruments" & "Interactive Sonification" workshops, aka tools designed with Pure Data & Processing 3 | 4 | The aim of these workshops is to introduce simple and easy learnable ways to create interactive sounds, music & sonification. The workshops are based on two popular, open source languages and the combination of these. Using these free tools it is easy to create user interactions that are targeting the web or mobile devices. 5 | 6 | For more info, visit: 7 | [Interactive Sonification](http://spektrumberlin.de/events/detail/interactive-sonification.html) & [Sonic Instruments](http://spektrumberlin.de/events/detail/sonic-instruments.html) organized by [Spektrum](http://spektrumberlin.de/home.html) (Berlin, 2018). 8 | There are also useful insights on the [workshop site](http://www.binaura.net/stc/ws/isea/) from ISEA (Vancouver) & ICAD (Graz), 2015 9 | 10 | ## What tools do we use? 11 | 12 | [Processing](https://processing.org/): Processing is a programming language, development environment, and online community. Since 2001, Processing has promoted software literacy within the visual arts and visual literacy within technology. Initially created to serve as a software sketchbook and to teach computer programming fundamentals within a visual context, Processing evolved into a development tool for professionals. Today, there are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning, prototyping, and production. 13 | 14 | [Pure Data](http://puredata.info/): Pure Data (aka Pd) is an open source visual programming language. Pd enables musicians, visual artists, performers, researchers, and developers to create software graphically, without writing lines of code. Pd is used to process and generate sound, video, 2D/3D graphics, and interface sensors, input devices, and MIDI. 15 | 16 | [LibPd](http://www.libpd.cc): LibPd takes the power of one of the world’s most powerful, most widely-used environments for making original sound and music creations, and lets you put it anywhere. It’s free, open source, and can run on a wide variety of devices from phones to computers. LibPd starts with Pd – Pure Data – a graphical development environment used widely by musicians, composers, and sound designers. In Pd, you create custom synthesizers, effects, musical patterns, and sonic and musical machines by connecting on-screen patch cords. If you already know how to make patches in Pd, you’ll find libpd immensely powerful. If you don’t, Pd is a great way to learn custom music and sound development. 17 | 18 | Then, by separating all that sonic power from concerns about hardware input and output, LibPd lets you run Pd anywhere. LibPd isn’t a fork of Pd: it is Pd, but made embeddable. If it can run native code, it can run libpd. That means you can incorporate Pd in your Python game, or your Android or iOS app, or on a Linux stompbox you built with a Beagleboard using an app you wrote in C, or Mac or Windows or Linux software, or anywhere else that can run native code. 19 | 20 | 21 | ## Installation instructions 22 | 23 | Download & install [Pure Data](http://puredata.info/downloads) and [Processing](https://processing.org/download/). Select your operating system, the java library that we use for connecting these two tools is compiled for all major platforms. Download the Processing library of [LibPd](https://github.com/libpd/puredatap5/). The pdp5 folder contains the source code and dependencies, configured for development on Mac OS. You won't need to look at this unless you want to participate in the development of this library. If you just want to use libpd with Processing, then you can unpack the file 24 | pdp5.zip into the libraries folder of Processing. On my Mac, that folder is Documents/Processing/libraries. Open any example from the source and start experimenting. The compiled library should work with Linux & Windows too. 25 | 26 | There are interesting examples at the official [LibPd site](http://www.libpd.cc) on LibPd related projects. 27 | 28 | 29 | ## Folder Structure 30 | 31 | All the examples look like this: 32 | 33 | . 34 | **sketchname.pde** our main processing sketch (same name as folder name) 35 | **... .pde** additional files, classes, functions, if we have 36 | **data** any external content we use within the sketch 37 | ----------**patchname.pd** our main pd patch 38 | ----------**images** if we have images, put them here 39 | ----------**sounds** if we have sounds, put them here 40 | ----------**...** textfiles, videos, tables, etc. 41 | **code** 42 | ----------**libraryname.jar** if we use other libs, we can put them here or in the processing folder 43 | 44 | 45 | ## Editing 46 | 47 | The main sketch can be edited with the Processing IDE that is built in the Processing download package. If you need more features than the basic editor, other options might be [Sublime Text](http://www.sublimetext.com/) that has great module based integration, or [Eclipse](https://eclipse.org/) which is a professional code editing IDE. The puredata patches can be edited with both Pd-Extended or the basic Pd distribution. The difference is, that the extended version contains lots of objects by different developers. Very useful if you dive in Pd, but no need for libPd: by default, it is built only on the vanilla objects. If you really need an external, you can build it for libPd. There are several online resources that might help you, depending on your targeted OS. 48 | 49 | ## Testing your project 50 | 51 | Open the sketch in Processing, hit run. You should hear the sounds made by Pd, and interact with the Processing interface. As of the official Processing 3 release, Android mode should work out of the box, so the following section is deprecated and to be removed soon: *To test on an Android device, first follow the steps on this [guide on the Processing + Android wiki](https://github.com/processing/processing-android/wiki). After steps are complete, switch the sketch into Android mode and run your sketch in the android simulator or an Android Device. Please note, Android versions below 2.3.3 (API 10) won't work with Processing. (Note: we won't cover Android installation steps on the workshop, since the timeframe is very tight).* 52 | 53 | If you are a web developer or mobile app maker (including iOS), there is also a very promising way to test your project in HTML5 environments (based on WebAudio API) using [WebPd](https://github.com/sebpiq/WebPd) and [P5JS](http://p5js.org/) which are javascript ports of the Pure Data and Processing tools, however these are in a very experimental state as of the time of this workshop. Example 10 is about to build your project as a web based application. Edit: 54 | 55 | ## Examples 56 | 57 | - **S01_HelloPd** : the official example that arrives with the puredataP5 repository. 58 | - **S02_PureDataBasics** : supercompressed overview of objects, workflow, time & making sounds in Pure Data 59 | - **S03_ProcessingBasics** : overview of user inputs, functions, for loop and classes in Processing 60 | - **S04_SimpleUIElements** : creating basic UI elements in processing, trigger sounds & adjust panning on the Pd side 61 | - **S05_SoundAnalysis** : getting and displaying waveform, spectrum and gain of an incoming live soundstream. This example also shows, how to read arrays from within PureData 62 | - **S06_ImageSonification** : turning static imahge colors into sounds. Pixel color values are driving corresponding oscillator's pitches 63 | - **S07_LiveCamSonification** : turning camera colors into sounds. Pixel color values are driving corresponding oscillator's pitches 64 | - **S08_DataSonification** : turning values in a CSV file into sounds. 65 | - **S09_WebAPISonification** : turning values in a JSON response into sounds. Querying the [weather API](https://api.apixu.com/) to get live weather info in cities around the globe. Needs network connection. 66 | - **S10_GenerativeMusic** : creating self-modifying melodies and rhythm patterns on the Pd side, visualize actual sonic parameters on the Processing side. This patch is using some abstractions from an excellent high-level object library for pd, named [RjLib](https://github.com/rjdj/rjlib). This set of building blocks (synths, logical mappings, instruments, effects & utilities) is one of the most important addons ever made for Pure Data. rjLib originally came alive with the rise of mobile platforms (iOS, Android) made by the RjDj crew, it is intended to make interactive music in a very unique and streamlined way. 67 | - **S11_VisualMusic** : Demonstrating how to play polyphonic sound samples of the same sound 68 | with different pitches. The behaviour of visual elements are triggering the sounds. The example is using [PolySample](https://github.com/stc/polySample) , a custom made polyphonic soundplayer with adjustable sample speed. 69 | - **S12_GrainField** : A 32 channel granular synthesis engine with custom controls. This technique is about taking apart an existing sound sample into small grains that remain individually controllable fragments. Useful for creating sound textures, sound design, rythmic patterns. 70 | - **S13_WebApp** : A modified version of the basic LibPd example. This code is entirely built on javascript using WebAudio API. The core libraries that are used: [P5JS](http://p5js.org/), aka the framework that makes possible to write processing-like code using cutting edge web technologies (canvas, sockets, webrtc, etc), [WebPd](https://github.com/sebpiq/WebPd), aka the framework that makes possible to turn your Pd patches into javascript and render audio using WebAudio API. In order to try the example, you need to start a local server to be able to open your Pd patch since it is an async request from your browser. A very simple tool for this is [Python's SimpleHTTPServer](http://www.pythonforbeginners.com/modules-in-python/how-to-use-simplehttpserver/). On OSX, open Terminal, navigate to WebApp folder and type "python -m SimpleHTTPServer 8000". You just started a local server in your folder that is hosting on port 8000. Now go to your favourite browser (that supports WebAudio) and open localhost:8000. ( Hint: If you would like to publish to iOS, you can load this content as a WebView in your project and make an application out of it. Read more on how to [turn your code into a webview app here.](http://www.android-ios-tutorials.com/ios/ios-uiwebview-example/) ). Try the online [demo here](http://www.binaura.net/stc/ws/isea/webapp/) 71 | 72 | 73 | All code is under GPLv3 License. 74 | -------------------------------------------------------------------------------- /S01_HelloPd/S01_HelloPd.pde: -------------------------------------------------------------------------------- 1 | /** 2 | * The official example from the LibPD repository. Send, receive data between PD & Processing 3 | * with the included methods. 4 | * 5 | */ 6 | 7 | /** 8 | * A sample Processing applet using libpd, illustrating all major features. 9 | * 10 | * Based on RJ Marsan's YayProcessingPD (https://github.com/rjmarsan/YayProcessingPD). 11 | * 12 | * @author Peter Brinkmann (peter.brinkmann@gmail.com) 13 | */ 14 | 15 | import org.puredata.processing.PureData; 16 | 17 | PureData pd; 18 | 19 | void setup() { 20 | pd = new PureData(this, 44100, 0, 2); 21 | pd.openPatch("test.pd"); 22 | // pd.subscribe("foo"); // Uncomment if you want to receive messages sent to the receive symbol "foo" in Pd. 23 | pd.start(); 24 | } 25 | 26 | void draw() { 27 | background(0); 28 | fill(200, 0, 0); 29 | stroke(255, 0, 0); 30 | ellipseMode(CENTER); 31 | ellipse(mouseX, mouseY, 20, 20); 32 | pd.sendFloat("pitch", (float)mouseX / (float)width); // Send float message to symbol "pitch" in Pd. 33 | pd.sendFloat("volume", (float)mouseY / (float)height); 34 | } 35 | 36 | /* 37 | // Implement methods like the following if you want to receive messages from Pd. 38 | // You'll also need to subscribe to receive symbols you're interested if you want 39 | // to receive messages. 40 | // 41 | // Note that invocations of these methods will occur before the draw method, and 42 | // so you can't use any graphics commands in here. 43 | 44 | void pdPrint(String s) { 45 | // Handle string s, printed by Pd 46 | } 47 | 48 | void receiveBang(String source) { 49 | // Handle bang sent to symbol source in Pd 50 | } 51 | 52 | void receiveFloat(String source, float x) { 53 | // Handle float x sent to symbol source in Pd 54 | } 55 | 56 | void receiveSymbol(String source, String sym) { 57 | // Handle symbol sym sent to symbol source in Pd 58 | } 59 | */ 60 | -------------------------------------------------------------------------------- /S01_HelloPd/data/test.pd: -------------------------------------------------------------------------------- 1 | #N canvas 689 132 480 414 10; 2 | #X obj 187 182 osc~; 3 | #X obj 162 159 mtof; 4 | #X obj 186 285 dac~; 5 | #X obj 203 232 *~ 0; 6 | #X obj 109 90 r pitch; 7 | #X obj 309 87 r volume; 8 | #X text 248 58 And this inlet controls volume; 9 | #X text 101 319 Audio finally comes out here and is played out your 10 | phones speakers; 11 | #X text 45 70 This inlet controls the pitch; 12 | #X obj 125 115 * 50; 13 | #X obj 139 136 + 40; 14 | #X obj 344 140 loadbang; 15 | #X obj 344 232 print; 16 | #X obj 344 209 realtime; 17 | #X obj 344 162 metro 1000; 18 | #X obj 344 185 t b b; 19 | #X connect 0 0 3 0; 20 | #X connect 1 0 0 0; 21 | #X connect 3 0 2 0; 22 | #X connect 3 0 2 1; 23 | #X connect 4 0 9 0; 24 | #X connect 5 0 3 1; 25 | #X connect 9 0 10 0; 26 | #X connect 10 0 1 0; 27 | #X connect 11 0 14 0; 28 | #X connect 13 0 12 0; 29 | #X connect 14 0 15 0; 30 | #X connect 15 0 13 0; 31 | #X connect 15 1 13 1; 32 | -------------------------------------------------------------------------------- /S02_PureDataBasics/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 88 114 1366 882 10; 2 | #X obj 29 216 print; 3 | #X obj 29 163 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 4 | -1; 5 | #X text 52 162 bang; 6 | #X msg 87 163 message; 7 | #X floatatom 153 164 5 0 0 0 - - -, f 5; 8 | #X text 196 165 numbers; 9 | #N canvas 0 22 450 278 (subpatch) 0; 10 | #X array array 100 float 3; 11 | #A 0 58.5 58.5 58.5 58.5 58.5 58.5 58.5 58.5 58.5 58.625 58.75 58.875 12 | 59 59.125 59.25 59.375 59.5 59.625 59.75 59.8636 59.9773 60.0909 60.2045 13 | 60.3182 60.4318 60.5455 60.6591 60.7727 60.8864 61 61.125 61.25 61.375 14 | 61.5 61.625 61.75 61.875 62 62.125 62.25 61 59.125 57.25 56 54.75 52.25 15 | 49.75 47.25 44.75 41.8333 38.9167 36 34.75 33.5 32.25 31 29.75 28.5 16 | 26.9375 25.375 23.8125 22.25 21 19.75 18.5 17.875 17.25 16 23.5 22.25 17 | 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 18 | 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 63.5 19 | 62.25 62.25; 20 | #X coords 0 0 99 100 100 80 1 0 0; 21 | #X restore 294 164 graph; 22 | #X obj 407 200 tabread array; 23 | #X obj 407 225 print; 24 | #X floatatom 407 176 5 0 0 0 - - -, f 5; 25 | #X obj 602 229 tabwrite array; 26 | #X obj 601 174 random 100; 27 | #X obj 600 151 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 28 | -1 -1; 29 | #X text 406 147 read values from array; 30 | #X text 631 147 write values to array; 31 | #X text 789 195 <- data conversion & ordering (right - to - left); 32 | #X obj 601 198 trigger float float; 33 | #X text 725 198 =; 34 | #X obj 739 197 t f f; 35 | #X text 25 70 Sonic Instruments Workshop / 2015; 36 | #X obj 7 45 cnv 15 100 20 empty empty Pd-Basics 20 12 1 24 -262144 37 | -66577 0; 38 | #N canvas 481 488 577 416 subpatch 0; 39 | #X text 121 83 I'm a subpatch. It's hard to make me modular. Use me 40 | only for quick hacks and experiments or if you know you don't want 41 | to reuse my subroutines...; 42 | #X obj 122 147 inlet; 43 | #X obj 121 225 outlet; 44 | #X text 179 147 send me data from outside; 45 | #X text 179 223 pass over data to outside; 46 | #X text 91 182 ... do some nice things here; 47 | #X restore 31 346 pd subpatch; 48 | #X text 29 318 Subpatches; 49 | #X text 193 316 Abstractions; 50 | #X obj 193 346 Node; 51 | #X text 509 319 Transferring data; 52 | #X text 511 347 connect \, or; 53 | #X obj 589 348 send address; 54 | #X obj 676 348 receive address; 55 | #X text 588 372 (address is the name to send/receive between); 56 | #X obj 891 347 value my_variable; 57 | #X obj 1004 347 value my_variable; 58 | #X msg 891 322 42; 59 | #X obj 1004 371 print; 60 | #X obj 1004 323 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 61 | -1 -1; 62 | #X text 1122 347 shared variables; 63 | #X text 72 217 object (processing messages); 64 | #X obj 29 482 metro 1000; 65 | #X floatatom 29 551 5 0 0 0 - - -, f 5; 66 | #X obj 29 455 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 67 | 1; 68 | #X obj 30 428 loadbang; 69 | #X obj 120 564 timer; 70 | #X floatatom 120 593 5 0 0 0 - - -, f 5; 71 | #X obj 118 514 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 72 | -1 -1; 73 | #X obj 118 540 t b b; 74 | #X text 117 480 <- repeating events; 75 | #X text 165 564 <- measuring time between events; 76 | #X obj 409 508 delay 300; 77 | #X obj 487 508 delay 600; 78 | #X obj 409 479 t b b; 79 | #X obj 409 539 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 80 | -1 -1; 81 | #X obj 488 539 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 82 | -1 -1; 83 | #X text 561 505 <- delaying events; 84 | #X obj 5 121 cnv 15 100 20 empty empty Elements-Datatypes 20 12 1 24 85 | -262144 -66577 0; 86 | #X obj 5 273 cnv 15 100 20 empty empty Topology-Dataflow-Patching 20 87 | 12 1 24 -262144 -66577 0; 88 | #X obj 4 386 cnv 15 100 20 empty empty Time 20 12 1 24 -262144 -66577 89 | 0; 90 | #X text 22 88 (c) stc@binaura.net; 91 | #X obj 5 628 cnv 15 100 20 empty empty Sounds 20 12 1 24 -262144 -66577 92 | 0; 93 | #X obj 28 787 dac~; 94 | #X obj 29 739 *~; 95 | #X obj 80 709 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 96 | 1; 97 | #X obj 29 674 noise~; 98 | #X text 79 675 white noise; 99 | #X text 79 735 amplify; 100 | #X text 78 785 left/right speakers; 101 | #X obj 245 785 dac~; 102 | #X obj 246 734 *~; 103 | #X obj 278 704 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 104 | 1; 105 | #X obj 246 672 osc~ 1200; 106 | #X obj 312 672 osc~ 60; 107 | #X obj 246 702 *~; 108 | #X text 314 704 modulate sines; 109 | #X obj 896 65 loadbang; 110 | #X msg 896 91 \; pd dsp 1 \;; 111 | #X text 958 64 message to start dsp; 112 | #X obj 457 786 dac~; 113 | #X obj 457 733 readsf~; 114 | #X text 457 672 play a sound; 115 | #X obj 682 679 phasor~ 1; 116 | #X obj 682 745 tabread~ array; 117 | #X text 682 649 sound as controller (precise \, 44100 / s); 118 | #X obj 682 706 *~ 99; 119 | #X obj 680 798 dac~; 120 | #X obj 682 776 *~; 121 | #X obj 716 769 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 122 | 1; 123 | #X text 760 677 <- saw wave at 1Hz; 124 | #X text 760 703 <- we have 100 elements in our array; 125 | #X text 779 743 <- read values at the indexes; 126 | #X text 778 721 (notice: we are multiplying audio this time); 127 | #X text 308 316 Abstractions with parameters; 128 | #X obj 308 346 Node myParameter 1 2; 129 | #X msg 457 705 open sound.wav \, start; 130 | #N canvas 0 22 450 300 mCounter 1; 131 | #X obj 209 49 inlet; 132 | #X obj 207 240 outlet; 133 | #X obj 208 144 f; 134 | #X obj 245 144 + 1; 135 | #X connect 0 0 2 0; 136 | #X connect 2 0 3 0; 137 | #X connect 2 0 1 0; 138 | #X connect 3 0 2 1; 139 | #X restore 29 513 pd mCounter; 140 | #X connect 1 0 0 0; 141 | #X connect 3 0 0 0; 142 | #X connect 4 0 0 0; 143 | #X connect 7 0 8 0; 144 | #X connect 9 0 7 0; 145 | #X connect 11 0 16 0; 146 | #X connect 12 0 11 0; 147 | #X connect 16 0 10 0; 148 | #X connect 16 1 10 1; 149 | #X connect 31 0 33 0; 150 | #X connect 32 0 30 0; 151 | #X connect 34 0 31 0; 152 | #X connect 37 0 43 0; 153 | #X connect 37 0 92 0; 154 | #X connect 39 0 37 0; 155 | #X connect 40 0 39 0; 156 | #X connect 41 0 42 0; 157 | #X connect 43 0 44 0; 158 | #X connect 43 0 49 0; 159 | #X connect 44 0 41 0; 160 | #X connect 44 1 41 1; 161 | #X connect 47 0 50 0; 162 | #X connect 48 0 51 0; 163 | #X connect 49 0 47 0; 164 | #X connect 49 1 48 0; 165 | #X connect 59 0 58 0; 166 | #X connect 59 0 58 1; 167 | #X connect 60 0 59 1; 168 | #X connect 61 0 59 0; 169 | #X connect 66 0 65 0; 170 | #X connect 66 0 65 1; 171 | #X connect 67 0 66 1; 172 | #X connect 68 0 70 0; 173 | #X connect 69 0 70 1; 174 | #X connect 70 0 66 0; 175 | #X connect 72 0 73 0; 176 | #X connect 76 0 75 0; 177 | #X connect 76 0 75 1; 178 | #X connect 78 0 81 0; 179 | #X connect 79 0 83 0; 180 | #X connect 81 0 79 0; 181 | #X connect 83 0 82 0; 182 | #X connect 83 0 82 1; 183 | #X connect 84 0 83 1; 184 | #X connect 91 0 76 0; 185 | #X connect 92 0 38 0; 186 | -------------------------------------------------------------------------------- /S02_PureDataBasics/MainPatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S02_PureDataBasics/MainPatch.png -------------------------------------------------------------------------------- /S02_PureDataBasics/Node.pd: -------------------------------------------------------------------------------- 1 | #N canvas 335 227 1143 623 10; 2 | #X text 69 89 I'm an abstraction \, in a separate file. Use me if you 3 | want to make modular code and would like to avoid repetitive patching. 4 | ; 5 | #X obj 71 157 inlet; 6 | #X obj 70 335 outlet; 7 | #X obj 211 522 print; 8 | #X obj 209 267 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 9 | -1 -1; 10 | #X obj 209 334 float \$0; 11 | #X text 242 265 click to print unique ID of this abstraction; 12 | #X text 204 200 VARIABLES; 13 | #X obj 283 418 send \$0-myLocalVar; 14 | #X obj 284 445 receive \$0-myLocalVar; 15 | #X text 281 392 you can send \, receive between local addresses using: 16 | ; 17 | #X text 282 327 float stores a number. \$0 is a special syntax \, for 18 | unique patch id-s. really useful for dynamic patching and local-only 19 | variables. these are visible in the scope of this window (including 20 | its subpatches); 21 | #X obj 698 367 symbol \$1; 22 | #X text 692 195 ACESSING PARAMETERS (ARGUMENTS); 23 | #X obj 775 365 f \$2; 24 | #X obj 825 367 f \$3; 25 | #X obj 704 515 print; 26 | #X obj 696 324 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 27 | -1 -1; 28 | #X obj 773 322 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 29 | -1 -1; 30 | #X obj 825 322 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 31 | -1 -1; 32 | #X text 687 256 access each parameter that is defined in the object 33 | box. order & data type matters; 34 | #X connect 4 0 5 0; 35 | #X connect 5 0 3 0; 36 | #X connect 12 0 16 0; 37 | #X connect 14 0 16 0; 38 | #X connect 15 0 16 0; 39 | #X connect 17 0 12 0; 40 | #X connect 18 0 14 0; 41 | #X connect 19 0 15 0; 42 | -------------------------------------------------------------------------------- /S02_PureDataBasics/README.md: -------------------------------------------------------------------------------- 1 | ## Basic patch demonstrating the workflow: 2 | 3 | - elements, different datatypes 4 | - topology of (modular) patching 5 | - time 6 | - basic sound creation 7 | 8 | Open with [PureData Extended](https://puredata.info/downloads/pd-extended). 9 | 10 | ![alt text][patch] 11 | 12 | [patch]: https://github.com/stc/Sonic-Instruments-Workshop/blob/master/S02_PureDataBasics/MainPatch.png "Main patch" -------------------------------------------------------------------------------- /S02_PureDataBasics/sound.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S02_PureDataBasics/sound.wav -------------------------------------------------------------------------------- /S03_ProcessingBasics/Node.pde: -------------------------------------------------------------------------------- 1 | // a class, named "Node" 2 | class Node { 3 | // a variable to store a colour 4 | color myColor; 5 | 6 | // constructor 7 | Node( color c ){ 8 | // pass the variable we received upon creating this class, from outside 9 | myColor = c; 10 | } 11 | // a function we can call from outside 12 | void showCircle( int xpos, int ypos, int xsize, int ysize ){ 13 | noStroke(); 14 | fill( myColor ); 15 | ellipse( xpos, ypos, xsize, ysize ); 16 | fill(255); 17 | textAlign(CENTER); 18 | text("i am at " + xpos + " " + ypos, xpos, ypos ); 19 | textAlign(LEFT); 20 | 21 | // we call another function that belong to this class 22 | changeColor(); 23 | } 24 | 25 | // a function, that changes the colour based on the x value of the mouse 26 | void changeColor() { 27 | myColor = color( 200, map( mouseX, 0, width, 0, 255 ), 55 ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /S03_ProcessingBasics/S03_ProcessingBasics.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Processing basics: introducing input events, functions, for loop, classes 4 | 5 | */ 6 | 7 | 8 | //--------------------------------------------- Define variables, classes here --------------------------------------------- 9 | 10 | // this is a class, in a separate file (type first, then name) 11 | Node node; 12 | 13 | // a string variable to display different information later (type first, then name) 14 | String textToDisplay; 15 | 16 | //--------------------------------------------- This runs once when we start the app ----------------------------------------- 17 | 18 | void setup() { 19 | // using window size of 800 x 600 px, with 3D renderer 20 | size( 800, 600, P3D ); 21 | 22 | // initialize our info text like this: 23 | textToDisplay = "click somewhere or push something"; 24 | 25 | // make one or more instances from our class like this: 26 | // the constructor of Node class receives a colour parameter, we have to pass when creating it 27 | node = new Node( color( 200,100,55 ) ); 28 | } 29 | 30 | //--------------------------------------------- This is repeated until we quit ----------------------------------------------- 31 | 32 | void draw() { 33 | // refresh the background with rgb colour 34 | background( 255 ); 35 | 36 | // display our custom class which is named node (notice, in the Node.pde file, we have a function, called "showCircle" 37 | // we are calling that method from outside now. 38 | node.showCircle( mouseX, mouseY, 140, 140 ); 39 | 40 | // let's draw one hundred individual rectangles to the bottom of the screen 41 | // we can make it, usin a "for" loop 42 | for( int i = 0; i < 100; i++ ) { 43 | // each rectangle's colour will depend on its position in the loop. first is black, last is transparent 44 | fill( 0, map( i, 0, 100, 255, 0 ) ); 45 | // first parameter: x position, second parameter: y position. third, fourth: width, height of rectangle 46 | rect( i * (width / 100), height - 20, 2, 20 ); 47 | } 48 | 49 | // display info text at x:30 y: 30 pixels 50 | fill(0); 51 | text( textToDisplay, 30, 30 ); 52 | } 53 | 54 | //-------------------------------------------------------- User Interactions --------------------------------------------------- 55 | 56 | void mousePressed() { 57 | textToDisplay = "you pressed the mouse at " + mouseX + ", " + mouseY; 58 | } 59 | 60 | void mouseDragged() { 61 | textToDisplay = "you are dragging the mouse at " + mouseX + ", " + mouseY; 62 | } 63 | 64 | void mouseReleased() { 65 | textToDisplay = "you released the mouse at " + mouseX + ", " + mouseY; 66 | } 67 | 68 | void keyPressed() { 69 | textToDisplay = "you pressed key " + key; 70 | } 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /S04_SimpleUIElements/Button.pde: -------------------------------------------------------------------------------- 1 | // a simple button class, modified 2 | // from Processing's built-in examples 3 | 4 | class Button { 5 | int x, y; 6 | int size; 7 | color basecolor, highlightcolor; 8 | color currentcolor; 9 | boolean over = false; 10 | boolean pressed = false; 11 | int w, h; 12 | int id; 13 | 14 | Button( int ix, int iy, int isize, color icolor, color ihighlight, int iid ) { 15 | x = ix; 16 | y = iy; 17 | w = isize; 18 | h = isize; 19 | size = isize; 20 | id = iid; 21 | basecolor = icolor; 22 | highlightcolor = ihighlight; 23 | currentcolor = basecolor; 24 | } 25 | 26 | void update() { 27 | 28 | if( over() ) { 29 | currentcolor = highlightcolor; 30 | } 31 | else { 32 | currentcolor = basecolor; 33 | } 34 | } 35 | 36 | int pressed() { 37 | if( over() ) { 38 | locked = true; 39 | return id; 40 | } 41 | else { 42 | locked = false; 43 | return -1; 44 | } 45 | } 46 | 47 | boolean over() { 48 | if ( mouseX >= x && mouseX <= x+w && mouseY >= y && mouseY <= y+h ) { 49 | return true; 50 | } 51 | else { 52 | return false; 53 | } 54 | } 55 | 56 | void display() { 57 | stroke(255); 58 | fill(currentcolor); 59 | rect(x, y, size, size); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /S04_SimpleUIElements/S04_SimpleUIElements.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Building simple UI elements: buttons & sliders 4 | 5 | */ 6 | 7 | // import PureData 8 | import org.puredata.processing.PureData; 9 | PureData pd; 10 | 11 | // create a slider 12 | Slider slider; 13 | 14 | // create some buttons, we are using an arraylist, to store several objects 15 | // in one dynamic container 16 | ArrayList< Button > buttons = new ArrayList< Button >(); 17 | // check if any button is pressed already 18 | boolean locked = false; 19 | 20 | //-------------------------------------------------------------------------------------------------- 21 | 22 | void setup() { 23 | size( 800, 600, P3D ); 24 | 25 | // start Pd 26 | pd = new PureData(this, 44100, 0, 2); 27 | // android file search path (data must be copied to sd card). more on this later 28 | //pd.openPatch("//sdcard//WS/Main.pd"); 29 | pd.openPatch("Main.pd"); 30 | pd.start(); 31 | 32 | // setup the slider (see Slider.pde for contructor parameters) 33 | slider = new Slider( width / 4, height - 100, width / 2, 30, 2 ); 34 | 35 | // define colors for buttons 36 | color highlightcolor = color( 255, 100, 100 ); 37 | color basecolor = color( 100, 100, 100 ); 38 | 39 | // setup the buttons (see Button.pde for constructor parameters) 40 | buttons.add( new Button( width / 4, 20, 190, basecolor, highlightcolor, 1 ) ); 41 | buttons.add( new Button( width / 2, 20, 190, basecolor, highlightcolor, 2 ) ); 42 | buttons.add( new Button( width / 4, 220, 190, basecolor, highlightcolor, 3 ) ); 43 | buttons.add( new Button( width / 2, 220, 190, basecolor, highlightcolor, 4 ) ); 44 | } 45 | 46 | //--------------------------------------------------------------------------------------------------- 47 | 48 | void draw() { 49 | background( 255 ); 50 | 51 | // calling update and display functions of slider 52 | slider.update(); 53 | slider.display(); 54 | 55 | // if no button pressed, iterate over all buttons using a for loop and update them 56 | if(locked == false) { 57 | for( Button b : buttons ) { 58 | b.update(); 59 | } 60 | }else{ 61 | locked = false; 62 | } 63 | 64 | // iterate over the buttons and display them 65 | for( Button b : buttons ) { 66 | b.display(); 67 | } 68 | 69 | // display slider value 70 | fill(0); 71 | text( slider.getPos(), width - width / 4, height - 100 ); 72 | 73 | // send slider value to Pd, controlling the left / right panning 74 | // of outgoing audio 75 | pd.sendFloat( "panning",slider.getPos() ); 76 | } 77 | 78 | //---------------------------------------------------------------------------------------------------- 79 | 80 | void mousePressed(){ 81 | 82 | // iterate over buttons, and check which one has been pressed 83 | // send corresponding message to Pd upon each buttonpress 84 | 85 | for( Button b : buttons ) { 86 | if( b.pressed() == 1 ) { 87 | pd.sendBang( "sample1" ); 88 | println( "Sample 1 sent to Pd" ); 89 | }else if( b.pressed() == 2 ) { 90 | pd.sendBang( "sample2" ); 91 | println( "Sample 2 sent to Pd" ); 92 | } 93 | else if( b.pressed() == 3 ) { 94 | pd.sendBang( "sample3" ); 95 | println( "Sample 3 sent to Pd" ); 96 | } 97 | else if( b.pressed() == 4 ) { 98 | pd.sendBang( "sample4" ); 99 | println( "Sample 4 sent to Pd" ); 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /S04_SimpleUIElements/Slider.pde: -------------------------------------------------------------------------------- 1 | // a simple slider class, modified 2 | // from Processing's built-in examples 3 | 4 | class Slider { 5 | int swidth, sheight; // width and height of bar 6 | float xpos, ypos; // x and y position of bar 7 | float spos, newspos; // x position of slider 8 | float sposMin, sposMax; // max and min values of slider 9 | int loose; // how loose/heavy 10 | boolean over; // is the mouse over the slider? 11 | boolean locked; 12 | float ratio; 13 | 14 | Slider (float xp, float yp, int sw, int sh, int l) { 15 | swidth = sw; 16 | sheight = sh; 17 | int widthtoheight = sw - sh; 18 | ratio = (float)sw / (float)widthtoheight; 19 | xpos = xp; 20 | ypos = yp-sheight/2; 21 | spos = xpos + swidth/2 - sheight/2; 22 | newspos = spos; 23 | sposMin = xpos; 24 | sposMax = xpos + swidth - sheight; 25 | loose = l; 26 | } 27 | 28 | void update() { 29 | if (overEvent()) { 30 | over = true; 31 | } else { 32 | over = false; 33 | } 34 | if (mousePressed && over) { 35 | locked = true; 36 | } 37 | if (!mousePressed) { 38 | locked = false; 39 | } 40 | if (locked) { 41 | newspos = constrain(mouseX-sheight/2, sposMin, sposMax); 42 | } 43 | if (abs(newspos - spos) > 1) { 44 | spos = spos + (newspos-spos)/loose; 45 | } 46 | } 47 | 48 | float constrain(float val, float minv, float maxv) { 49 | return min(max(val, minv), maxv); 50 | } 51 | 52 | boolean overEvent() { 53 | if (mouseX > xpos && mouseX < xpos+swidth && 54 | mouseY > ypos && mouseY < ypos+sheight) { 55 | return true; 56 | } else { 57 | return false; 58 | } 59 | } 60 | 61 | void display() { 62 | noStroke(); 63 | fill(204); 64 | rect(xpos, ypos, swidth, sheight); 65 | if (over || locked) { 66 | fill(0, 0, 0); 67 | } else { 68 | fill(102, 102, 102); 69 | } 70 | rect(spos, ypos, sheight, sheight); 71 | } 72 | 73 | float getPos() { 74 | float result = floor(( (spos * ratio - sheight / 2) - xpos ) / swidth * 100) * 0.01; 75 | 76 | return result; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /S04_SimpleUIElements/code/sketch.properties: -------------------------------------------------------------------------------- 1 | mode.id=processing.mode.android.AndroidMode 2 | mode=Android 3 | -------------------------------------------------------------------------------- /S04_SimpleUIElements/data/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 414 119 991 756 10; 2 | #X obj 113 91 r sample1; 3 | #X obj 385 483 dac~; 4 | #X msg 114 161 open sample1.wav \, start; 5 | #X obj 114 187 readsf~; 6 | #X floatatom 795 318 5 0 0 0 - - -; 7 | #X text 112 54 Messages are triggering the samples; 8 | #X obj 268 186 readsf~; 9 | #X obj 425 186 readsf~; 10 | #X obj 584 187 readsf~; 11 | #X text 435 483 send to the speakers; 12 | #X obj 267 90 r sample2; 13 | #X obj 424 90 r sample3; 14 | #X obj 583 91 r sample4; 15 | #X msg 584 161 open sample4.wav \, start; 16 | #X msg 425 160 open sample3.wav \, start; 17 | #X msg 268 160 open sample2.wav \, start; 18 | #N canvas 550 284 874 556 panning 0; 19 | #X obj 194 270 sig~; 20 | #X obj 547 295 *~; 21 | #X obj 166 303 *~; 22 | #X obj 203 239 -; 23 | #X msg 206 208 1 \$1; 24 | #X obj 656 196 sig~; 25 | #X obj 152 129 inlet~; 26 | #X obj 507 121 inlet~; 27 | #X obj 708 118 inlet; 28 | #X obj 203 384 outlet~; 29 | #X obj 548 371 outlet~; 30 | #X text 241 58 make a simple panning on the left / right audiochannel 31 | ; 32 | #X connect 0 0 2 1; 33 | #X connect 1 0 10 0; 34 | #X connect 2 0 9 0; 35 | #X connect 3 0 0 0; 36 | #X connect 4 0 3 0; 37 | #X connect 5 0 1 1; 38 | #X connect 6 0 2 0; 39 | #X connect 7 0 1 0; 40 | #X connect 8 0 4 0; 41 | #X connect 8 0 5 0; 42 | #X restore 371 395 pd panning; 43 | #X text 706 54 This inlet controls panning left to right; 44 | #X obj 795 88 r panning; 45 | #X connect 0 0 2 0; 46 | #X connect 2 0 3 0; 47 | #X connect 3 0 16 0; 48 | #X connect 3 0 16 1; 49 | #X connect 4 0 16 2; 50 | #X connect 6 0 16 0; 51 | #X connect 6 0 16 1; 52 | #X connect 7 0 16 0; 53 | #X connect 7 0 16 1; 54 | #X connect 8 0 16 0; 55 | #X connect 8 0 16 1; 56 | #X connect 10 0 15 0; 57 | #X connect 11 0 14 0; 58 | #X connect 12 0 13 0; 59 | #X connect 13 0 8 0; 60 | #X connect 14 0 7 0; 61 | #X connect 15 0 6 0; 62 | #X connect 16 0 1 0; 63 | #X connect 16 1 1 1; 64 | #X connect 18 0 4 0; 65 | -------------------------------------------------------------------------------- /S04_SimpleUIElements/data/sample1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S04_SimpleUIElements/data/sample1.wav -------------------------------------------------------------------------------- /S04_SimpleUIElements/data/sample2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S04_SimpleUIElements/data/sample2.wav -------------------------------------------------------------------------------- /S04_SimpleUIElements/data/sample3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S04_SimpleUIElements/data/sample3.wav -------------------------------------------------------------------------------- /S04_SimpleUIElements/data/sample4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S04_SimpleUIElements/data/sample4.wav -------------------------------------------------------------------------------- /S05_SoundAnalysis/S05_SoundAnalysis.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Sound Analysis: soundwave, spectrum, loudness 4 | 5 | */ 6 | 7 | // import PureData 8 | import org.puredata.processing.PureData; 9 | PureData pd; 10 | 11 | // Default blocksize in pd 12 | int pdBlockSize = 64; 13 | 14 | // Number of fft bins in pd 15 | int spectrumSize = 256; 16 | 17 | // Array to store & display sound waves 18 | float[] soundWave = new float[pdBlockSize]; 19 | 20 | // Array to store & display spectrum 21 | float[] spectrum = new float[spectrumSize]; 22 | 23 | // Loudest value of the spectrum (aka gain) 24 | float loudest = 0; 25 | 26 | // A PGraphics object to display Spectrogram 27 | PGraphics sg; 28 | 29 | void setup() { 30 | size( 800, 600, P3D ); 31 | pd = new PureData(this, 44100, 2, 2); 32 | pd.openPatch("Main.pd"); 33 | pd.start(); 34 | pd.sendBang("init"); 35 | 36 | // create surface for the spectrogram, height is the bin number 37 | sg = createGraphics(width, 256); 38 | } 39 | 40 | void draw() { 41 | background(0); 42 | 43 | // display the waveform by reading 'pd_soundwave' array from puredata 44 | stroke(255); 45 | pd.readArray(soundWave, 0, "pd_soundwave", 0, pdBlockSize); 46 | for (int i =0; i< pdBlockSize-1; i++) { 47 | line ( map( i, 0, pdBlockSize, 0, width ) , soundWave[i] * 100 + height / 2, map( i + 1 , 0, pdBlockSize, 0, width ), soundWave[i+1] * 100 + height / 2 ); 48 | } 49 | 50 | // display the spectrum by reading 'spectrum' array from puredata 51 | pd.readArray(spectrum, 0, "logFFT", 0, spectrumSize); 52 | stroke(255); 53 | for (int i =0; i< spectrumSize-1; i++) { 54 | line ( map( i, 0, spectrumSize, 0, width ) , -spectrum[i] + height, map( i + 1 , 0, spectrumSize, 0, width ), -spectrum[i+1] + height ); 55 | } 56 | 57 | // compare & get maximum value from spectrum array, then draw a line at the index of this value 58 | int maxIndex = 0; 59 | for (int i = 1; i < spectrum.length; i++){ 60 | int tmp = (int)spectrum[i]; 61 | if ((tmp > spectrum[maxIndex])){ 62 | maxIndex = i; 63 | } 64 | } 65 | stroke(200, 0, 200); 66 | line( map( maxIndex, 0, spectrumSize, 0, width ), 0, map( maxIndex, 0, spectrumSize, 0, width ), height ); 67 | 68 | // display loudest value of the spectrum 69 | loudest = spectrum[maxIndex]; 70 | fill(255); 71 | noStroke(); 72 | text( "GAIN: " + loudest, 20, 20 ); 73 | rect( 20, 25, 30, loudest / 5 ); 74 | 75 | // display spectogram, draw everything into the sg PGraphics object 76 | sg.beginDraw(); 77 | for (int i =0; i< spectrumSize-1; i++) { 78 | sg.stroke(spectrum[i]*10); 79 | sg.point(frameCount%width,256-i); 80 | } 81 | sg.endDraw(); 82 | image(sg,0,0); 83 | } 84 | 85 | void pdPrint(String s) { 86 | println( s ); 87 | } -------------------------------------------------------------------------------- /S05_SoundAnalysis/data/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 398 95 723 811 10; 2 | #X obj 100 67 adc~; 3 | #X obj 100 115 +~; 4 | #X obj 100 144 /~ 2; 5 | #N canvas 0 22 450 278 (subpatch) 0; 6 | #X array pd_soundwave 64 float 3; 7 | #A 0 0.00104669 0.0013548 0.000392761 0.000307294 -0.00205967 -0.00223695 8 | 0.00226304 0.00370966 3.6787e-05 -0.00207505 -0.00115219 -8.45173e-05 9 | 5.8226e-05 -0.0015135 -0.00135939 0.00128656 -0.000467494 -0.00228773 10 | 0.000983342 0.000929434 -1.82112e-05 0.00248903 0.00108217 -0.00154616 11 | -0.000977606 0.000478811 0.00203826 0.000720565 0.000207733 0.00327907 12 | 0.00288118 0.000206128 -0.00240641 -0.00366556 0.00176172 0.00490353 13 | -0.000805957 -0.00318212 0.00246113 0.0048145 -0.000483201 -0.000816112 14 | 0.00225263 -0.00181101 -0.00072748 0.0040787 0.00145733 0.000809872 15 | -0.00111572 -0.00517088 -0.00191768 1.38099e-05 -0.000219698 0.00143695 16 | 0.00185688 0.00349036 0.00258165 -0.00121397 -0.00201392 -0.000457893 17 | 0.00130301 -0.000324557 -0.00214399 -0.00170147; 18 | #X coords 0 1 63 -1 200 140 1; 19 | #X restore 482 81 graph; 20 | #X obj 152 203 tabwrite~ pd_soundwave; 21 | #X obj 375 151 metro 20; 22 | #X obj 375 130 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 23 | 1; 24 | #X msg 375 107 1; 25 | #X obj 374 45 r init; 26 | #N canvas 251 23 1570 828 fft 1; 27 | #X obj 56 227 line 0 0.1; 28 | #X obj 56 272 / 2; 29 | #X obj 56 292 mtof; 30 | #X msg 56 206 6 \, 273 26.7; 31 | #X obj 56 250 t f f; 32 | #X obj 91 271 - 6; 33 | #X obj 56 312 / 44100; 34 | #X obj 56 168 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 35 | ; 36 | #X obj 55 66 loadbang; 37 | #X msg 56 148 1; 38 | #X text 145 210 transformation to log scale; 39 | #N canvas 0 22 671 536 (subpatch) 0; 40 | #X array logFFT 256 float 0; 41 | #X coords 0 200 255 0 400 150 1 0 0; 42 | #X restore 55 477 graph; 43 | #X obj 56 333 * 4096; 44 | #X obj 56 186 metro 20; 45 | #X obj 56 392 moses 0; 46 | #X obj 521 65 inlet~; 47 | #X text 581 65 <- sound to be analyzed; 48 | #X text 53 627 20 Hz; 49 | #X text 414 627 22 kHz; 50 | #X text 145 227 (based on T. Brinkmann's code); 51 | #X text 912 357 Linear Graph; 52 | #X text 51 668 Logarithmic Graph; 53 | #X obj 56 424 tabwrite logFFT; 54 | #X obj 56 361 tabread4 spectrum; 55 | #X text 150 393 (avoid negative values); 56 | #X text 149 184 refresh rate; 57 | #N canvas 107 22 688 468 spectrum 0; 58 | #X obj 499 274 rfft~; 59 | #N canvas 51 367 1153 478 (subpatch) 0; 60 | #X array spectrum 256 float 0; 61 | #X coords 0 256 255 0 400 150 1 0 0; 62 | #X restore 60 134 graph; 63 | #X obj 499 301 *~; 64 | #X obj 526 301 *~; 65 | #X obj 499 352 biquad~ 0 0 0 0 1; 66 | #X obj 499 330 q8_sqrt~; 67 | #X text 58 283 20Hz; 68 | #X obj 499 103 inlet~; 69 | #X text 426 284 22KHz; 70 | #X text 76 52 85.6 element / sec @ 44.1 khz; 71 | #X obj 544 373 bang~; 72 | #X obj 78 27 block~ 512 4 1; 73 | #X obj 499 396 tabwrite~ spectrum; 74 | #X connect 0 0 2 0; 75 | #X connect 0 0 2 1; 76 | #X connect 0 1 3 0; 77 | #X connect 0 1 3 1; 78 | #X connect 2 0 5 0; 79 | #X connect 3 0 5 0; 80 | #X connect 4 0 12 0; 81 | #X connect 5 0 4 0; 82 | #X connect 7 0 0 0; 83 | #X connect 10 0 12 0; 84 | #X coords 0 -1 1 1 420 200 1 50 100; 85 | #X restore 912 143 pd spectrum; 86 | #X obj 56 91 t b b; 87 | #X msg 152 115 \; pd dsp 1; 88 | #X connect 0 0 4 0; 89 | #X connect 1 0 2 0; 90 | #X connect 2 0 6 0; 91 | #X connect 3 0 0 0; 92 | #X connect 4 0 1 0; 93 | #X connect 4 1 5 0; 94 | #X connect 5 0 22 1; 95 | #X connect 6 0 12 0; 96 | #X connect 7 0 13 0; 97 | #X connect 8 0 27 0; 98 | #X connect 9 0 7 0; 99 | #X connect 12 0 23 0; 100 | #X connect 13 0 3 0; 101 | #X connect 14 1 22 0; 102 | #X connect 15 0 26 0; 103 | #X connect 23 0 14 0; 104 | #X connect 27 0 9 0; 105 | #X connect 27 1 28 0; 106 | #X coords 0 0 1 1 410 200 1 50 450; 107 | #X restore 100 397 pd fft; 108 | #X text 152 231 Sending sound signal to pd_soundwave continuously; 109 | #X text 147 127 make incoming sound stereo; 110 | #X text 130 369 a logarithmic FFT analysis \, look inside for more 111 | ; 112 | #X connect 0 0 1 0; 113 | #X connect 0 1 1 1; 114 | #X connect 1 0 2 0; 115 | #X connect 2 0 4 0; 116 | #X connect 2 0 9 0; 117 | #X connect 5 0 4 0; 118 | #X connect 6 0 5 0; 119 | #X connect 7 0 6 0; 120 | #X connect 8 0 7 0; 121 | -------------------------------------------------------------------------------- /S06_ImageSonification/S06_ImageSonification.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Static Image Sonification example 4 | 5 | */ 6 | 7 | // import PureData 8 | import org.puredata.processing.PureData; 9 | PureData pd; 10 | 11 | PImage img; 12 | 13 | // number of sounds that sonify pixels 14 | int NUMSOUNDS = 10; 15 | 16 | void setup() { 17 | size( 800, 600, P3D ); 18 | pd = new PureData(this, 44100, 2, 2); 19 | pd.openPatch("Main.pd"); 20 | pd.start(); 21 | 22 | // load an image from the data folder 23 | img = loadImage("Yantra.jpg"); 24 | } 25 | 26 | void draw() { 27 | background(0); 28 | imageMode(CENTER); 29 | image( img, width/2, height/2 ); 30 | 31 | for( int i=0; i< NUMSOUNDS; i++ ) { 32 | color c = get(mouseX, (int)( i / (float)NUMSOUNDS * height ) ); 33 | fill(c); 34 | noStroke(); 35 | ellipse(mouseX, i / (float)NUMSOUNDS * height , 20, 20 ); 36 | 37 | // sending each pixel's red value to pd 38 | pd.sendFloat("n" + i, red(c) ); 39 | } 40 | stroke(255,82,114); 41 | line(mouseX,0,mouseX,height); 42 | } 43 | 44 | void pdPrint(String s) { 45 | println( s ); 46 | } -------------------------------------------------------------------------------- /S06_ImageSonification/data/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 197 198 876 603 10; 2 | #X obj 124 333 dac~; 3 | #X obj 125 287 catch~ outPut; 4 | #X text 120 41 A Very Simple Sonification Example; 5 | #X text 117 148 Create the sounds...; 6 | #X text 125 261 Collect the sounds...; 7 | #X obj 178 183 Node n1; 8 | #X obj 124 183 Node n0; 9 | #X obj 234 184 Node n2; 10 | #X obj 287 184 Node n3; 11 | #X obj 341 184 Node n4; 12 | #X obj 394 184 Node n5; 13 | #X obj 445 184 Node n6; 14 | #X obj 497 185 Node n7; 15 | #X obj 549 186 Node n8; 16 | #X obj 601 186 Node n9; 17 | #X connect 1 0 0 0; 18 | #X connect 1 0 0 1; 19 | -------------------------------------------------------------------------------- /S06_ImageSonification/data/Node.pd: -------------------------------------------------------------------------------- 1 | #N canvas 467 247 589 363 10; 2 | #X obj 244 232 osc~; 3 | #X obj 244 153 r \$1; 4 | #X obj 244 284 throw~ outPut; 5 | #X text 102 55 A simple abstraction for creating sinewave. The argument 6 | of this is the address where Processing sends the corresponding pitch 7 | value; 8 | #X obj 244 261 *~ 0.2; 9 | #X obj 244 193 * 100; 10 | #X connect 0 0 4 0; 11 | #X connect 1 0 5 0; 12 | #X connect 4 0 2 0; 13 | #X connect 5 0 0 0; 14 | -------------------------------------------------------------------------------- /S06_ImageSonification/data/Yantra.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S06_ImageSonification/data/Yantra.jpg -------------------------------------------------------------------------------- /S07_LiveCamSonification/S07_LiveCamSonification.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Live Capture Input Sonification example 4 | 5 | */ 6 | 7 | import org.puredata.processing.PureData; 8 | import processing.video.*; 9 | PureData pd; 10 | 11 | // number of sounds that sonify pixels 12 | int NUMSOUNDS = 10; 13 | 14 | Capture video; 15 | 16 | void setup() { 17 | size( 800, 600, P3D ); 18 | pd = new PureData(this, 44100, 2, 2); 19 | pd.openPatch("Main.pd"); 20 | pd.start(); 21 | 22 | video = new Capture(this,320, 240); 23 | video.start(); 24 | } 25 | 26 | void draw() { 27 | background(0); 28 | if (video.available()) { 29 | video.read(); 30 | image(video, 0, 0, width, height); 31 | for( int i=0; i< NUMSOUNDS; i++ ) { 32 | color c = get(width/2, (int)( i / (float)NUMSOUNDS * height ) ); 33 | fill(c); 34 | noStroke(); 35 | ellipse(width/2, i / (float)NUMSOUNDS * height , 20, 20 ); 36 | 37 | // sending each pixel's red value to pd 38 | pd.sendFloat("n" + i, red(c) ); 39 | } 40 | } 41 | stroke(255,82,114); 42 | line(width/2,0,width/2,height); 43 | } 44 | 45 | void pdPrint(String s) { 46 | println( s ); 47 | } 48 | -------------------------------------------------------------------------------- /S07_LiveCamSonification/data/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 197 198 876 603 10; 2 | #X obj 124 333 dac~; 3 | #X obj 125 287 catch~ outPut; 4 | #X text 120 41 A Very Simple Sonification Example; 5 | #X text 117 148 Create the sounds...; 6 | #X text 125 261 Collect the sounds...; 7 | #X obj 178 183 Node n1; 8 | #X obj 124 183 Node n0; 9 | #X obj 234 184 Node n2; 10 | #X obj 287 184 Node n3; 11 | #X obj 341 184 Node n4; 12 | #X obj 394 184 Node n5; 13 | #X obj 445 184 Node n6; 14 | #X obj 497 185 Node n7; 15 | #X obj 549 186 Node n8; 16 | #X obj 601 186 Node n9; 17 | #X connect 1 0 0 0; 18 | #X connect 1 0 0 1; 19 | -------------------------------------------------------------------------------- /S07_LiveCamSonification/data/Node.pd: -------------------------------------------------------------------------------- 1 | #N canvas 467 247 589 363 10; 2 | #X obj 244 232 osc~; 3 | #X obj 244 153 r \$1; 4 | #X obj 244 284 throw~ outPut; 5 | #X text 102 55 A simple abstraction for creating sinewave. The argument 6 | of this is the address where Processing sends the corresponding pitch 7 | value; 8 | #X obj 244 261 *~ 0.2; 9 | #X obj 244 193 * 100; 10 | #X connect 0 0 4 0; 11 | #X connect 1 0 5 0; 12 | #X connect 4 0 2 0; 13 | #X connect 5 0 0 0; 14 | -------------------------------------------------------------------------------- /S08_DataSonification/S08_DataSonification.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Data Sonification example 4 | 5 | */ 6 | 7 | import org.puredata.processing.PureData; 8 | PureData pd; 9 | 10 | Table dataPoints; 11 | 12 | ArrayList times = new ArrayList(); 13 | ArrayList values = new ArrayList(); 14 | 15 | 16 | void setup() { 17 | size( 800, 600, P3D ); 18 | pd = new PureData(this, 44100, 2, 2); 19 | pd.openPatch("Main.pd"); 20 | pd.start(); 21 | 22 | dataPoints = loadTable("sea-level.csv", "header"); 23 | 24 | for (TableRow row : dataPoints.rows()) { 25 | 26 | String time = row.getString("Time"); 27 | 28 | // GMSL = global mean sea level 29 | float value = row.getFloat("GMSL"); 30 | times.add(time); 31 | values.add(value); 32 | } 33 | 34 | } 35 | 36 | void draw() { 37 | background(0); 38 | stroke(255,82,114); 39 | line(mouseX,0,mouseX,height); 40 | 41 | float readIndex = map(mouseX,0,width,0,times.size()); 42 | 43 | noStroke(); 44 | fill(255); 45 | textSize(40); 46 | text("GLOBAL SEA LEVEL", 20, 50); 47 | fill(255,100); 48 | text(times.get(int(readIndex)), 20, 100); 49 | text(values.get(int(readIndex)), 20, 150); 50 | 51 | stroke(100,100,255); 52 | for(int i=0; i. 28 | ; 29 | #X text 61 54 Copyright (C) 2009 \, Reality Jockey Ltd.; 30 | #X text 60 325 See the file LICENSE.txt for the full license text. 31 | ; 32 | #X restore 614 19 pd LICENSE-GPL; 33 | #X connect 0 0 5 1; 34 | #X connect 0 0 2 0; 35 | #X connect 1 0 5 0; 36 | #X connect 3 0 4 0; 37 | #X connect 4 0 6 1; 38 | #X connect 5 0 6 0; 39 | #X connect 6 0 2 0; 40 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/data/patches/e_platereverb.pd: -------------------------------------------------------------------------------- 1 | #N canvas 423 233 521 453 10; 2 | #X obj 24 32 inlet~; 3 | #X obj 23 380 outlet~; 4 | #X obj 118 380 outlet~; 5 | #N canvas 0 166 634 506 input_diffusion 0; 6 | #X obj 30 60 inlet~; 7 | #X obj 29 295 outlet~; 8 | #X obj 337 79 r \$0-input_diffusion1; 9 | #X obj 336 170 r \$0-input_diffusion2; 10 | #N canvas 393 17 574 578 allpass 0; 11 | #X obj 56 127 inlet~; 12 | #X obj 56 400 +~; 13 | #X obj 427 232 loadbang; 14 | #X obj 417 286 t f f; 15 | #X obj 417 310 *; 16 | #X obj 253 364 *~; 17 | #X obj 232 394 +~; 18 | #X obj 114 177 * -1; 19 | #X obj 88 207 *~; 20 | #X obj 232 426 outlet~; 21 | #X obj 417 129 inlet; 22 | #X obj 114 117 loadbang; 23 | #X obj 75 365 *~ -1; 24 | #X obj 201 364 *~ -1; 25 | #X obj 114 149 f 0.75; 26 | #X obj 417 262 f 0.75; 27 | #X obj 56 491 delwrite~ \$0-tap_13_14 200; 28 | #X obj 252 262 *~ 0.75; 29 | #X obj 252 53 delread~ \$0-tap_13_14 4.77134; 30 | #X obj 417 336 swap 1; 31 | #X obj 417 360 -; 32 | #X connect 0 0 1 0; 33 | #X connect 0 0 8 0; 34 | #X connect 1 0 16 0; 35 | #X connect 2 0 15 0; 36 | #X connect 3 0 4 0; 37 | #X connect 3 1 4 1; 38 | #X connect 4 0 19 0; 39 | #X connect 5 0 6 1; 40 | #X connect 6 0 9 0; 41 | #X connect 7 0 8 1; 42 | #X connect 8 0 13 0; 43 | #X connect 10 0 14 0; 44 | #X connect 10 0 15 0; 45 | #X connect 10 0 17 1; 46 | #X connect 11 0 14 0; 47 | #X connect 12 0 1 1; 48 | #X connect 13 0 6 0; 49 | #X connect 14 0 7 0; 50 | #X connect 15 0 3 0; 51 | #X connect 17 0 5 0; 52 | #X connect 17 0 12 0; 53 | #X connect 18 0 17 0; 54 | #X connect 19 0 20 0; 55 | #X connect 19 1 20 1; 56 | #X connect 20 0 5 1; 57 | #X restore 30 99 pd allpass tap_13_14; 58 | #N canvas 314 10 579 582 allpass 0; 59 | #X obj 56 127 inlet~; 60 | #X obj 56 400 +~; 61 | #X obj 427 232 loadbang; 62 | #X obj 417 286 t f f; 63 | #X obj 417 310 *; 64 | #X obj 253 364 *~; 65 | #X obj 232 394 +~; 66 | #X obj 114 177 * -1; 67 | #X obj 88 207 *~; 68 | #X obj 232 426 outlet~; 69 | #X obj 417 129 inlet; 70 | #X obj 114 117 loadbang; 71 | #X obj 75 365 *~ -1; 72 | #X obj 201 364 *~ -1; 73 | #X obj 114 149 f 0.75; 74 | #X obj 417 262 f 0.75; 75 | #X obj 252 262 *~ 0.75; 76 | #X obj 56 491 delwrite~ \$0-tap_19_20 200; 77 | #X obj 252 53 delread~ \$0-tap_19_20 3.5953; 78 | #X obj 417 336 swap 1; 79 | #X obj 417 360 -; 80 | #X connect 0 0 1 0; 81 | #X connect 0 0 8 0; 82 | #X connect 1 0 17 0; 83 | #X connect 2 0 15 0; 84 | #X connect 3 0 4 0; 85 | #X connect 3 1 4 1; 86 | #X connect 4 0 19 0; 87 | #X connect 5 0 6 1; 88 | #X connect 6 0 9 0; 89 | #X connect 7 0 8 1; 90 | #X connect 8 0 13 0; 91 | #X connect 10 0 14 0; 92 | #X connect 10 0 15 0; 93 | #X connect 10 0 16 1; 94 | #X connect 11 0 14 0; 95 | #X connect 12 0 1 1; 96 | #X connect 13 0 6 0; 97 | #X connect 14 0 7 0; 98 | #X connect 15 0 3 0; 99 | #X connect 16 0 5 0; 100 | #X connect 16 0 12 0; 101 | #X connect 18 0 16 0; 102 | #X connect 19 0 20 0; 103 | #X connect 19 1 20 1; 104 | #X connect 20 0 5 1; 105 | #X restore 30 135 pd allpass tap_19_20; 106 | #N canvas 238 0 570 590 allpass 0; 107 | #X obj 56 127 inlet~; 108 | #X obj 56 400 +~; 109 | #X obj 427 232 loadbang; 110 | #X obj 417 286 t f f; 111 | #X obj 417 310 *; 112 | #X obj 253 364 *~; 113 | #X obj 232 394 +~; 114 | #X obj 114 177 * -1; 115 | #X obj 88 207 *~; 116 | #X obj 232 426 outlet~; 117 | #X obj 417 129 inlet; 118 | #X obj 114 117 loadbang; 119 | #X obj 75 365 *~ -1; 120 | #X obj 201 364 *~ -1; 121 | #X obj 114 149 f 0.625; 122 | #X obj 252 262 *~ 0.625; 123 | #X obj 417 262 f 0.625; 124 | #X obj 56 491 delwrite~ \$0-tap_15_16 200; 125 | #X obj 252 53 delread~ \$0-tap_15_16 12.7348; 126 | #X obj 417 336 swap 1; 127 | #X obj 417 360 -; 128 | #X connect 0 0 1 0; 129 | #X connect 0 0 8 0; 130 | #X connect 1 0 17 0; 131 | #X connect 2 0 16 0; 132 | #X connect 3 0 4 0; 133 | #X connect 3 1 4 1; 134 | #X connect 4 0 19 0; 135 | #X connect 5 0 6 1; 136 | #X connect 6 0 9 0; 137 | #X connect 7 0 8 1; 138 | #X connect 8 0 13 0; 139 | #X connect 10 0 14 0; 140 | #X connect 10 0 15 1; 141 | #X connect 10 0 16 0; 142 | #X connect 11 0 14 0; 143 | #X connect 12 0 1 1; 144 | #X connect 13 0 6 0; 145 | #X connect 14 0 7 0; 146 | #X connect 15 0 5 0; 147 | #X connect 15 0 12 0; 148 | #X connect 16 0 3 0; 149 | #X connect 18 0 15 0; 150 | #X connect 19 0 20 0; 151 | #X connect 19 1 20 1; 152 | #X connect 20 0 5 1; 153 | #X restore 30 190 pd allpass tap_15_16; 154 | #N canvas 238 0 566 586 allpass 0; 155 | #X obj 56 127 inlet~; 156 | #X obj 56 400 +~; 157 | #X obj 427 232 loadbang; 158 | #X obj 417 286 t f f; 159 | #X obj 417 310 *; 160 | #X obj 253 364 *~; 161 | #X obj 232 394 +~; 162 | #X obj 114 177 * -1; 163 | #X obj 88 207 *~; 164 | #X obj 232 426 outlet~; 165 | #X obj 417 129 inlet; 166 | #X obj 114 117 loadbang; 167 | #X obj 75 365 *~ -1; 168 | #X obj 201 364 *~ -1; 169 | #X obj 114 149 f 0.625; 170 | #X obj 252 262 *~ 0.625; 171 | #X obj 417 262 f 0.625; 172 | #X obj 56 491 delwrite~ \$0-tap_21_22 200; 173 | #X obj 252 53 delread~ \$0-tap_21_22 9.30748; 174 | #X obj 417 336 swap 1; 175 | #X obj 417 360 -; 176 | #X connect 0 0 1 0; 177 | #X connect 0 0 8 0; 178 | #X connect 1 0 17 0; 179 | #X connect 2 0 16 0; 180 | #X connect 3 0 4 0; 181 | #X connect 3 1 4 1; 182 | #X connect 4 0 19 0; 183 | #X connect 5 0 6 1; 184 | #X connect 6 0 9 0; 185 | #X connect 7 0 8 1; 186 | #X connect 8 0 13 0; 187 | #X connect 10 0 14 0; 188 | #X connect 10 0 15 1; 189 | #X connect 10 0 16 0; 190 | #X connect 11 0 14 0; 191 | #X connect 12 0 1 1; 192 | #X connect 13 0 6 0; 193 | #X connect 14 0 7 0; 194 | #X connect 15 0 5 0; 195 | #X connect 15 0 12 0; 196 | #X connect 16 0 3 0; 197 | #X connect 18 0 15 0; 198 | #X connect 19 0 20 0; 199 | #X connect 19 1 20 1; 200 | #X connect 20 0 5 1; 201 | #X restore 30 230 pd allpass tap_21_22; 202 | #X connect 0 0 4 0; 203 | #X connect 2 0 4 1; 204 | #X connect 2 0 5 1; 205 | #X connect 3 0 6 1; 206 | #X connect 3 0 7 1; 207 | #X connect 4 0 5 0; 208 | #X connect 5 0 6 0; 209 | #X connect 6 0 7 0; 210 | #X connect 7 0 1 0; 211 | #X restore 25 208 pd input_diffusion; 212 | #N canvas 38 72 501 476 reverberation_tank 0; 213 | #X obj 168 85 inlet~; 214 | #X obj 43 120 +~; 215 | #X obj 255 121 +~; 216 | #N canvas 0 0 458 308 z^-4217 0; 217 | #X obj 106 55 inlet~; 218 | #X obj 105 120 delwrite~ \$0-tap_48_54 141.695; 219 | #X text 358 135 4217; 220 | #X obj 105 147 delread~ \$0-tap_48_54 141.695; 221 | #X obj 106 223 outlet~; 222 | #X connect 0 0 1 0; 223 | #X connect 3 0 4 0; 224 | #X restore 255 190 pd z^-4217; 225 | #N canvas 0 0 458 308 z^-4453 0; 226 | #X obj 41 104 delwrite~ \$0-tap_24_30 149.625; 227 | #X obj 42 128 delread~ \$0-tap_24_30 149.625; 228 | #X text 287 119 4453; 229 | #X obj 43 60 inlet~; 230 | #X obj 43 168 outlet~; 231 | #X connect 1 0 4 0; 232 | #X connect 3 0 0 0; 233 | #X restore 43 192 pd z^-4453; 234 | #N canvas 0 0 466 316 damping 0; 235 | #X obj 74 53 inlet~; 236 | #X obj 70 222 outlet~; 237 | #X obj 73 137 lop~ 22050; 238 | #X obj 162 137 r \$0-damping; 239 | #X connect 0 0 2 0; 240 | #X connect 2 0 1 0; 241 | #X connect 3 0 2 1; 242 | #X restore 44 221 pd damping; 243 | #N canvas 0 0 470 320 damping 0; 244 | #X obj 74 53 inlet~; 245 | #X obj 70 222 outlet~; 246 | #X obj 73 137 lop~ 22050; 247 | #X obj 162 137 r \$0-damping; 248 | #X connect 0 0 2 0; 249 | #X connect 2 0 1 0; 250 | #X connect 3 0 2 1; 251 | #X restore 256 221 pd damping; 252 | #N canvas 0 0 470 320 decay 0; 253 | #X obj 71 66 inlet~; 254 | #X obj 71 220 outlet~; 255 | #X obj 140 139 r \$0-decay; 256 | #X obj 70 140 *~ 0.5; 257 | #X connect 0 0 3 0; 258 | #X connect 2 0 3 1; 259 | #X connect 3 0 1 0; 260 | #X restore 43 249 pd decay; 261 | #N canvas 0 0 470 320 decay 0; 262 | #X obj 71 66 inlet~; 263 | #X obj 71 220 outlet~; 264 | #X obj 140 139 r \$0-decay; 265 | #X obj 70 140 *~ 0.5; 266 | #X connect 0 0 3 0; 267 | #X connect 2 0 3 1; 268 | #X connect 3 0 1 0; 269 | #X restore 257 250 pd decay; 270 | #N canvas 0 0 466 316 decay 0; 271 | #X obj 71 66 inlet~; 272 | #X obj 71 220 outlet~; 273 | #X obj 140 139 r \$0-decay; 274 | #X obj 70 140 *~ 0.5; 275 | #X connect 0 0 3 0; 276 | #X connect 2 0 3 1; 277 | #X connect 3 0 1 0; 278 | #X restore 43 87 pd decay; 279 | #N canvas 0 0 466 316 decay 0; 280 | #X obj 71 66 inlet~; 281 | #X obj 71 220 outlet~; 282 | #X obj 140 139 r \$0-decay; 283 | #X obj 70 140 *~ 0.5; 284 | #X connect 0 0 3 0; 285 | #X connect 2 0 3 1; 286 | #X connect 3 0 1 0; 287 | #X restore 273 85 pd decay; 288 | #N canvas 0 0 498 348 decay_diffusion1 0; 289 | #N canvas 232 298 494 344 excursion 0; 290 | #X obj 64 192 outlet~; 291 | #X obj 62 90 osc~ 1; 292 | #X obj 63 143 *~ 0.53761; 293 | #X obj 130 109 r \$0-excursion; 294 | #X connect 1 0 2 0; 295 | #X connect 2 0 0 0; 296 | #X connect 3 0 2 1; 297 | #X restore 133 120 pd excursion; 298 | #X obj 43 32 inlet~; 299 | #X obj 44 250 outlet~; 300 | #X obj 88 84 r \$0-decay_diffusion1; 301 | #N canvas 409 74 612 523 allpassvd 0; 302 | #X obj 48 83 inlet~; 303 | #X obj 48 296 +~; 304 | #X obj 285 142 loadbang; 305 | #X obj 285 196 t f f; 306 | #X obj 285 220 *; 307 | #X obj 229 277 *~; 308 | #X obj 216 300 +~; 309 | #X obj 94 138 * -1; 310 | #X obj 80 163 *~; 311 | #X obj 217 401 outlet~; 312 | #X obj 392 30 inlet~; 313 | #X obj 447 56 sig~; 314 | #X obj 447 10 loadbang; 315 | #X obj 390 78 +~; 316 | #X obj 255 45 inlet; 317 | #X obj 94 60 loadbang; 318 | #X text 9 6 arguments: delay(ms) feedback(mult); 319 | #X text 10 20 inlets: signal feedback(mult) excursion; 320 | #X obj 94 114 f 0.7; 321 | #X obj 230 152 *~ 0.7; 322 | #X obj 285 172 f 0.7; 323 | #X obj 391 404 +~; 324 | #X text 372 428 excursion; 325 | #X obj 48 327 delwrite~ \$0-tap_23_24 100; 326 | #X obj 283 101 vd~ \$0-tap_23_24; 327 | #X obj 447 33 f 22.5599; 328 | #X obj 285 244 swap 1; 329 | #X obj 285 268 -; 330 | #X connect 0 0 1 0; 331 | #X connect 0 0 8 0; 332 | #X connect 1 0 23 0; 333 | #X connect 2 0 20 0; 334 | #X connect 3 0 4 0; 335 | #X connect 3 1 4 1; 336 | #X connect 4 0 26 0; 337 | #X connect 5 0 6 1; 338 | #X connect 6 0 9 0; 339 | #X connect 7 0 8 1; 340 | #X connect 8 0 6 0; 341 | #X connect 10 0 13 0; 342 | #X connect 11 0 13 1; 343 | #X connect 12 0 25 0; 344 | #X connect 13 0 21 0; 345 | #X connect 13 0 24 0; 346 | #X connect 14 0 18 0; 347 | #X connect 14 0 19 1; 348 | #X connect 14 0 20 0; 349 | #X connect 15 0 18 0; 350 | #X connect 18 0 7 0; 351 | #X connect 19 0 1 1; 352 | #X connect 19 0 5 0; 353 | #X connect 20 0 3 0; 354 | #X connect 24 0 19 0; 355 | #X connect 25 0 11 0; 356 | #X connect 26 0 27 0; 357 | #X connect 26 1 27 1; 358 | #X connect 27 0 5 1; 359 | #X restore 43 150 pd allpassvd; 360 | #X connect 0 0 4 2; 361 | #X connect 1 0 4 0; 362 | #X connect 3 0 4 1; 363 | #X connect 4 0 2 0; 364 | #X restore 44 156 pd decay_diffusion1; 365 | #N canvas 0 0 529 394 decay_diffusion1 0; 366 | #N canvas 232 298 482 332 excursion 0; 367 | #X obj 65 192 outlet~; 368 | #X obj 63 81 osc~ 1; 369 | #X obj 64 134 *~ 0.53761; 370 | #X obj 139 104 r \$0-excursion; 371 | #X connect 1 0 2 0; 372 | #X connect 2 0 0 0; 373 | #X connect 3 0 2 1; 374 | #X restore 138 92 pd excursion; 375 | #X obj 49 25 inlet~; 376 | #X obj 49 200 outlet~; 377 | #X obj 93 60 r \$0-decay_diffusion1; 378 | #N canvas 348 52 608 519 allpassvd 0; 379 | #X obj 48 83 inlet~; 380 | #X obj 48 296 +~; 381 | #X obj 285 142 loadbang; 382 | #X obj 285 196 t f f; 383 | #X obj 285 220 *; 384 | #X obj 229 277 *~; 385 | #X obj 216 300 +~; 386 | #X obj 94 138 * -1; 387 | #X obj 80 163 *~; 388 | #X obj 217 401 outlet~; 389 | #X obj 392 30 inlet~; 390 | #X obj 447 56 sig~; 391 | #X obj 447 10 loadbang; 392 | #X obj 390 78 +~; 393 | #X obj 255 45 inlet; 394 | #X obj 94 60 loadbang; 395 | #X text 9 6 arguments: delay(ms) feedback(mult); 396 | #X text 10 20 inlets: signal feedback(mult) excursion; 397 | #X obj 48 327 delwrite~ \$0-tap_46_48 100; 398 | #X obj 283 101 vd~ \$0-tap_46_48; 399 | #X obj 447 33 f 30.5097; 400 | #X obj 94 114 f 0.7; 401 | #X obj 230 152 *~ 0.7; 402 | #X obj 285 172 f 0.7; 403 | #X obj 391 404 +~; 404 | #X text 372 428 excursion; 405 | #X obj 285 244 swap 1; 406 | #X obj 285 268 -; 407 | #X connect 0 0 1 0; 408 | #X connect 0 0 8 0; 409 | #X connect 1 0 18 0; 410 | #X connect 2 0 23 0; 411 | #X connect 3 0 4 0; 412 | #X connect 3 1 4 1; 413 | #X connect 4 0 26 0; 414 | #X connect 5 0 6 1; 415 | #X connect 6 0 9 0; 416 | #X connect 7 0 8 1; 417 | #X connect 8 0 6 0; 418 | #X connect 10 0 13 0; 419 | #X connect 11 0 13 1; 420 | #X connect 12 0 20 0; 421 | #X connect 13 0 19 0; 422 | #X connect 13 0 24 0; 423 | #X connect 14 0 21 0; 424 | #X connect 14 0 22 1; 425 | #X connect 14 0 23 0; 426 | #X connect 15 0 21 0; 427 | #X connect 19 0 22 0; 428 | #X connect 20 0 11 0; 429 | #X connect 21 0 7 0; 430 | #X connect 22 0 1 1; 431 | #X connect 22 0 5 0; 432 | #X connect 23 0 3 0; 433 | #X connect 26 0 27 0; 434 | #X connect 26 1 27 1; 435 | #X connect 27 0 5 1; 436 | #X restore 48 135 pd allpassvd; 437 | #X connect 0 0 4 2; 438 | #X connect 1 0 4 0; 439 | #X connect 3 0 4 1; 440 | #X connect 4 0 2 0; 441 | #X restore 256 155 pd decay_diffusion1; 442 | #N canvas 327 329 552 336 decay_diffusion2 0; 443 | #X obj 37 63 inlet~; 444 | #X obj 37 220 outlet~; 445 | #N canvas 393 17 582 586 allpass 0; 446 | #X obj 56 127 inlet~; 447 | #X obj 56 400 +~; 448 | #X obj 427 232 loadbang; 449 | #X obj 417 286 t f f; 450 | #X obj 417 310 *; 451 | #X obj 253 364 *~; 452 | #X obj 232 394 +~; 453 | #X obj 114 177 * -1; 454 | #X obj 88 207 *~; 455 | #X obj 232 426 outlet~; 456 | #X obj 417 129 inlet; 457 | #X obj 114 117 loadbang; 458 | #X obj 75 365 *~ -1; 459 | #X obj 201 364 *~ -1; 460 | #X obj 252 52 delread~ \$0-tap_31_33 60.4818; 461 | #X obj 56 491 delwrite~ \$0-tap_31_33 200; 462 | #X obj 114 149 f 0.5; 463 | #X obj 252 262 *~ 0.5; 464 | #X obj 417 262 f 0.5; 465 | #X obj 417 334 swap 1; 466 | #X obj 417 358 -; 467 | #X connect 0 0 1 0; 468 | #X connect 0 0 8 0; 469 | #X connect 1 0 15 0; 470 | #X connect 2 0 18 0; 471 | #X connect 3 0 4 0; 472 | #X connect 3 1 4 1; 473 | #X connect 4 0 19 0; 474 | #X connect 5 0 6 1; 475 | #X connect 6 0 9 0; 476 | #X connect 7 0 8 1; 477 | #X connect 8 0 13 0; 478 | #X connect 10 0 16 0; 479 | #X connect 10 0 17 1; 480 | #X connect 10 0 18 0; 481 | #X connect 11 0 16 0; 482 | #X connect 12 0 1 1; 483 | #X connect 13 0 6 0; 484 | #X connect 14 0 17 0; 485 | #X connect 16 0 7 0; 486 | #X connect 17 0 5 0; 487 | #X connect 17 0 12 0; 488 | #X connect 18 0 3 0; 489 | #X connect 19 0 20 0; 490 | #X connect 19 1 20 1; 491 | #X connect 20 0 5 1; 492 | #X restore 36 143 pd allpass tap_31_33; 493 | #X obj 191 114 r \$0-decay_diffusion2; 494 | #X connect 0 0 2 0; 495 | #X connect 2 0 1 0; 496 | #X connect 3 0 2 1; 497 | #X restore 43 277 pd decay_diffusion2; 498 | #N canvas 0 0 553 336 decay_diffusion2 0; 499 | #X obj 52 38 inlet~; 500 | #X obj 54 171 outlet~; 501 | #X obj 210 85 r \$0-decay_diffusion2; 502 | #N canvas 393 17 586 590 allpass 0; 503 | #X obj 56 127 inlet~; 504 | #X obj 56 400 +~; 505 | #X obj 427 232 loadbang; 506 | #X obj 417 286 t f f; 507 | #X obj 417 310 *; 508 | #X obj 253 364 *~; 509 | #X obj 232 394 +~; 510 | #X obj 114 177 * -1; 511 | #X obj 88 207 *~; 512 | #X obj 232 426 outlet~; 513 | #X obj 417 129 inlet; 514 | #X obj 114 117 loadbang; 515 | #X obj 75 365 *~ -1; 516 | #X obj 201 364 *~ -1; 517 | #X obj 114 149 f 0.5; 518 | #X obj 252 262 *~ 0.5; 519 | #X obj 417 262 f 0.5; 520 | #X obj 56 491 delwrite~ \$0-tap_55_59 200; 521 | #X obj 252 52 delread~ \$0-tap_55_59 89.2443; 522 | #X obj 417 334 swap 1; 523 | #X obj 417 358 -; 524 | #X connect 0 0 1 0; 525 | #X connect 0 0 8 0; 526 | #X connect 1 0 17 0; 527 | #X connect 2 0 16 0; 528 | #X connect 3 0 4 0; 529 | #X connect 3 1 4 1; 530 | #X connect 4 0 19 0; 531 | #X connect 5 0 6 1; 532 | #X connect 6 0 9 0; 533 | #X connect 7 0 8 1; 534 | #X connect 8 0 13 0; 535 | #X connect 10 0 14 0; 536 | #X connect 10 0 15 1; 537 | #X connect 10 0 16 0; 538 | #X connect 11 0 14 0; 539 | #X connect 12 0 1 1; 540 | #X connect 13 0 6 0; 541 | #X connect 14 0 7 0; 542 | #X connect 15 0 5 0; 543 | #X connect 15 0 12 0; 544 | #X connect 16 0 3 0; 545 | #X connect 18 0 15 0; 546 | #X connect 19 0 20 0; 547 | #X connect 19 1 20 1; 548 | #X connect 20 0 5 1; 549 | #X restore 55 114 pd allpass tap_55_59; 550 | #X connect 0 0 3 0; 551 | #X connect 2 0 3 1; 552 | #X connect 3 0 1 0; 553 | #X restore 256 278 pd decay_diffusion2; 554 | #N canvas 0 0 454 304 feedback 0; 555 | #X obj 43 118 outlet~; 556 | #X obj 44 55 delread~ \$0-tap_59_63 106.28; 557 | #X connect 1 0 0 0; 558 | #X restore 43 49 pd feedback; 559 | #N canvas 0 0 454 304 feedback 0; 560 | #X obj 81 188 outlet~; 561 | #X obj 81 134 delread~ \$0-tap_33_39 124.996; 562 | #X connect 1 0 0 0; 563 | #X restore 274 51 pd feedback; 564 | #N canvas 0 0 458 308 to_left 0; 565 | #X obj 48 52 inlet~; 566 | #X obj 48 95 delwrite~ \$0-tap_59_63 106.28; 567 | #X connect 0 0 1 0; 568 | #X restore 255 306 pd to_left; 569 | #N canvas 0 0 454 304 to_right 0; 570 | #X obj 53 173 delwrite~ \$0-tap_33_39 124.996; 571 | #X obj 56 100 inlet~; 572 | #X connect 1 0 0 0; 573 | #X restore 44 305 pd to_right; 574 | #X text 344 190 48_54; 575 | #X text 136 193 24_30; 576 | #X obj 170 357 outlet~; 577 | #X text 242 358 dummy; 578 | #X connect 0 0 1 1; 579 | #X connect 0 0 2 0; 580 | #X connect 1 0 11 0; 581 | #X connect 2 0 12 0; 582 | #X connect 3 0 6 0; 583 | #X connect 4 0 5 0; 584 | #X connect 5 0 7 0; 585 | #X connect 6 0 8 0; 586 | #X connect 7 0 13 0; 587 | #X connect 8 0 14 0; 588 | #X connect 9 0 1 0; 589 | #X connect 10 0 2 1; 590 | #X connect 11 0 4 0; 591 | #X connect 12 0 3 0; 592 | #X connect 13 0 18 0; 593 | #X connect 14 0 17 0; 594 | #X connect 15 0 9 0; 595 | #X connect 16 0 10 0; 596 | #X restore 25 238 pd reverberation_tank; 597 | #N canvas 58 172 593 487 predelay 0; 598 | #X obj 97 19 inlet~; 599 | #X obj 97 317 outlet~; 600 | #X obj 393 56 sel 0; 601 | #X obj 96 209 *~ 1; 602 | #X obj 110 178 f 1; 603 | #X obj 140 179 f 0; 604 | #X obj 428 106 t a b; 605 | #X obj 377 222 *~ 1; 606 | #X obj 402 191 f 0; 607 | #X obj 433 191 f 1; 608 | #X text 17 210 no delay; 609 | #X text 237 212 delay; 610 | #N canvas 294 159 273 227 predelay 0; 611 | #X obj 35 52 inlet~; 612 | #X obj 94 54 inlet; 613 | #N canvas 345 153 450 300 dw 0; 614 | #X obj 35 52 inlet~; 615 | #X obj 35 101 delwrite~ \$0-predelay 1000; 616 | #X obj 34 140 outlet~; 617 | #X connect 0 0 1 0; 618 | #X restore 34 84 pd dw; 619 | #N canvas 326 259 416 179 dr 0; 620 | #X obj 126 29 inlet; 621 | #X obj 49 28 inlet~; 622 | #X obj 126 65 delread~ \$0-predelay 1; 623 | #X obj 126 88 outlet~; 624 | #X connect 0 0 2 0; 625 | #X connect 2 0 3 0; 626 | #X restore 33 116 pd dr; 627 | #X obj 33 138 outlet~; 628 | #X connect 0 0 2 0; 629 | #X connect 1 0 3 1; 630 | #X connect 2 0 3 0; 631 | #X connect 3 0 4 0; 632 | #X restore 297 190 pd predelay; 633 | #X obj 393 25 r \$0-predelay; 634 | #X connect 0 0 3 0; 635 | #X connect 0 0 12 0; 636 | #X connect 2 0 4 0; 637 | #X connect 2 0 8 0; 638 | #X connect 2 1 6 0; 639 | #X connect 3 0 1 0; 640 | #X connect 4 0 3 1; 641 | #X connect 5 0 3 1; 642 | #X connect 6 0 12 1; 643 | #X connect 6 1 5 0; 644 | #X connect 6 1 9 0; 645 | #X connect 7 0 1 0; 646 | #X connect 8 0 7 1; 647 | #X connect 9 0 7 1; 648 | #X connect 12 0 7 0; 649 | #X connect 13 0 2 0; 650 | #X restore 25 145 pd predelay; 651 | #X obj 85 32 inlet~; 652 | #X obj 223 35 inlet; 653 | #N canvas 0 0 458 308 bandwidth 0; 654 | #X obj 66 22 inlet~; 655 | #X obj 65 183 outlet~; 656 | #X obj 65 107 lop~; 657 | #X obj 92 74 r \$0-bandwidth; 658 | #X connect 0 0 2 0; 659 | #X connect 2 0 1 0; 660 | #X connect 3 0 2 1; 661 | #X restore 25 177 pd bandwidth; 662 | #N canvas 0 0 458 308 1/2 0; 663 | #X obj 102 56 inlet~; 664 | #X obj 182 56 inlet~; 665 | #X obj 103 138 *~ 0.5; 666 | #X obj 103 102 +~; 667 | #X obj 103 175 outlet~; 668 | #X connect 0 0 3 0; 669 | #X connect 1 0 3 1; 670 | #X connect 2 0 4 0; 671 | #X connect 3 0 2 0; 672 | #X restore 25 112 pd 1/2; 673 | #N canvas 120 111 856 498 output_taps 0; 674 | #X obj 28 409 outlet~; 675 | #X obj 30 267 -~; 676 | #X obj 31 109 +~; 677 | #X obj 30 215 +~; 678 | #X obj 29 369 -~; 679 | #X text 30 26 left; 680 | #X obj 32 55 delread~ \$0-tap_48_54 8.93787; 681 | #X obj 51 82 delread~ \$0-tap_48_54 99.9294; 682 | #X obj 50 134 delread~ \$0-tap_55_59 64.2787; 683 | #X obj 31 163 -~; 684 | #X obj 49 188 delread~ \$0-tap_59_63 67.0676; 685 | #X obj 50 240 delread~ \$0-tap_24_30 66.866; 686 | #X obj 50 293 delread~ \$0-tap_31_33 6.28339; 687 | #X obj 30 317 -~; 688 | #X obj 49 342 delread~ \$0-tap_33_39 35.8187; 689 | #X obj 371 407 outlet~; 690 | #X obj 370 105 +~; 691 | #X obj 371 261 -~; 692 | #X obj 370 208 +~; 693 | #X obj 371 365 -~; 694 | #X text 370 20 right; 695 | #X obj 371 51 delread~ \$0-tap_24_30 11.8612; 696 | #X obj 390 78 delread~ \$0-tap_24_30 121.871; 697 | #X obj 390 130 delread~ \$0-tap_31_33 41.2621; 698 | #X obj 390 181 delread~ \$0-tap_33_39 89.8155; 699 | #X obj 391 234 delread~ \$0-tap_48_54 70.9317; 700 | #X obj 372 313 -~; 701 | #X obj 392 286 delread~ \$0-tap_55_59 11.2563; 702 | #X obj 390 338 delread~ \$0-tap_59_63 4.06572; 703 | #X obj 370 154 -~; 704 | #X obj 161 15 inlet~; 705 | #X text 222 15 dummy; 706 | #X connect 1 0 13 0; 707 | #X connect 2 0 9 0; 708 | #X connect 3 0 1 0; 709 | #X connect 4 0 0 0; 710 | #X connect 6 0 2 0; 711 | #X connect 7 0 2 1; 712 | #X connect 8 0 9 1; 713 | #X connect 9 0 3 0; 714 | #X connect 10 0 3 1; 715 | #X connect 11 0 1 1; 716 | #X connect 12 0 13 1; 717 | #X connect 13 0 4 0; 718 | #X connect 14 0 4 1; 719 | #X connect 16 0 29 0; 720 | #X connect 17 0 26 0; 721 | #X connect 18 0 17 0; 722 | #X connect 19 0 15 0; 723 | #X connect 21 0 16 0; 724 | #X connect 22 0 16 1; 725 | #X connect 23 0 29 1; 726 | #X connect 24 0 18 1; 727 | #X connect 25 0 17 1; 728 | #X connect 26 0 19 0; 729 | #X connect 27 0 26 1; 730 | #X connect 28 0 19 1; 731 | #X connect 29 0 18 0; 732 | #X restore 24 268 pd output_taps; 733 | #N canvas 366 327 496 480 dispatchers 0; 734 | #X obj 40 43 inlet; 735 | #X obj 107 106 u_dispatch \$0 predelay; 736 | #X obj 107 128 u_dispatch \$0 bandwidth; 737 | #X obj 107 150 u_dispatch \$0 damping; 738 | #X obj 107 172 u_dispatch \$0 decay; 739 | #X obj 107 194 u_dispatch \$0 input_diffusion1; 740 | #X obj 107 282 u_dispatch \$0 excursion; 741 | #X obj 107 216 u_dispatch \$0 input_diffusion2; 742 | #X obj 107 238 u_dispatch \$0 decay_diffusion1; 743 | #X obj 107 260 u_dispatch \$0 decay_diffusion2; 744 | #X obj 107 318 u_dispatch \$0 dry; 745 | #X obj 40 379 u_loader e_platereverb-\$1 \$0; 746 | #X obj 40 403 outlet; 747 | #X obj 40 78 route save; 748 | #X connect 0 0 13 0; 749 | #X connect 1 0 2 0; 750 | #X connect 2 0 3 0; 751 | #X connect 3 0 4 0; 752 | #X connect 4 0 5 0; 753 | #X connect 5 0 7 0; 754 | #X connect 6 0 10 0; 755 | #X connect 7 0 8 0; 756 | #X connect 8 0 9 0; 757 | #X connect 9 0 6 0; 758 | #X connect 11 0 12 0; 759 | #X connect 13 0 11 0; 760 | #X connect 13 1 1 0; 761 | #X restore 223 117 pd dispatchers; 762 | #N canvas 83 39 896 374 defaults 0; 763 | #X msg 491 174 predelay 0 \, bandwidth 22050 \, damping 22050 \, decay 764 | 0.5 \, input_diffusion1 0.75 \, input_diffusion2 0.625 \, decay_diffusion1 765 | 0.7 \, decay_diffusion2 0.5 \, excursion 0.53761; 766 | #X obj 53 144 samplerate~; 767 | #X obj 53 166 * 0.5; 768 | #X msg 53 187 bandwidth \$1 \, damping \$1; 769 | #X text 532 142 This is the original default; 770 | #X obj 53 300 outlet; 771 | #X obj 53 61 t b b; 772 | #X text 241 186 but we use SR/2 for bw and damp.; 773 | #X obj 53 33 inlet; 774 | #X msg 97 33 bang; 775 | #X connect 0 0 5 0; 776 | #X connect 1 0 2 0; 777 | #X connect 2 0 3 0; 778 | #X connect 3 0 5 0; 779 | #X connect 6 0 1 0; 780 | #X connect 6 1 0 0; 781 | #X connect 8 0 6 0; 782 | #X connect 9 0 6 0; 783 | #X restore 234 89 pd defaults; 784 | #X obj 234 66 loadbang; 785 | #X obj 24 347 c_xfade; 786 | #X obj 118 349 c_xfade; 787 | #X obj 164 268 r \$0-dry; 788 | #X obj 164 293 pack 0 10; 789 | #X obj 223 142 outlet; 790 | #X text 278 141 for saving.; 791 | #N canvas 228 198 627 317 LICENSE-BSD 0; 792 | #X text 121 56 This software is copyrighted by Miller Puckette \, Reality 793 | Jockey Ltd. and others. The terms (the "Standard Improved BSD License") 794 | apply to all files associated with the software unless explicitly disclaimed 795 | in individual files.; 796 | #X text 123 148 See the file LICENSE.txt for the full license text. 797 | ; 798 | #X restore 373 40 pd LICENSE-BSD; 799 | #X connect 0 0 9 0; 800 | #X connect 0 0 14 1; 801 | #X connect 3 0 4 0; 802 | #X connect 4 0 10 0; 803 | #X connect 5 0 8 0; 804 | #X connect 6 0 9 1; 805 | #X connect 6 0 15 1; 806 | #X connect 7 0 11 0; 807 | #X connect 8 0 3 0; 808 | #X connect 9 0 5 0; 809 | #X connect 10 0 14 0; 810 | #X connect 10 1 15 0; 811 | #X connect 11 0 18 0; 812 | #X connect 12 0 11 0; 813 | #X connect 13 0 12 0; 814 | #X connect 14 0 1 0; 815 | #X connect 15 0 2 0; 816 | #X connect 16 0 17 0; 817 | #X connect 17 0 15 2; 818 | #X connect 17 0 14 2; 819 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/data/patches/m_minorscale.pd: -------------------------------------------------------------------------------- 1 | #N canvas 69 44 1131 628 10; 2 | #X obj 110 186 * 12; 3 | #X obj 45 447 +; 4 | #X obj 45 544 outlet; 5 | #X obj 45 41 inlet; 6 | #X obj 613 300 loadbang; 7 | #X obj 580 35 inlet; 8 | #X obj 45 500 + \$1; 9 | #X text 41 18 major step; 10 | #X obj 45 160 mod 7; 11 | #X obj 110 160 div 7; 12 | #N canvas 172 83 586 377 LICENSE-GPL 0; 13 | #X text 57 88 This program is free software: you can redistribute it 14 | and/or modify it under the terms of the GNU General Public License 15 | as published by the Free Software Foundation \, either version 3 of 16 | the License \, or (at your option) any later version.; 17 | #X text 58 168 This program is distributed in the hope that it will 18 | be useful \, but WITHOUT ANY WARRANTY \; without even the implied warranty 19 | of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 | General Public License for more details.; 21 | #X text 57 261 You should have received a copy of the GNU General Public 22 | License along with this program. If not \, see . 23 | ; 24 | #X text 61 54 Copyright (C) 2009 \, Reality Jockey Ltd.; 25 | #X text 60 325 See the file LICENSE.txt for the full license text. 26 | ; 27 | #X restore 981 33 pd LICENSE-GPL; 28 | #X obj 616 199 loadbang; 29 | #X msg 613 323 0 0 2 3 5 7 9 11; 30 | #X obj 616 410 loadbang; 31 | #X msg 616 433 0 0 2 3 5 7 10 11; 32 | #X obj 613 370 table \$0-harmonic 7; 33 | #X obj 616 480 table \$0-melodic 7; 34 | #X msg 616 222 0 0 2 3 5 7 9 10; 35 | #X obj 616 456 s \$0-melodic; 36 | #X obj 613 346 s \$0-harmonic; 37 | #X obj 45 81 t a a a; 38 | #X obj 616 270 table \$0-natural 7; 39 | #X obj 616 245 s \$0-natural; 40 | #X obj 45 385 tabread \$0-natural; 41 | #X text 694 300 harmonic minor: raised 7th; 42 | #X text 691 409 melodic minor: raised 6th and 7th; 43 | #X text 693 195 natural minor: just like major 3 steps down; 44 | #N canvas 253 195 688 511 auto 0; 45 | #X obj 34 119 t f f; 46 | #X obj 36 204 spigot; 47 | #X obj 34 64 inlet; 48 | #X obj 36 333 outlet; 49 | #X obj 109 64 inlet; 50 | #X text 26 30 scale steps; 51 | #X text 253 67 auto mode will select the natural minor scale for any 52 | descending interval and the harmonic or melodic mode for ascending 53 | intervals.; 54 | #X obj 69 305 outlet; 55 | #X obj 36 243 select 0 1; 56 | #X text 127 32 auto 0/1; 57 | #X obj 36 149 >; 58 | #X connect 0 0 10 1; 59 | #X connect 0 1 10 0; 60 | #X connect 1 0 8 0; 61 | #X connect 2 0 0 0; 62 | #X connect 4 0 1 1; 63 | #X connect 8 0 3 0; 64 | #X connect 8 1 7 0; 65 | #X connect 10 0 1 0; 66 | #X restore 172 149 pd auto; 67 | #X text 580 12 base note \, auto 0/1 \, mode natural/harmonic/melodic 68 | ; 69 | #X obj 261 429 loadbang; 70 | #X obj 261 453 list append \$2; 71 | #X obj 373 428 loadbang; 72 | #X obj 373 452 f \$3; 73 | #X symbolatom 172 322 20 0 0 0 - - -; 74 | #X obj 261 481 s \$0-mode; 75 | #X obj 373 476 s \$0-auto; 76 | #X obj 218 66 r \$0-auto; 77 | #X obj 580 135 s \$0-auto; 78 | #X obj 628 110 s \$0-mode; 79 | #X obj 676 85 s \$0-base; 80 | #X obj 70 475 r \$0-base; 81 | #N canvas 321 226 792 432 translate-mode 0; 82 | #X obj 169 226 symbol \$0-harmonic; 83 | #X obj 142 366 outlet; 84 | #X obj 142 81 select 0 1 2; 85 | #X obj 142 184 symbol \$0-natural; 86 | #X obj 196 271 symbol \$0-melodic; 87 | #X obj 142 20 inlet; 88 | #X obj 316 67 list; 89 | #X obj 316 88 select natural harmonic melodic; 90 | #X obj 142 56 route float; 91 | #X text 187 21 mode-selection by symbols or floats; 92 | #X connect 0 0 1 0; 93 | #X connect 2 0 3 0; 94 | #X connect 2 1 0 0; 95 | #X connect 2 2 4 0; 96 | #X connect 3 0 1 0; 97 | #X connect 4 0 1 0; 98 | #X connect 5 0 8 0; 99 | #X connect 6 0 7 0; 100 | #X connect 7 0 3 0; 101 | #X connect 7 1 0 0; 102 | #X connect 7 2 4 0; 103 | #X connect 8 0 2 0; 104 | #X connect 8 1 6 0; 105 | #X restore 172 237 pd translate-mode; 106 | #X text 308 236 mode to tablename; 107 | #X msg 172 176 0; 108 | #X obj 268 151 t b a; 109 | #X msg 101 351 set \$1; 110 | #X msg 242 203 1; 111 | #X msg 282 203 melodic; 112 | #X obj 268 131 r \$0-mode; 113 | #X text 264 408 Arguments; 114 | #X text 347 201 tests; 115 | #X obj 580 59 route auto mode float; 116 | #X obj 245 101 select 0; 117 | #X obj 245 175 list append \$2; 118 | #X text 250 84 on auto off \, choose last mode again; 119 | #X text 355 176 cache selected mode; 120 | #X connect 0 0 1 1; 121 | #X connect 1 0 6 0; 122 | #X connect 3 0 20 0; 123 | #X connect 4 0 12 0; 124 | #X connect 5 0 51 0; 125 | #X connect 6 0 2 0; 126 | #X connect 8 0 23 0; 127 | #X connect 9 0 0 0; 128 | #X connect 11 0 17 0; 129 | #X connect 12 0 19 0; 130 | #X connect 13 0 14 0; 131 | #X connect 14 0 18 0; 132 | #X connect 17 0 22 0; 133 | #X connect 20 0 8 0; 134 | #X connect 20 1 9 0; 135 | #X connect 20 2 27 0; 136 | #X connect 23 0 1 0; 137 | #X connect 27 0 43 0; 138 | #X connect 27 1 53 0; 139 | #X connect 29 0 30 0; 140 | #X connect 30 0 34 0; 141 | #X connect 31 0 32 0; 142 | #X connect 32 0 35 0; 143 | #X connect 36 0 52 0; 144 | #X connect 36 0 27 1; 145 | #X connect 40 0 6 1; 146 | #X connect 41 0 33 0; 147 | #X connect 41 0 45 0; 148 | #X connect 43 0 41 0; 149 | #X connect 44 0 53 0; 150 | #X connect 44 1 53 1; 151 | #X connect 45 0 23 0; 152 | #X connect 46 0 41 0; 153 | #X connect 47 0 41 0; 154 | #X connect 48 0 44 0; 155 | #X connect 51 0 37 0; 156 | #X connect 51 1 38 0; 157 | #X connect 51 2 39 0; 158 | #X connect 52 0 53 0; 159 | #X connect 53 0 41 0; 160 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/data/patches/s_rhodey.pd: -------------------------------------------------------------------------------- 1 | #N canvas 24 28 1106 642 10; 2 | #N canvas 424 366 478 366 pmosc 0; 3 | #X obj 119 199 cos~; 4 | #X obj 119 167 +~; 5 | #X obj 120 273 outlet~; 6 | #X obj 119 115 phasor~; 7 | #X obj 119 86 inlet~; 8 | #X obj 136 146 inlet~; 9 | #X obj 160 199 inlet~; 10 | #X obj 120 236 *~; 11 | #X text 38 21 phase-modulation oscillator; 12 | #X text 38 57 signal inlets: 1: freq \, 2: phase \, 3: amp; 13 | #X connect 0 0 7 0; 14 | #X connect 1 0 0 0; 15 | #X connect 3 0 1 0; 16 | #X connect 4 0 3 0; 17 | #X connect 5 0 1 1; 18 | #X connect 6 0 7 1; 19 | #X connect 7 0 2 0; 20 | #X restore 270 352 pd pmosc; 21 | #N canvas 424 366 478 366 pmosc 0; 22 | #X obj 119 199 cos~; 23 | #X obj 119 167 +~; 24 | #X obj 120 273 outlet~; 25 | #X obj 119 115 phasor~; 26 | #X obj 119 86 inlet~; 27 | #X obj 136 146 inlet~; 28 | #X obj 160 199 inlet~; 29 | #X obj 120 236 *~; 30 | #X text 38 21 phase-modulation oscillator; 31 | #X text 38 57 signal inlets: 1: freq \, 2: phase \, 3: amp; 32 | #X connect 0 0 7 0; 33 | #X connect 1 0 0 0; 34 | #X connect 3 0 1 0; 35 | #X connect 4 0 3 0; 36 | #X connect 5 0 1 1; 37 | #X connect 6 0 7 1; 38 | #X connect 7 0 2 0; 39 | #X restore 245 396 pd pmosc; 40 | #N canvas 424 366 478 366 pmosc 0; 41 | #X obj 119 199 cos~; 42 | #X obj 119 167 +~; 43 | #X obj 120 273 outlet~; 44 | #X obj 119 115 phasor~; 45 | #X obj 119 86 inlet~; 46 | #X obj 136 146 inlet~; 47 | #X obj 160 199 inlet~; 48 | #X obj 120 236 *~; 49 | #X text 38 21 phase-modulation oscillator; 50 | #X text 38 57 signal inlets: 1: freq \, 2: phase \, 3: amp; 51 | #X connect 0 0 7 0; 52 | #X connect 1 0 0 0; 53 | #X connect 3 0 1 0; 54 | #X connect 4 0 3 0; 55 | #X connect 5 0 1 1; 56 | #X connect 6 0 7 1; 57 | #X connect 7 0 2 0; 58 | #X restore 136 354 pd pmosc; 59 | #N canvas 424 366 478 366 pmosc 0; 60 | #X obj 119 199 cos~; 61 | #X obj 119 167 +~; 62 | #X obj 120 273 outlet~; 63 | #X obj 119 115 phasor~; 64 | #X obj 119 86 inlet~; 65 | #X obj 136 146 inlet~; 66 | #X obj 160 199 inlet~; 67 | #X obj 120 236 *~; 68 | #X text 38 21 phase-modulation oscillator; 69 | #X text 38 57 signal inlets: 1: freq \, 2: phase \, 3: amp; 70 | #X connect 0 0 7 0; 71 | #X connect 1 0 0 0; 72 | #X connect 3 0 1 0; 73 | #X connect 4 0 3 0; 74 | #X connect 5 0 1 1; 75 | #X connect 6 0 7 1; 76 | #X connect 7 0 2 0; 77 | #X restore 109 399 pd pmosc; 78 | #X obj 108 219 mtof; 79 | #X obj 107 523 outlet~; 80 | #X obj 397 149 * 0.535887; 81 | #X obj 667 149 * 0.108819; 82 | #X obj 671 281 / 127; 83 | #X obj 397 286 / 127; 84 | #X obj 397 127 / 127; 85 | #X obj 397 172 t a a; 86 | #X obj 397 308 t a a; 87 | #X obj 671 303 t a a; 88 | #X obj 667 169 t a a; 89 | #X obj 667 123 / 127; 90 | #X obj 671 253 r \$0-vel; 91 | #X obj 667 94 r \$0-vel; 92 | #X obj 397 258 r \$0-vel; 93 | #X obj 397 101 r \$0-vel; 94 | #X obj 108 81 unpack 0 0; 95 | #X obj 175 105 s \$0-vel; 96 | #X obj 108 57 inlet; 97 | #X text 691 513 + --> Out; 98 | #X text 644 527 2->1--/; 99 | #X text 525 513 Algorithm 5 is : 4->3--; 100 | #X text 551 471 4-op FM Rhodey piano based on algorithm 5:; 101 | #X text 310 371 op 4; 102 | #X text 277 413 op 3; 103 | #X text 144 417 op 1; 104 | #X text 169 370 op 2; 105 | #X text 791 216 op 4; 106 | #X text 819 324 op 3; 107 | #X text 572 330 op 1; 108 | #X text 573 198 op 2; 109 | #X obj 840 31 inlet; 110 | #X text 102 31 Midi: ; 111 | #X obj 667 197 c_adsr 1 1 1000 0 40; 112 | #X obj 671 330 c_adsr 1 1 250 0 40; 113 | #X obj 397 334 c_adsr 1 1 1500 0 40; 114 | #X obj 397 199 c_adsr 1 1 1500 0 40; 115 | #X obj 108 493 c_xfade f; 116 | #X text 532 570 Clone of the STK Rhodey; 117 | #N canvas 29 43 450 300 vib 0; 118 | #X obj 144 64 inlet~; 119 | #X obj 145 210 outlet~; 120 | #X obj 144 168 +~; 121 | #X obj 200 95 osc~ 0; 122 | #X obj 200 64 inlet; 123 | #X obj 281 65 inlet; 124 | #X obj 199 123 *~ 0; 125 | #X connect 0 0 2 0; 126 | #X connect 2 0 1 0; 127 | #X connect 3 0 6 0; 128 | #X connect 4 0 3 0; 129 | #X connect 5 0 6 1; 130 | #X connect 6 0 2 1; 131 | #X restore 108 278 pd vib; 132 | #X obj 840 103 u_dispatch \$0 tone; 133 | #X obj 840 123 u_dispatch \$0 mod; 134 | #X obj 899 80 u_loader s_rhodey-\$1 \$0; 135 | #X obj 190 493 pack 0 10; 136 | #X obj 190 470 r \$0-tone; 137 | #X obj 840 144 u_dispatch \$0 vib-freq; 138 | #X obj 840 166 u_dispatch \$0 vib-depth; 139 | #X obj 150 220 r \$0-vib-freq; 140 | #X obj 162 243 r \$0-vib-depth; 141 | #X obj 270 326 * 15; 142 | #X obj 136 330 * 0.5; 143 | #X obj 840 186 u_dispatch \$0 adsr24; 144 | #X obj 561 88 r \$0-adsr24; 145 | #X obj 561 112 / 127; 146 | #X obj 666 222 *~ 1; 147 | #X obj 397 221 *~ 1; 148 | #X obj 135 376 *~ 1; 149 | #X obj 182 329 r \$0-mod; 150 | #X obj 275 437 loadbang; 151 | #X msg 275 459 0.5; 152 | #X obj 479 173 r \$0-decay; 153 | #X obj 840 207 u_dispatch \$0 decay; 154 | #X obj 479 301 r \$0-decay; 155 | #N canvas 172 83 586 377 LICENSE-GPL 0; 156 | #X text 57 88 This program is free software: you can redistribute it 157 | and/or modify it under the terms of the GNU General Public License 158 | as published by the Free Software Foundation \, either version 3 of 159 | the License \, or (at your option) any later version.; 160 | #X text 58 168 This program is distributed in the hope that it will 161 | be useful \, but WITHOUT ANY WARRANTY \; without even the implied warranty 162 | of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 163 | General Public License for more details.; 164 | #X text 57 261 You should have received a copy of the GNU General Public 165 | License along with this program. If not \, see . 166 | ; 167 | #X text 61 54 Copyright (C) 2009 \, Reality Jockey Ltd.; 168 | #X text 60 325 See the file LICENSE.txt for the full license text. 169 | ; 170 | #X restore 972 29 pd LICENSE-GPL; 171 | #X connect 0 0 1 1; 172 | #X connect 1 0 41 1; 173 | #X connect 2 0 60 0; 174 | #X connect 3 0 41 0; 175 | #X connect 4 0 43 0; 176 | #X connect 4 0 53 0; 177 | #X connect 4 0 54 0; 178 | #X connect 6 0 11 0; 179 | #X connect 7 0 14 0; 180 | #X connect 8 0 13 0; 181 | #X connect 9 0 12 0; 182 | #X connect 10 0 6 0; 183 | #X connect 11 0 40 0; 184 | #X connect 11 1 40 1; 185 | #X connect 12 0 39 0; 186 | #X connect 12 1 39 1; 187 | #X connect 13 0 38 0; 188 | #X connect 13 1 38 1; 189 | #X connect 14 0 37 0; 190 | #X connect 14 1 37 1; 191 | #X connect 15 0 7 0; 192 | #X connect 16 0 8 0; 193 | #X connect 17 0 15 0; 194 | #X connect 18 0 9 0; 195 | #X connect 19 0 10 0; 196 | #X connect 20 0 4 0; 197 | #X connect 20 1 21 0; 198 | #X connect 22 0 20 0; 199 | #X connect 35 0 44 0; 200 | #X connect 37 0 58 0; 201 | #X connect 38 0 1 2; 202 | #X connect 39 0 3 2; 203 | #X connect 40 0 59 0; 204 | #X connect 41 0 5 0; 205 | #X connect 43 0 3 0; 206 | #X connect 43 0 1 0; 207 | #X connect 44 0 45 0; 208 | #X connect 45 0 49 0; 209 | #X connect 47 0 41 2; 210 | #X connect 48 0 47 0; 211 | #X connect 49 0 50 0; 212 | #X connect 50 0 55 0; 213 | #X connect 51 0 43 1; 214 | #X connect 52 0 43 2; 215 | #X connect 53 0 0 0; 216 | #X connect 54 0 2 0; 217 | #X connect 55 0 65 0; 218 | #X connect 56 0 57 0; 219 | #X connect 57 0 58 1; 220 | #X connect 57 0 59 1; 221 | #X connect 58 0 0 2; 222 | #X connect 59 0 2 2; 223 | #X connect 60 0 3 1; 224 | #X connect 61 0 60 1; 225 | #X connect 62 0 63 0; 226 | #X connect 63 0 47 0; 227 | #X connect 64 0 40 3; 228 | #X connect 66 0 39 3; 229 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/data/patches/u_dispatch.pd: -------------------------------------------------------------------------------- 1 | #N canvas 303 323 759 261 10; 2 | #X obj 131 28 inlet; 3 | #X obj 182 185 outlet; 4 | #X obj 131 122 route \$2; 5 | #X obj 131 155 s \$1-\$2; 6 | #X obj 131 98 list trim; 7 | #X obj 273 121 select help; 8 | #X obj 273 158 list append \$2; 9 | #X obj 273 182 list trim; 10 | #X obj 273 205 print dispatcher; 11 | #X obj 273 94 route symbol; 12 | #X obj 273 70 list; 13 | #X obj 470 104 u_sssad \$2 \$1; 14 | #X obj 470 131 s \$1-\$2; 15 | #X obj 544 73 r \$1-\$2; 16 | #X text 447 73 state saves:; 17 | #N canvas 228 198 627 317 LICENSE-BSD 0; 18 | #X text 121 56 This software is copyrighted by Miller Puckette \, Reality 19 | Jockey Ltd. and others. The terms (the "Standard Improved BSD License") 20 | apply to all files associated with the software unless explicitly disclaimed 21 | in individual files.; 22 | #X text 123 148 See the file LICENSE.txt for the full license text. 23 | ; 24 | #X restore 553 30 pd LICENSE-BSD; 25 | #X connect 0 0 4 0; 26 | #X connect 0 0 10 0; 27 | #X connect 2 0 3 0; 28 | #X connect 2 1 1 0; 29 | #X connect 4 0 2 0; 30 | #X connect 5 0 6 0; 31 | #X connect 6 0 7 0; 32 | #X connect 7 0 8 0; 33 | #X connect 9 0 5 0; 34 | #X connect 10 0 9 0; 35 | #X connect 11 0 12 0; 36 | #X connect 13 0 11 1; 37 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/data/patches/u_loader.pd: -------------------------------------------------------------------------------- 1 | #N canvas 0 0 797 492 10; 2 | #X obj 151 86 route persist; 3 | #X obj 151 117 list prepend \$1; 4 | #X obj 150 196 list trim; 5 | #X obj 150 222 route \$1; 6 | #X msg 150 328 setonly \$1; 7 | #X obj 150 248 t a a; 8 | #X obj 150 306 list; 9 | #X obj 150 174 r RJ_SCENE_LOAD; 10 | #X obj 151 144 s RJ_SCENE; 11 | #X obj 305 98 r RJ_SCENE_SAVE; 12 | #X obj 151 54 r \$2-SSSAD_ADMIN; 13 | #X obj 150 352 s \$2-SSSAD_ADMIN; 14 | #X obj 182 270 s \$2-SSSAD; 15 | #X obj 305 137 s \$2-SSSAD_ADMIN; 16 | #X msg 429 97 save; 17 | #X obj 429 71 inlet; 18 | #X obj 57 131 outlet; 19 | #X text 35 94 Store presets; 20 | #N canvas 228 198 627 317 LICENSE-BSD 0; 21 | #X text 121 56 This software is copyrighted by Miller Puckette \, Reality 22 | Jockey Ltd. and others. The terms (the "Standard Improved BSD License") 23 | apply to all files associated with the software unless explicitly disclaimed 24 | in individual files.; 25 | #X text 123 148 See the file LICENSE.txt for the full license text. 26 | ; 27 | #X restore 523 60 pd LICENSE-BSD; 28 | #X connect 0 0 1 0; 29 | #X connect 0 0 16 0; 30 | #X connect 1 0 8 0; 31 | #X connect 2 0 3 0; 32 | #X connect 3 0 5 0; 33 | #X connect 4 0 11 0; 34 | #X connect 5 0 6 0; 35 | #X connect 5 1 12 0; 36 | #X connect 6 0 4 0; 37 | #X connect 7 0 2 0; 38 | #X connect 9 0 13 0; 39 | #X connect 10 0 0 0; 40 | #X connect 14 0 13 0; 41 | #X connect 15 0 14 0; 42 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/data/patches/u_sssad.pd: -------------------------------------------------------------------------------- 1 | #N canvas 144 48 1039 564 10; 2 | #X obj 159 26 inlet; 3 | #X obj 233 55 list prepend \$1; 4 | #X obj 233 160 list trim; 5 | #X obj 233 25 inlet; 6 | #X obj 22 308 b; 7 | #X obj 159 53 b; 8 | #X obj 233 223 route \$1; 9 | #X obj 543 358 b; 10 | #X obj 543 250 spigot; 11 | #X obj 669 72 loadbang; 12 | #X obj 669 250 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 13 | 1; 14 | #X obj 669 194 select 0; 15 | #X obj 701 141 + 1; 16 | #X obj 669 120 t a a; 17 | #X obj 669 216 f 1; 18 | #X obj 226 476 outlet; 19 | #X obj 159 450 route bang; 20 | #X text 243 449 filter out empty lists; 21 | #X obj 610 474 list prepend persist \$1; 22 | #X obj 159 421 list append; 23 | #X text 231 110 on SSSAD we eavesdrop the communication; 24 | #X text 692 249 <- only the first instance responds to "save"; 25 | #X text 165 540 2007/2008 fbar; 26 | #X text 829 95 Enhancement by Enrique Erne; 27 | #X obj 543 425 list append; 28 | #X obj 543 448 route bang; 29 | #X text 627 447 filter out empty lists here \, too.; 30 | #X obj 22 226 route set setonly; 31 | #X obj 80 273 route \$1; 32 | #X obj 80 251 list trim; 33 | #X obj 608 324 route \$1; 34 | #X obj 608 302 list trim; 35 | #X obj 543 277 route save saveonly; 36 | #X obj 610 498 list trim; 37 | #N canvas 513 284 322 286 s-SSSAD 0; 38 | #X obj 63 38 inlet; 39 | #X obj 63 176 s SSSAD; 40 | #X obj 123 176 s \$2-SSSAD; 41 | #X obj 123 39 loadbang; 42 | #N canvas 0 0 450 300 demux2 0; 43 | #X obj 114 91 == 0; 44 | #X obj 190 115 spigot; 45 | #X obj 61 43 inlet; 46 | #X obj 229 46 inlet; 47 | #X obj 61 113 spigot 1; 48 | #X obj 61 156 outlet; 49 | #X obj 190 157 outlet; 50 | #X connect 0 0 4 1; 51 | #X connect 1 0 6 0; 52 | #X connect 2 0 4 0; 53 | #X connect 2 0 1 0; 54 | #X connect 3 0 0 0; 55 | #X connect 3 0 1 1; 56 | #X connect 4 0 5 0; 57 | #X restore 63 137 pd demux2; 58 | #X obj 123 81 select 0; 59 | #X msg 123 103 0; 60 | #X msg 176 102 1; 61 | #X obj 123 59 list append \$2; 62 | #X obj 123 39 loadbang; 63 | #X obj 123 81 select 0; 64 | #X msg 123 103 0; 65 | #X msg 176 102 1; 66 | #X obj 123 59 list append \$2; 67 | #X connect 0 0 4 0; 68 | #X connect 3 0 8 0; 69 | #X connect 4 0 1 0; 70 | #X connect 4 1 2 0; 71 | #X connect 5 0 6 0; 72 | #X connect 5 1 7 0; 73 | #X connect 6 0 4 1; 74 | #X connect 7 0 4 1; 75 | #X connect 8 0 5 0; 76 | #X connect 9 0 13 0; 77 | #X connect 10 0 11 0; 78 | #X connect 10 1 12 0; 79 | #X connect 13 0 10 0; 80 | #X restore 233 84 pd s-SSSAD; 81 | #N canvas 539 183 330 246 r-SSSAD 0; 82 | #N canvas 0 0 450 300 mux2 0; 83 | #X obj 114 121 == 0; 84 | #X obj 190 145 spigot; 85 | #X obj 61 43 inlet; 86 | #X obj 229 66 inlet; 87 | #X obj 61 143 spigot 1; 88 | #X obj 61 186 outlet; 89 | #X obj 190 45 inlet; 90 | #X connect 0 0 4 1; 91 | #X connect 1 0 5 0; 92 | #X connect 2 0 4 0; 93 | #X connect 3 0 0 0; 94 | #X connect 3 0 1 1; 95 | #X connect 4 0 5 0; 96 | #X connect 6 0 1 0; 97 | #X restore 63 167 pd mux2; 98 | #X obj 63 16 r SSSAD; 99 | #X obj 86 41 r \$2-SSSAD; 100 | #X obj 63 201 outlet; 101 | #X obj 109 74 loadbang; 102 | #X obj 109 116 select 0; 103 | #X msg 109 138 0; 104 | #X msg 162 137 1; 105 | #X obj 109 94 list append \$2; 106 | #X connect 0 0 3 0; 107 | #X connect 1 0 0 0; 108 | #X connect 2 0 0 1; 109 | #X connect 4 0 8 0; 110 | #X connect 5 0 6 0; 111 | #X connect 5 1 7 0; 112 | #X connect 6 0 0 2; 113 | #X connect 7 0 0 2; 114 | #X connect 8 0 5 0; 115 | #X restore 233 136 pd r-SSSAD; 116 | #N canvas 539 183 330 246 r-SSSAD_ADMIN 0; 117 | #N canvas 0 0 450 300 mux2 0; 118 | #X obj 114 121 == 0; 119 | #X obj 190 145 spigot; 120 | #X obj 61 43 inlet; 121 | #X obj 229 66 inlet; 122 | #X obj 61 143 spigot 1; 123 | #X obj 61 186 outlet; 124 | #X obj 190 45 inlet; 125 | #X connect 0 0 4 1; 126 | #X connect 1 0 5 0; 127 | #X connect 2 0 4 0; 128 | #X connect 3 0 0 0; 129 | #X connect 3 0 1 1; 130 | #X connect 4 0 5 0; 131 | #X connect 6 0 1 0; 132 | #X restore 63 177 pd mux2; 133 | #X obj 63 211 outlet; 134 | #X obj 63 16 r SSSAD_ADMIN; 135 | #X obj 86 41 r \$2-SSSAD_ADMIN; 136 | #X obj 109 75 loadbang; 137 | #X obj 109 117 select 0; 138 | #X msg 109 139 0; 139 | #X msg 162 138 1; 140 | #X obj 109 95 list append \$2; 141 | #X connect 0 0 1 0; 142 | #X connect 2 0 0 0; 143 | #X connect 3 0 0 1; 144 | #X connect 4 0 8 0; 145 | #X connect 5 0 6 0; 146 | #X connect 5 1 7 0; 147 | #X connect 6 0 0 2; 148 | #X connect 7 0 0 2; 149 | #X connect 8 0 5 0; 150 | #X restore 543 190 pd r-SSSAD_ADMIN; 151 | #N canvas 513 284 322 286 s-SSSAD_ADMIN 0; 152 | #X obj 63 39 inlet; 153 | #N canvas 0 0 450 300 demux2 0; 154 | #X obj 114 91 == 0; 155 | #X obj 190 115 spigot; 156 | #X obj 61 43 inlet; 157 | #X obj 229 46 inlet; 158 | #X obj 61 113 spigot 1; 159 | #X obj 61 156 outlet; 160 | #X obj 190 157 outlet; 161 | #X connect 0 0 4 1; 162 | #X connect 1 0 6 0; 163 | #X connect 2 0 4 0; 164 | #X connect 2 0 1 0; 165 | #X connect 3 0 0 0; 166 | #X connect 3 0 1 1; 167 | #X connect 4 0 5 0; 168 | #X restore 63 137 pd demux2; 169 | #X obj 63 206 s SSSAD_ADMIN; 170 | #X obj 123 176 s \$2-SSSAD_ADMIN; 171 | #X obj 123 39 loadbang; 172 | #X obj 123 81 select 0; 173 | #X msg 123 103 0; 174 | #X msg 176 102 1; 175 | #X obj 123 59 list append \$2; 176 | #X connect 0 0 1 0; 177 | #X connect 1 0 2 0; 178 | #X connect 1 1 3 0; 179 | #X connect 4 0 8 0; 180 | #X connect 5 0 6 0; 181 | #X connect 5 1 7 0; 182 | #X connect 6 0 1 1; 183 | #X connect 7 0 1 1; 184 | #X connect 8 0 5 0; 185 | #X restore 610 522 pd s-SSSAD_ADMIN; 186 | #X obj 669 95 value \$1.\$2.SSSAD.req; 187 | #X obj 701 164 value \$1.\$2.SSSAD.req; 188 | #N canvas 539 183 330 246 r-SSSAD_ADMIN 0; 189 | #N canvas 0 0 450 300 mux2 0; 190 | #X obj 114 121 == 0; 191 | #X obj 190 145 spigot; 192 | #X obj 61 43 inlet; 193 | #X obj 229 66 inlet; 194 | #X obj 61 143 spigot 1; 195 | #X obj 61 186 outlet; 196 | #X obj 190 45 inlet; 197 | #X connect 0 0 4 1; 198 | #X connect 1 0 5 0; 199 | #X connect 2 0 4 0; 200 | #X connect 3 0 0 0; 201 | #X connect 3 0 1 1; 202 | #X connect 4 0 5 0; 203 | #X connect 6 0 1 0; 204 | #X restore 63 177 pd mux2; 205 | #X obj 63 211 outlet; 206 | #X obj 63 16 r SSSAD_ADMIN; 207 | #X obj 86 41 r \$2-SSSAD_ADMIN; 208 | #X obj 109 75 loadbang; 209 | #X obj 109 117 select 0; 210 | #X msg 109 139 0; 211 | #X msg 162 138 1; 212 | #X obj 109 95 list append \$2; 213 | #X connect 0 0 1 0; 214 | #X connect 2 0 0 0; 215 | #X connect 3 0 0 1; 216 | #X connect 4 0 8 0; 217 | #X connect 5 0 6 0; 218 | #X connect 5 1 7 0; 219 | #X connect 6 0 0 2; 220 | #X connect 7 0 0 2; 221 | #X connect 8 0 5 0; 222 | #X restore 22 187 pd r-SSSAD_ADMIN; 223 | #N canvas 228 198 627 317 LICENSE-BSD 0; 224 | #X text 121 56 This software is copyrighted by Miller Puckette \, Reality 225 | Jockey Ltd. and others. The terms (the "Standard Improved BSD License") 226 | apply to all files associated with the software unless explicitly disclaimed 227 | in individual files.; 228 | #X text 123 148 See the file LICENSE.txt for the full license text. 229 | ; 230 | #X restore 833 30 pd LICENSE-BSD; 231 | #X connect 0 0 5 0; 232 | #X connect 1 0 34 0; 233 | #X connect 2 0 6 0; 234 | #X connect 3 0 1 0; 235 | #X connect 4 0 19 0; 236 | #X connect 5 0 19 0; 237 | #X connect 6 0 19 1; 238 | #X connect 6 0 24 1; 239 | #X connect 7 0 24 0; 240 | #X connect 8 0 32 0; 241 | #X connect 9 0 38 0; 242 | #X connect 11 0 14 0; 243 | #X connect 12 0 39 0; 244 | #X connect 13 0 11 0; 245 | #X connect 13 1 12 0; 246 | #X connect 14 0 8 1; 247 | #X connect 14 0 10 0; 248 | #X connect 16 1 15 0; 249 | #X connect 18 0 33 0; 250 | #X connect 19 0 16 0; 251 | #X connect 24 0 25 0; 252 | #X connect 25 1 18 0; 253 | #X connect 27 0 4 0; 254 | #X connect 27 1 29 0; 255 | #X connect 28 0 4 0; 256 | #X connect 29 0 28 0; 257 | #X connect 30 0 7 0; 258 | #X connect 31 0 30 0; 259 | #X connect 32 0 7 0; 260 | #X connect 32 1 31 0; 261 | #X connect 33 0 37 0; 262 | #X connect 35 0 2 0; 263 | #X connect 36 0 8 0; 264 | #X connect 38 0 13 0; 265 | #X connect 40 0 27 0; 266 | -------------------------------------------------------------------------------- /S10_GenerativeMusic/sketch.properties: -------------------------------------------------------------------------------- 1 | mode.id=processing.mode.java.JavaMode 2 | mode=Java 3 | -------------------------------------------------------------------------------- /S11_VisualMusic/Particle.pde: -------------------------------------------------------------------------------- 1 | // a moving element, that is controlled by forces 2 | // when an element reaches the edge of the area, it tells pd to play 3 | // a sound. the pitch of the sound depends on the index of the element. 4 | // the index also defines color & size for visual clarity 5 | 6 | class Particle { 7 | PVector vel; 8 | int eSize; 9 | PVector loc; 10 | int id; 11 | int counter; 12 | 13 | Particle(int _id) { 14 | id = _id; 15 | counter = 0; 16 | loc = new PVector( random(diameter)-radius, random(diameter)-radius ); 17 | loc.limit( radius - 50 ); 18 | vel = new PVector( random( -1, 1 ), random( -1, 1 ) ); 19 | } 20 | 21 | void update() { 22 | loc.add(vel); 23 | PVector v = new PVector( loc.x, loc.y ); 24 | if( dist( v.x, v.y, origin.x, origin.y ) > radius - eSize ) { 25 | PVector n = new PVector( loc.x, loc.y ); 26 | 27 | // avoid too often repeats 28 | if(counter>30){ 29 | fill(255); 30 | ellipse(loc.x,loc.y,50,50); 31 | 32 | // start with lower sounds by reversing pitch / id 33 | float pitch = particles.size()-id; 34 | // send a float message to Pd here 35 | pd.sendFloat( "trigger", pitch ); 36 | counter = 0; 37 | } 38 | n.normalize(); 39 | n.mult( 2 * n.dot( vel ) ); 40 | vel.sub( n ); 41 | } 42 | counter++; 43 | } 44 | 45 | void display() { 46 | fill( map( id, 0, particles.size(), 200, 240), 255, 255 ); 47 | ellipse( loc.x, loc.y, eSize + id*2, eSize + id*2 ); 48 | fill( 255 ); 49 | ellipse( loc.x, loc.y, eSize/2 + id, eSize/2 + id ); 50 | } 51 | 52 | void randomDirection() { 53 | vel = new PVector( random( -1, 1 ), random( -1, 1 ) ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /S11_VisualMusic/S11_VisualMusic.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Visual music example. Demonstrating how to play polyphonic sound samples of the same sound 4 | with different pitches. The behaviour of visual elements are triggering the sounds. 5 | 6 | */ 7 | 8 | 9 | import org.puredata.processing.PureData; 10 | PureData pd; 11 | 12 | PVector origin; 13 | int diameter; 14 | int radius; 15 | int NUM = 10; 16 | ArrayList< Particle > particles = new ArrayList< Particle >(); 17 | 18 | void setup() { 19 | size( 800, 600, P3D ); 20 | background(255); 21 | // use hue, saturation & brightness for color parameters 22 | colorMode( HSB ); 23 | noStroke(); 24 | 25 | // setup Pd 26 | pd = new PureData(this, 44100, 0, 2); 27 | pd.openPatch("Main.pd"); 28 | pd.start(); 29 | 30 | // initialize element size 31 | diameter = height - 100; 32 | radius = diameter / 2; 33 | origin = new PVector( 0, 0); 34 | 35 | // add particles to the arraylist 36 | for( int i = 0; i < NUM; i++ ) { 37 | particles.add( new Particle(i) ); 38 | // add initial direction to each particle 39 | particles.get(i).randomDirection(); 40 | } 41 | } 42 | 43 | void draw() { 44 | fill( 140, 255, 100, 10 ); 45 | rect( 0, 0, width, height ); 46 | translate( width / 2, height / 2 ); 47 | fill( 180, 0, 0, 30 ); 48 | ellipse( 0, 0, diameter, diameter ); 49 | 50 | for( Particle p : particles ) { 51 | p.update(); 52 | p.display(); 53 | } 54 | } 55 | 56 | void mousePressed() { 57 | // reset 58 | particles.clear(); 59 | // add particles to the arraylist 60 | for( int i = 0; i < NUM; i++ ) { 61 | particles.add( new Particle(i) ); 62 | // add initial direction to each particle 63 | particles.get(i).randomDirection(); 64 | } 65 | } 66 | 67 | void pdPrint(String s) { 68 | // Handle string s, printed by Pd 69 | println(s); 70 | } 71 | 72 | -------------------------------------------------------------------------------- /S11_VisualMusic/data/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 355 321 907 750 10; 2 | #X obj 199 252 / 10; 3 | #X text 195 454 first argument: < name of soundfile >; 4 | #X text 195 471 second argument: < number of polyphony >; 5 | #X text 196 489 optional third argument: < samplerate >; 6 | #X obj 199 323 pack f f; 7 | #X obj 270 233 + 1; 8 | #X obj 199 232 + 1; 9 | #X obj 270 254 / 30; 10 | #X obj 270 211 random 30; 11 | #X text 269 324 trigger sample 1st el: pitch \, 2nd el: vol; 12 | #X obj 199 155 t f b; 13 | #X obj 201 589 catch~ out; 14 | #X obj 201 624 dac~; 15 | #X obj 199 44 r trigger; 16 | #X text 472 413 <- argument sets number of polyphonic sounds; 17 | #X text 276 42 receiving trigger event from Processing; 18 | #X text 276 62 this value determines the pitch; 19 | #X text 344 211 create random random volume to make it more plastic 20 | ; 21 | #X text 441 489 <- this is useful when designing for mobile devices 22 | ; 23 | #X text 280 590 catch all audio from abstractions inside createPoly 24 | ; 25 | #X obj 199 113 / 2; 26 | #X obj 199 415 patches/createPoly ../piano.wav 20; 27 | #X connect 0 0 4 0; 28 | #X connect 4 0 21 0; 29 | #X connect 5 0 7 0; 30 | #X connect 6 0 0 0; 31 | #X connect 7 0 4 1; 32 | #X connect 8 0 5 0; 33 | #X connect 10 0 6 0; 34 | #X connect 10 1 8 0; 35 | #X connect 11 0 12 0; 36 | #X connect 11 0 12 1; 37 | #X connect 13 0 20 0; 38 | #X connect 20 0 10 0; 39 | -------------------------------------------------------------------------------- /S11_VisualMusic/data/patches/createPoly.pd: -------------------------------------------------------------------------------- 1 | #N canvas 144 22 1243 754 10; 2 | #X obj 106 204 inlet; 3 | #X obj 498 374 myCounter \$2; 4 | #X obj 498 353 until; 5 | #X obj 498 333 f \$2; 6 | #X obj 551 495 symbol \$1; 7 | #X msg 441 287 clear; 8 | #X obj 498 242 t b b; 9 | #X obj 579 416 del 1; 10 | #X obj 579 395 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 11 | -1 -1; 12 | #X obj 106 385 t b f; 13 | #X obj 166 415 f \$2; 14 | #X obj 106 460 mycounter; 15 | #X obj 166 438 - 1; 16 | #X text 182 461 <- switch between sample players; 17 | #X text 190 605 A dynamic \, addressable [send]; 18 | #X text 462 55 Create the samplers; 19 | #X text 507 288 <- clear subpatch first \, then...; 20 | #X text 599 374 create n samplers; 21 | #X text 622 676 <- samplers go here; 22 | #X text 109 30 CREATE POLY; 23 | #X text 106 60 1st argument: < name of soundfile >; 24 | #X text 107 80 2nd argument: < number of polyphony >; 25 | #N canvas 299 66 601 753 \$0-samplePool 0; 26 | #X obj 10 0 playSound ../piano.wav 1122-ID0 1122-vol 1122-init 44100 27 | ; 28 | #X obj 10 40 playSound ../piano.wav 1122-ID1 1122-vol 1122-init 44100 29 | ; 30 | #X obj 10 80 playSound ../piano.wav 1122-ID2 1122-vol 1122-init 44100 31 | ; 32 | #X obj 10 120 playSound ../piano.wav 1122-ID3 1122-vol 1122-init 44100 33 | ; 34 | #X obj 10 160 playSound ../piano.wav 1122-ID4 1122-vol 1122-init 44100 35 | ; 36 | #X obj 10 200 playSound ../piano.wav 1122-ID5 1122-vol 1122-init 44100 37 | ; 38 | #X obj 10 240 playSound ../piano.wav 1122-ID6 1122-vol 1122-init 44100 39 | ; 40 | #X obj 10 280 playSound ../piano.wav 1122-ID7 1122-vol 1122-init 44100 41 | ; 42 | #X obj 10 320 playSound ../piano.wav 1122-ID8 1122-vol 1122-init 44100 43 | ; 44 | #X obj 10 360 playSound ../piano.wav 1122-ID9 1122-vol 1122-init 44100 45 | ; 46 | #X obj 10 400 playSound ../piano.wav 1122-ID10 1122-vol 1122-init 44100 47 | ; 48 | #X obj 10 440 playSound ../piano.wav 1122-ID11 1122-vol 1122-init 44100 49 | ; 50 | #X obj 10 480 playSound ../piano.wav 1122-ID12 1122-vol 1122-init 44100 51 | ; 52 | #X obj 10 520 playSound ../piano.wav 1122-ID13 1122-vol 1122-init 44100 53 | ; 54 | #X obj 10 560 playSound ../piano.wav 1122-ID14 1122-vol 1122-init 44100 55 | ; 56 | #X obj 10 600 playSound ../piano.wav 1122-ID15 1122-vol 1122-init 44100 57 | ; 58 | #X obj 10 640 playSound ../piano.wav 1122-ID16 1122-vol 1122-init 44100 59 | ; 60 | #X obj 10 680 playSound ../piano.wav 1122-ID17 1122-vol 1122-init 44100 61 | ; 62 | #X obj 10 720 playSound ../piano.wav 1122-ID18 1122-vol 1122-init 44100 63 | ; 64 | #X obj 10 760 playSound ../piano.wav 1122-ID19 1122-vol 1122-init 44100 65 | ; 66 | #X restore 498 674 pd \$0-samplePool; 67 | #X obj 498 629 s pd-\$0-samplePool; 68 | #X obj 106 488 makefilename \$0-ID%d; 69 | #X obj 891 145 inlet; 70 | #X obj 891 383 s~ \$0-vol; 71 | #X obj 891 361 line~; 72 | #X msg 901 338 1 5; 73 | #X obj 624 495 makefilename \$0-ID%d; 74 | #X obj 772 495 makefilename \$0-vol; 75 | #X obj 916 495 makefilename \$0-init; 76 | #X obj 579 438 s \$0-init; 77 | #X msg 498 594 obj 10 \$1 playSound \$2 \$3 \$4 \$5 \$6; 78 | #X obj 498 569 pack f s s s s f; 79 | #X obj 498 460 t f b f f f f; 80 | #X obj 901 317 loadbang; 81 | #X obj 498 79 loadbang; 82 | #X obj 166 394 loadbang; 83 | #X obj 530 120 f \$3; 84 | #X obj 498 99 t b b; 85 | #X obj 530 140 > 0; 86 | #X obj 530 159 s \$0-samplerate; 87 | #X obj 1115 472 r \$0-samplerate; 88 | #N canvas 412 349 672 402 samplerate-switch 0; 89 | #X obj 91 61 inlet; 90 | #X obj 410 60 inlet; 91 | #X obj 109 351 outlet; 92 | #X obj 109 187 spigot; 93 | #X text 148 62 trigger; 94 | #X text 464 81 check if 3rd argument exist; 95 | #X obj 213 187 spigot; 96 | #X obj 109 246 f 44100; 97 | #X text 176 248 <- original samplerate \, if no 3rd argument given 98 | ; 99 | #X obj 109 224 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 100 | -1 -1; 101 | #X obj 213 296 f \$3; 102 | #X text 264 298 <- desired samplerate if 3rd argument is given; 103 | #X obj 213 275 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 104 | -1 -1; 105 | #X text 462 101 (aka > 0); 106 | #X msg 344 149 1; 107 | #X msg 376 149 0; 108 | #X obj 276 125 t b b; 109 | #X obj 410 85 sel 1; 110 | #X msg 308 150 1; 111 | #X msg 276 150 0; 112 | #X obj 344 125 t b b; 113 | #X connect 0 0 3 0; 114 | #X connect 0 0 6 0; 115 | #X connect 1 0 17 0; 116 | #X connect 3 0 9 0; 117 | #X connect 6 0 12 0; 118 | #X connect 7 0 2 0; 119 | #X connect 9 0 7 0; 120 | #X connect 10 0 2 0; 121 | #X connect 12 0 10 0; 122 | #X connect 14 0 3 1; 123 | #X connect 15 0 6 1; 124 | #X connect 16 0 18 0; 125 | #X connect 16 1 19 0; 126 | #X connect 17 0 16 0; 127 | #X connect 17 1 20 0; 128 | #X connect 18 0 6 1; 129 | #X connect 19 0 3 1; 130 | #X connect 20 0 14 0; 131 | #X connect 20 1 15 0; 132 | #X restore 1066 495 pd samplerate-switch; 133 | #X obj 498 496 * 40; 134 | #X obj 106 308 unpack f f; 135 | #X text 107 152 2nd inlet: overall volume < float >; 136 | #X text 107 132 1st inlet: pitch & volume < list >; 137 | #X text 161 204 trigger sound (list); 138 | #X text 161 222 1st element: pitch; 139 | #X text 160 241 2nd element: volume; 140 | #X obj 106 560 pack s f f; 141 | #X text 856 116 Set Overall Volume ( 0-1 ); 142 | #X msg 106 593 \; \$1 \$2 \$3; 143 | #X text 106 100 3rd argument: < samplerate > (optional); 144 | #X connect 0 0 46 0; 145 | #X connect 1 0 35 0; 146 | #X connect 1 1 8 0; 147 | #X connect 2 0 1 0; 148 | #X connect 3 0 2 0; 149 | #X connect 4 0 34 1; 150 | #X connect 5 0 23 0; 151 | #X connect 6 0 3 0; 152 | #X connect 6 1 5 0; 153 | #X connect 7 0 32 0; 154 | #X connect 8 0 7 0; 155 | #X connect 9 0 11 0; 156 | #X connect 9 1 52 1; 157 | #X connect 10 0 12 0; 158 | #X connect 11 0 24 0; 159 | #X connect 12 0 11 1; 160 | #X connect 24 0 52 0; 161 | #X connect 25 0 27 0; 162 | #X connect 27 0 26 0; 163 | #X connect 28 0 27 0; 164 | #X connect 29 0 34 2; 165 | #X connect 30 0 34 3; 166 | #X connect 31 0 34 4; 167 | #X connect 33 0 23 0; 168 | #X connect 34 0 33 0; 169 | #X connect 35 0 45 0; 170 | #X connect 35 1 4 0; 171 | #X connect 35 2 29 0; 172 | #X connect 35 3 30 0; 173 | #X connect 35 4 31 0; 174 | #X connect 35 5 44 0; 175 | #X connect 36 0 28 0; 176 | #X connect 37 0 40 0; 177 | #X connect 38 0 10 0; 178 | #X connect 39 0 41 0; 179 | #X connect 40 0 6 0; 180 | #X connect 40 1 39 0; 181 | #X connect 41 0 42 0; 182 | #X connect 43 0 44 1; 183 | #X connect 44 0 34 5; 184 | #X connect 45 0 34 0; 185 | #X connect 46 0 9 0; 186 | #X connect 46 1 52 2; 187 | #X connect 52 0 54 0; 188 | -------------------------------------------------------------------------------- /S11_VisualMusic/data/patches/mycounter.pd: -------------------------------------------------------------------------------- 1 | #N canvas 474 228 598 307 10; 2 | #X obj 172 118 int; 3 | #X obj 172 154 + 1; 4 | #X obj 172 201 sel 1; 5 | #X obj 203 96 loadbang; 6 | #X obj 172 66 inlet; 7 | #X obj 209 201 outlet; 8 | #X msg 203 118 0; 9 | #X obj 172 178 > \$1; 10 | #X obj 334 202 outlet; 11 | #X text 331 162 outlet to reset metro; 12 | #X text 331 180 (count once); 13 | #X obj 376 63 inlet; 14 | #X connect 0 0 1 0; 15 | #X connect 0 0 5 0; 16 | #X connect 1 0 0 1; 17 | #X connect 1 0 7 0; 18 | #X connect 2 0 6 0; 19 | #X connect 3 0 6 0; 20 | #X connect 4 0 0 0; 21 | #X connect 6 0 0 1; 22 | #X connect 6 0 8 0; 23 | #X connect 7 0 2 0; 24 | #X connect 11 0 7 1; 25 | -------------------------------------------------------------------------------- /S11_VisualMusic/data/patches/playSound.pd: -------------------------------------------------------------------------------- 1 | #N canvas 228 22 1106 782 10; 2 | #X obj 101 388 soundfiler; 3 | #X obj 524 351 phasor~ 0.33; 4 | #X obj 524 476 *~; 5 | #X floatatom 524 325 5 0 0 0 - - -; 6 | #X msg 101 359 read -resize \$1 \$2; 7 | #X obj 101 337 pack s s; 8 | #X obj 177 185 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 9 | -1 -1; 10 | #X obj 145 119 loadbang; 11 | #X obj 538 161 inlet; 12 | #X obj 524 303 *; 13 | #X msg 891 214 0; 14 | #X obj 891 178 inlet; 15 | #X text 889 152 reset; 16 | #X text 614 67 adjust speed; 17 | #X text 655 572 store our sample; 18 | #X text 100 469 synch phasor~ to sample length; 19 | #X obj 524 735 outlet~; 20 | #X obj 177 205 f \$0; 21 | #X obj 524 547 tabread4~ \$0-loop; 22 | #X obj 551 570 table \$0-loop; 23 | #X obj 523 67 r \$0-length; 24 | #X obj 542 380 r \$0-length; 25 | #X obj 101 442 s \$0-length; 26 | #X obj 491 92 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 27 | -1; 28 | #X obj 188 420 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 29 | -1 -1; 30 | #X text 205 418 send to init speed; 31 | #X obj 188 442 s setSpeed; 32 | #X obj 177 226 makefilename %d-loop; 33 | #X obj 177 251 symbol; 34 | #X text 220 206 make local buffer; 35 | #X obj 101 206 symbol \$1; 36 | #X obj 145 143 t b b; 37 | #X obj 607 440 snapshot~; 38 | #X obj 621 421 metro 1; 39 | #X obj 621 402 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 40 | 1; 41 | #X obj 607 462 >= 0.99; 42 | #X obj 607 482 sel 1; 43 | #X msg 607 504 0; 44 | #X obj 607 524 s \$0-stop; 45 | #X obj 421 186 r \$0-stop; 46 | #X obj 628 380 loadbang; 47 | #X msg 491 186 1; 48 | #X obj 934 178 r \$0-stop; 49 | #X obj 538 184 t f b; 50 | #X obj 447 735 throw~ out; 51 | #X obj 566 103 r \$2; 52 | #X text 604 104 receive trigger from outside (based on creation argument) 53 | ; 54 | #X text 378 31 The Sampler ( to be multiplied as many times as needed 55 | ); 56 | #X text 685 526 <- avoid looping; 57 | #X obj 524 702 *~; 58 | #X obj 542 681 r~ \$3; 59 | #X obj 213 119 r \$4; 60 | #X obj 692 380 r \$4; 61 | #X obj 572 210 / \$5; 62 | #X text 609 210 (sampling rate \, 5th argument); 63 | #X obj 524 660 *~; 64 | #X obj 566 126 unpack f f; 65 | #X obj 567 590 r \$2; 66 | #X obj 567 613 unpack f f; 67 | #X obj 542 639 line~; 68 | #X text 590 681 set overall volume (applied for all samplers); 69 | #X text 605 592 set actual sample volume; 70 | #X msg 585 639 \$1 1; 71 | #X obj 572 273 /; 72 | #X msg 572 251 1; 73 | #X obj 572 231 t b f; 74 | #X connect 0 0 22 0; 75 | #X connect 0 0 24 0; 76 | #X connect 1 0 2 0; 77 | #X connect 1 0 32 0; 78 | #X connect 2 0 18 0; 79 | #X connect 3 0 1 0; 80 | #X connect 4 0 0 0; 81 | #X connect 5 0 4 0; 82 | #X connect 6 0 17 0; 83 | #X connect 7 0 31 0; 84 | #X connect 8 0 43 0; 85 | #X connect 9 0 3 0; 86 | #X connect 10 0 1 1; 87 | #X connect 11 0 10 0; 88 | #X connect 17 0 27 0; 89 | #X connect 18 0 55 0; 90 | #X connect 20 0 23 0; 91 | #X connect 20 0 53 0; 92 | #X connect 21 0 2 1; 93 | #X connect 23 0 41 0; 94 | #X connect 24 0 26 0; 95 | #X connect 27 0 28 0; 96 | #X connect 28 0 5 1; 97 | #X connect 30 0 5 0; 98 | #X connect 31 0 30 0; 99 | #X connect 31 1 6 0; 100 | #X connect 32 0 35 0; 101 | #X connect 33 0 32 0; 102 | #X connect 34 0 33 0; 103 | #X connect 35 0 36 0; 104 | #X connect 36 0 37 0; 105 | #X connect 37 0 38 0; 106 | #X connect 39 0 9 0; 107 | #X connect 40 0 34 0; 108 | #X connect 41 0 9 0; 109 | #X connect 42 0 10 0; 110 | #X connect 43 0 9 0; 111 | #X connect 43 1 10 0; 112 | #X connect 45 0 56 0; 113 | #X connect 49 0 16 0; 114 | #X connect 49 0 44 0; 115 | #X connect 50 0 49 1; 116 | #X connect 51 0 31 0; 117 | #X connect 52 0 34 0; 118 | #X connect 53 0 65 0; 119 | #X connect 55 0 49 0; 120 | #X connect 56 0 43 0; 121 | #X connect 57 0 58 0; 122 | #X connect 58 1 62 0; 123 | #X connect 59 0 55 1; 124 | #X connect 62 0 59 0; 125 | #X connect 63 0 9 1; 126 | #X connect 64 0 63 0; 127 | #X connect 65 0 64 0; 128 | #X connect 65 1 63 1; 129 | -------------------------------------------------------------------------------- /S11_VisualMusic/data/piano.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S11_VisualMusic/data/piano.wav -------------------------------------------------------------------------------- /S11_VisualMusic/sketch.properties: -------------------------------------------------------------------------------- 1 | mode.id=processing.mode.java.JavaMode 2 | mode=Java 3 | -------------------------------------------------------------------------------- /S12_GranularField/S12_GranularField.pde: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Granular Field: A 32 channel granular synthesis engine with custom controls. This technique is about 4 | taking apart an existing sound sample into small grains that remain individually controllable fragments. 5 | Useful for creating sound textures, sound design, rythmic patterns. 6 | 7 | */ 8 | 9 | 10 | import org.puredata.processing.PureData; 11 | PureData pd; 12 | 13 | // variables for display soundwave 14 | float[] soundWave; 15 | PGraphics soundWaveGfx; 16 | int soundLength; 17 | int vDivide; 18 | 19 | // variables for controllers 20 | int playPos; 21 | int poly, ppoly; 22 | 23 | // UI 24 | Slider sliderDensity, sliderRandomness, sliderVoices, sliderLength; 25 | 26 | void setup() { 27 | size( 800, 600, P3D ); 28 | vDivide = height / 2 + height / 4; 29 | background(255); 30 | 31 | // setup Pd //<>// 32 | pd = new PureData(this, 44100, 0, 2); 33 | pd.openPatch("Main.pd"); 34 | pd.start(); 35 | 36 | // we draw the soundwave only once, into a PGraphics image buffer 37 | soundWaveGfx = createGraphics(width, vDivide); 38 | soundLength = pd.arraySize( "P5-buffer"); 39 | soundWave = new float[ soundLength ]; 40 | pd.readArray( soundWave, 0, "P5-buffer", 0, soundLength ); 41 | soundWaveGfx.beginDraw(); 42 | soundWaveGfx.background(220); 43 | soundWaveGfx.stroke(0); 44 | for( int i = 0; i < soundLength; i++ ) { 45 | int xp = int( i / (float)soundLength * width ); 46 | soundWaveGfx.line( xp, height / 2.5, xp, height / 2.5 + soundWave[ i ] * 100 ); 47 | } 48 | soundWaveGfx.endDraw(); //<>// 49 | 50 | // setup sliders 51 | sliderDensity = new Slider( 10, height - 100, 100, 10, 2, "DENSITY" ); 52 | sliderRandomness = new Slider( 10, height - 80, 100, 10, 2, "RANDOMNESS" ); 53 | sliderVoices = new Slider( 200, height - 100, 100, 10, 2, "VOICES" ); 54 | sliderLength = new Slider( 200, height - 80, 100, 10, 2, "LENGTH" ); 55 | } 56 | 57 | void draw() { 58 | background(255); 59 | image( soundWaveGfx, 0, 0 ); 60 | fill(255,0,0,50); 61 | float rndOffset = sliderRandomness.getPos(); 62 | rect(playPos -rndOffset * 100, 0, rndOffset * 200, vDivide); 63 | fill(255,0,0); 64 | rect( playPos, 0, 2, vDivide); 65 | 66 | // handle sliders 67 | sliderDensity.update(); 68 | sliderDensity.display(); 69 | sliderRandomness.update(); 70 | sliderRandomness.display(); 71 | sliderVoices.update(); 72 | sliderVoices.display(); 73 | sliderLength.update(); 74 | sliderLength.display(); 75 | 76 | // send slider values to pd engine 77 | pd.sendFloat( "P5-density", sliderDensity.getPos() * 1000 ); 78 | pd.sendFloat( "P5-randomize", sliderRandomness.getPos() ); 79 | poly = (int)( sliderVoices.getPos() * 32 - 5); 80 | if(poly!=ppoly)pd.sendFloat( "P5-voices", poly ); 81 | ppoly = poly; 82 | pd.sendFloat( "P5-length", sliderLength.getPos() / 10 ); 83 | } 84 | 85 | void mousePressed() { 86 | } 87 | 88 | void mouseDragged() { 89 | if(mouseY < vDivide ) { 90 | playPos = mouseX; 91 | pd.sendFloat( "P5-pos", mouseX / (float)width ); 92 | } 93 | } 94 | 95 | void pdPrint(String s) { 96 | // Handle string s, printed by Pd //<>// 97 | println(s); 98 | } -------------------------------------------------------------------------------- /S12_GranularField/Slider.pde: -------------------------------------------------------------------------------- 1 | // a simple slider class, modified 2 | // from Processing's built-in examples 3 | // added text label for better UI 4 | // experience 5 | 6 | class Slider { 7 | int swidth, sheight; // width and height of bar 8 | float xpos, ypos; // x and y position of bar 9 | float spos, newspos; // x position of slider 10 | float sposMin, sposMax; // max and min values of slider 11 | int loose; // how loose/heavy 12 | boolean over; // is the mouse over the slider? 13 | boolean locked; 14 | float ratio; 15 | String label; 16 | 17 | Slider (float xp, float yp, int sw, int sh, int l, String lbl) { 18 | swidth = sw; 19 | sheight = sh; 20 | int widthtoheight = sw - sh; 21 | ratio = (float)sw / (float)widthtoheight; 22 | xpos = xp; 23 | ypos = yp-sheight/2; 24 | spos = xpos + swidth/2 - sheight/2; 25 | newspos = spos; 26 | sposMin = xpos; 27 | sposMax = xpos + swidth - sheight; 28 | loose = l; 29 | label = lbl; 30 | } 31 | 32 | void update() { 33 | if (overEvent()) { 34 | over = true; 35 | } else { 36 | over = false; 37 | } 38 | if (mousePressed && over) { 39 | locked = true; 40 | } 41 | if (!mousePressed) { 42 | locked = false; 43 | } 44 | if (locked) { 45 | newspos = constrain(mouseX-sheight/2, sposMin, sposMax); 46 | } 47 | if (abs(newspos - spos) > 1) { 48 | spos = spos + (newspos-spos)/loose; 49 | } 50 | } 51 | 52 | float constrain(float val, float minv, float maxv) { 53 | return min(max(val, minv), maxv); 54 | } 55 | 56 | boolean overEvent() { 57 | if (mouseX > xpos && mouseX < xpos+swidth && 58 | mouseY > ypos && mouseY < ypos+sheight) { 59 | return true; 60 | } else { 61 | return false; 62 | } 63 | } 64 | 65 | void display() { 66 | noStroke(); 67 | fill(204); 68 | rect(xpos, ypos, swidth, sheight); 69 | if (over || locked) { 70 | fill(0, 0, 0); 71 | } else { 72 | fill(102, 102, 102); 73 | } 74 | rect(spos, ypos, sheight, sheight); 75 | fill(0); 76 | textSize( 9 ); 77 | text(label, xpos + swidth + 10, ypos + 8); 78 | } 79 | 80 | float getPos() { 81 | float result = floor(( (spos * ratio - sheight / 2) - xpos ) / swidth * 100) * 0.01; 82 | 83 | return result; 84 | } 85 | } -------------------------------------------------------------------------------- /S12_GranularField/data/Main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 63 130 1061 787 10; 2 | #X obj 720 223 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 3 | 1; 4 | #X msg 720 254 metroON \$1; 5 | #X msg 527 231 metrospeed \$1; 6 | #X obj -124 690 dac~; 7 | #X obj -47 448 bng 15 250 50 0 empty empty Load_a_SoundFile_First 17 8 | 7 0 10 -262144 -1 -1; 9 | #X obj -107 285 sig~; 10 | #X msg 217 224 midipitch \$1; 11 | #X obj -124 657 *~; 12 | #X obj -56 654 *~; 13 | #X floatatom 8 592 5 0 0 0 - - -; 14 | #X msg 360 224 amp \$1; 15 | #X msg 417 224 pan \$1; 16 | #X msg 300 595 posrnd \$1; 17 | #X msg 218 377 hanning; 18 | #X msg 273 377 decay; 19 | #X msg 321 377 attack; 20 | #X msg 379 389 fwd; 21 | #X msg 409 389 rev; 22 | #X msg 531 393 grainvoices \$1; 23 | #X msg 725 392 grainlength \$1; 24 | #X msg 299 224 pitch \$1; 25 | #X msg 382 595 panrnd \$1; 26 | #X msg 458 595 amprnd \$1; 27 | #X obj 725 371 nbx 3 14 0 1 0 1 empty empty empty 0 -8 0 10 -262144 28 | -1 -1 0.02 256; 29 | #X obj 300 574 nbx 3 14 0 1 0 1 empty empty empty 0 -8 0 10 -262144 30 | -1 -1 0.07 256; 31 | #X obj 458 571 nbx 3 14 0 1 0 1 empty empty empty 0 -8 0 10 -262144 32 | -1 -1 0.07 256; 33 | #X obj 382 572 nbx 3 14 0 1 0 1 empty empty empty 0 -8 0 10 -262144 34 | -1 -1 0.07 256; 35 | #X obj 531 372 nbx 3 14 1 32 0 1 empty empty empty 0 -8 0 10 -262144 36 | -1 -1 15 256; 37 | #X obj 417 205 nbx 3 14 -1 1 0 1 empty empty empty 0 -8 0 10 -262144 38 | -1 -1 0.03 256; 39 | #X obj 360 204 nbx 3 14 0 1 0 1 empty empty empty 0 -8 0 10 -262144 40 | -1 -1 1 256; 41 | #X obj 217 205 nbx 3 14 0 127 0 1 empty empty empty 0 -8 0 10 -262144 42 | -1 -1 41 256; 43 | #X obj 527 204 nbx 3 14 1 2000 0 1 empty empty empty 0 -8 0 10 -262144 44 | -1 -1 42 256; 45 | #X obj 720 182 loadbang; 46 | #X msg 720 203 1; 47 | #X obj 299 205 nbx 3 14 -100 100 0 1 empty empty empty 0 -8 0 10 -262144 48 | -1 -1 0 256; 49 | #X obj 49 334 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 50 | 1; 51 | #N canvas 770 93 450 300 switch 1; 52 | #X obj 54 46 inlet~; 53 | #X obj 102 45 inlet~; 54 | #X obj 145 45 inlet; 55 | #X obj 130 100 *~; 56 | #X obj 55 101 *~; 57 | #X obj 145 72 ==; 58 | #X obj 55 136 outlet~; 59 | #X obj 37 37; 60 | #X connect 0 0 4 0; 61 | #X connect 1 0 3 0; 62 | #X connect 2 0 4 1; 63 | #X connect 2 0 5 0; 64 | #X connect 4 0 6 0; 65 | #X connect 5 0 3 1; 66 | #X restore -106 428 pd switch; 67 | #X obj -107 333 lop~ 7; 68 | #X obj 8 537 loadbang; 69 | #X msg 8 567 1; 70 | #X obj 379 414 list prepend direction; 71 | #X obj 378 439 list trim; 72 | #X obj 218 412 list prepend envelope; 73 | #X obj 218 439 list trim; 74 | #X floatatom -107 171 5 0 0 0 - - -; 75 | #X obj -125 501 patches/s_graincloud; 76 | #X obj 378 463 s \$0-graincloud; 77 | #X obj 531 416 s \$0-graincloud; 78 | #X obj 725 418 s \$0-graincloud; 79 | #X obj 368 644 s \$0-graincloud; 80 | #X obj 219 467 s \$0-graincloud; 81 | #X obj 299 285 s \$0-graincloud; 82 | #X obj 527 284 s \$0-graincloud; 83 | #X obj -9 474 r \$0-graincloud; 84 | #X obj 720 282 s \$0-graincloud; 85 | #X obj 49 297 loadbang; 86 | #X obj -61 333 phasor~ 0.2; 87 | #X obj -60 366 *~ 2; 88 | #X obj -106 241 -; 89 | #X msg -107 215 1; 90 | #X obj -106 193 t f b; 91 | #X obj -107 263 + 1; 92 | #X obj -107 307 clip~ 1 2; 93 | #X obj -104 151 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144 94 | -1 -1 0 1; 95 | #X text -108 41 Sonic Instruments Workshop / 2015; 96 | #X text -108 69 Control sample position ( 0 - 1 ) & additional parameters 97 | of granular synthesis; 98 | #X text 69 332 manual postition; 99 | #X obj 527 182 r P5-density; 100 | #X obj -107 121 r P5-pos; 101 | #X obj 531 344 r P5-voices; 102 | #X obj 725 347 r P5-length; 103 | #X floatatom 382 543 5 0 0 0 - - -; 104 | #X obj 382 516 r P5-randomize; 105 | #X text -108 22 Granular Field :: 32 channel granular sequencer; 106 | #X obj 607 467 print; 107 | #X connect 0 0 1 0; 108 | #X connect 1 0 54 0; 109 | #X connect 2 0 52 0; 110 | #X connect 4 0 45 2; 111 | #X connect 5 0 62 0; 112 | #X connect 6 0 51 0; 113 | #X connect 7 0 3 0; 114 | #X connect 8 0 3 1; 115 | #X connect 9 0 7 1; 116 | #X connect 9 0 8 1; 117 | #X connect 10 0 51 0; 118 | #X connect 11 0 51 0; 119 | #X connect 12 0 49 0; 120 | #X connect 13 0 42 0; 121 | #X connect 14 0 42 0; 122 | #X connect 15 0 42 0; 123 | #X connect 16 0 40 0; 124 | #X connect 17 0 40 0; 125 | #X connect 18 0 47 0; 126 | #X connect 18 0 74 0; 127 | #X connect 19 0 48 0; 128 | #X connect 20 0 51 0; 129 | #X connect 21 0 49 0; 130 | #X connect 22 0 49 0; 131 | #X connect 23 0 19 0; 132 | #X connect 24 0 12 0; 133 | #X connect 25 0 22 0; 134 | #X connect 26 0 21 0; 135 | #X connect 27 0 18 0; 136 | #X connect 28 0 11 0; 137 | #X connect 29 0 10 0; 138 | #X connect 30 0 6 0; 139 | #X connect 31 0 2 0; 140 | #X connect 32 0 33 0; 141 | #X connect 33 0 0 0; 142 | #X connect 34 0 20 0; 143 | #X connect 35 0 36 2; 144 | #X connect 36 0 45 1; 145 | #X connect 37 0 36 0; 146 | #X connect 38 0 39 0; 147 | #X connect 39 0 9 0; 148 | #X connect 40 0 41 0; 149 | #X connect 41 0 46 0; 150 | #X connect 42 0 43 0; 151 | #X connect 43 0 50 0; 152 | #X connect 44 0 60 0; 153 | #X connect 45 0 7 0; 154 | #X connect 45 1 8 0; 155 | #X connect 53 0 45 3; 156 | #X connect 55 0 35 0; 157 | #X connect 56 0 57 0; 158 | #X connect 57 0 36 1; 159 | #X connect 58 0 61 0; 160 | #X connect 59 0 58 0; 161 | #X connect 60 0 58 1; 162 | #X connect 60 1 59 0; 163 | #X connect 61 0 5 0; 164 | #X connect 62 0 37 0; 165 | #X connect 63 0 44 0; 166 | #X connect 67 0 31 0; 167 | #X connect 68 0 63 0; 168 | #X connect 69 0 27 0; 169 | #X connect 70 0 23 0; 170 | #X connect 71 0 24 0; 171 | #X connect 71 0 26 0; 172 | #X connect 71 0 25 0; 173 | #X connect 72 0 71 0; 174 | -------------------------------------------------------------------------------- /S12_GranularField/data/bossa.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S12_GranularField/data/bossa.wav -------------------------------------------------------------------------------- /S12_GranularField/data/patches/s_graincloud.pd: -------------------------------------------------------------------------------- 1 | #N canvas 466 116 1227 694 10; 2 | #X msg -525 -7 hanning; 3 | #X msg -468 -7 decay; 4 | #X msg -423 -7 attack; 5 | #X obj -525 39 s \$0-envelope; 6 | #X floatatom -525 61 5 0 1 0 - - -; 7 | #X obj -526 128 s \$0-metrospeed; 8 | #X obj -525 84 s \$0-grainlength; 9 | #X obj -202 -135 bng 15 250 50 0 empty empty Read 17 7 0 10 -262144 10 | -1 -1; 11 | #X obj -525 -77 r \$0-samples; 12 | #X floatatom -525 -28 5 0 0 0 - - -; 13 | #X obj -525 -51 / 44100; 14 | #X obj -524 -100 s \$0-grainvoices; 15 | #X floatatom -524 -121 5 0 32 0 - - -; 16 | #X obj -524 221 s \$0-pan; 17 | #X floatatom -524 195 5 0 1 0 - - -; 18 | #X obj -278 -44 send~ \$0-pos; 19 | #X floatatom -525 245 5 0 0 0 - - -; 20 | #X obj -525 426 catch~ \$0-out_L; 21 | #X obj -426 426 catch~ \$0-out_R; 22 | #N canvas 261 614 381 387 metro 0; 23 | #X obj -340 -8 f; 24 | #X obj -340 15 + 1; 25 | #X obj -340 -38 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 26 | -1 -1; 27 | #X floatatom -340 38 5 0 0 0 - - -; 28 | #X msg -301 -25 0; 29 | #X obj -303 37 sel 6; 30 | #X obj -266 -25 r \$0-grainvoices; 31 | #X obj -266 -1 t b f; 32 | #X obj -340 183 send; 33 | #X obj -340 102 t b f; 34 | #X obj -319 126 pack 0 \$0; 35 | #X msg -319 155 symbol \$2-voice\$1-metro; 36 | #X obj -340 -64 metro; 37 | #X obj -313 -95 r \$0-metrospeed; 38 | #X obj -173 -136 inlet; 39 | #X obj -190 98 outlet; 40 | #X obj -358 -94 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 41 | 1 1; 42 | #X obj -358 -121 r \$0-metroON; 43 | #X obj -187 12 s \$0-metro; 44 | #X connect 0 0 1 0; 45 | #X connect 1 0 0 1; 46 | #X connect 1 0 3 0; 47 | #X connect 2 0 0 0; 48 | #X connect 2 0 18 0; 49 | #X connect 3 0 5 0; 50 | #X connect 3 0 9 0; 51 | #X connect 3 0 15 0; 52 | #X connect 4 0 0 1; 53 | #X connect 5 0 4 0; 54 | #X connect 6 0 7 0; 55 | #X connect 7 0 4 0; 56 | #X connect 7 1 5 1; 57 | #X connect 9 0 8 0; 58 | #X connect 9 1 10 0; 59 | #X connect 10 0 11 0; 60 | #X connect 11 0 8 1; 61 | #X connect 12 0 2 0; 62 | #X connect 13 0 12 1; 63 | #X connect 14 0 2 0; 64 | #X connect 16 0 12 0; 65 | #X connect 17 0 16 0; 66 | #X restore -405 -110 pd metro; 67 | #X obj -405 83 s \$0-panrnd; 68 | #X obj -257 83 s \$0-amprnd; 69 | #X obj -330 83 s \$0-posrnd; 70 | #X floatatom -405 59 5 0 0 0 - - -; 71 | #X floatatom -330 60 5 0 0 0 - - -; 72 | #X floatatom -257 61 5 0 0 0 - - -; 73 | #N canvas 732 435 188 139 voices 0; 74 | #X obj -301 -48 s_grainvoice \$0 voice1; 75 | #X obj -301 352 s_grainvoice \$0 voice21; 76 | #X obj -301 412 s_grainvoice \$0 voice24; 77 | #X obj -301 372 s_grainvoice \$0 voice22; 78 | #X obj -301 312 s_grainvoice \$0 voice19; 79 | #X obj -301 52 s_grainvoice \$0 voice6; 80 | #X obj -301 432 s_grainvoice \$0 voice25; 81 | #X obj -301 112 s_grainvoice \$0 voice9; 82 | #X obj -301 572 s_grainvoice \$0 voice32; 83 | #X obj -301 -8 s_grainvoice \$0 voice3; 84 | #X obj -301 -28 s_grainvoice \$0 voice2; 85 | #X obj -301 12 s_grainvoice \$0 voice4; 86 | #X obj -301 32 s_grainvoice \$0 voice5; 87 | #X obj -301 72 s_grainvoice \$0 voice7; 88 | #X obj -301 92 s_grainvoice \$0 voice8; 89 | #X obj -301 132 s_grainvoice \$0 voice10; 90 | #X obj -301 152 s_grainvoice \$0 voice11; 91 | #X obj -301 172 s_grainvoice \$0 voice12; 92 | #X obj -301 192 s_grainvoice \$0 voice13; 93 | #X obj -301 212 s_grainvoice \$0 voice14; 94 | #X obj -301 232 s_grainvoice \$0 voice15; 95 | #X obj -301 252 s_grainvoice \$0 voice16; 96 | #X obj -301 272 s_grainvoice \$0 voice17; 97 | #X obj -301 292 s_grainvoice \$0 voice18; 98 | #X obj -301 332 s_grainvoice \$0 voice20; 99 | #X obj -301 392 s_grainvoice \$0 voice23; 100 | #X obj -301 452 s_grainvoice \$0 voice26; 101 | #X obj -301 472 s_grainvoice \$0 voice27; 102 | #X obj -301 492 s_grainvoice \$0 voice28; 103 | #X obj -301 512 s_grainvoice \$0 voice29; 104 | #X obj -301 532 s_grainvoice \$0 voice30; 105 | #X obj -301 552 s_grainvoice \$0 voice31; 106 | #X restore -406 -71 pd voices; 107 | #X obj -405 -130 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 108 | -1 -1; 109 | #X obj -436 350 s \$0-pitch; 110 | #X obj -426 454 outlet~; 111 | #X obj -525 454 outlet~; 112 | #X obj -14 -167 inlet; 113 | #X obj -525 149 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 114 | 0 1; 115 | #X floatatom -526 107 5 0 0 0 - - -; 116 | #X obj -202 -162 inlet; 117 | #X obj -436 275 - 60; 118 | #X obj -436 253 r \$0-midipitch; 119 | #X obj -436 321 +; 120 | #X obj -436 295 t b f; 121 | #X obj -278 -163 inlet~; 122 | #X obj -306 286 s \$0-direction; 123 | #X msg -306 254 fwd; 124 | #X msg -276 254 rev; 125 | #N canvas 97 136 556 300 init 0; 126 | #X obj 228 57 loadbang; 127 | #X obj 228 81 \$0; 128 | #X msg 228 108 \; \$1-grainvoices 8 \; \$1-envelope hanning \; \$1-grainlength 129 | 0.1 \; \$1-metrospeed 100 \; \$1-pan 0 \; \$1-amp 1 \; \$1-pitch 0 130 | \; \$1-midipitch 60 \; \$1-panrnd 0 \; \$1-posrnd 0 \; \$1-amprnd 0 131 | \; \$1-direction fwd \;; 132 | #X connect 0 0 1 0; 133 | #X connect 1 0 2 0; 134 | #X restore -406 -90 pd init; 135 | #X obj -384 -132 r \$0-graintrigger; 136 | #X obj -405 -161 inlet; 137 | #X obj -14 -142 u_dispatch \$0 \$1 grainvoices; 138 | #X obj -525 172 s \$0-metroON; 139 | #X obj -525 274 s \$0-amp; 140 | #X floatatom -480 305 5 0 0 0 - - -; 141 | #X obj -14 125 u_dispatch \$0 \$1 posrnd; 142 | #X obj -14 -118 u_dispatch \$0 \$1 grainlength; 143 | #X obj -14 -92 u_dispatch \$0 \$1 metrospeed; 144 | #X obj -14 -68 u_dispatch \$0 \$1 pan; 145 | #X obj -14 -42 u_dispatch \$0 \$1 direction; 146 | #X obj -14 -18 u_dispatch \$0 \$1 amp; 147 | #X obj -14 8 u_dispatch \$0 \$1 envelope; 148 | #X obj -14 32 u_dispatch \$0 \$1 pitch; 149 | #X obj -14 55 u_dispatch \$0 \$1 midipitch; 150 | #X obj -14 102 u_dispatch \$0 \$1 panrnd; 151 | #X obj -14 152 u_dispatch \$0 \$1 amprnd; 152 | #X obj -14 77 u_dispatch \$0 \$1 metroON; 153 | #X obj -14 177 u_dispatch \$0 \$1 buffer; 154 | #N canvas 649 189 696 439 buffer 1; 155 | #X obj 184 203 soundfiler; 156 | #X obj 184 91 openpanel; 157 | #X msg -220 108 set \$1; 158 | #X floatatom 184 224 20 0 0 0 - - -; 159 | #X obj 184 245 s \$0-samples; 160 | #X obj 184 69 inlet; 161 | #X obj 229 131 \$0; 162 | #X obj 184 153 pack s 0; 163 | #X obj 184 114 t s b; 164 | #X obj 362 228 unpack s f; 165 | #X obj 362 200 r \$0-buffer; 166 | #X msg -220 132 /Users/stc/Documents/Git/Sonic-Instruments-Workshop/S09_GranularField/data/tribal.wav 167 | ; 168 | #X obj -51 46 loadbang; 169 | #X obj -52 93 symbol; 170 | #X obj 247 91 table \$0-buffer; 171 | #X msg 184 182 read -resize \$1 \$2-buffer; 172 | #X obj -187 350 soundfiler; 173 | #X msg -187 329 read -resize \$1 P5-buffer; 174 | #X obj -187 372 table P5-buffer; 175 | #X text -18 323 store the sound into a buffer preserved for processing 176 | so we don't have to track down \$0 variable; 177 | #X msg -50 69 ../bossa.wav; 178 | #X connect 0 0 3 0; 179 | #X connect 1 0 2 0; 180 | #X connect 1 0 8 0; 181 | #X connect 2 0 11 0; 182 | #X connect 3 0 4 0; 183 | #X connect 5 0 1 0; 184 | #X connect 6 0 7 1; 185 | #X connect 7 0 15 0; 186 | #X connect 7 0 17 0; 187 | #X connect 8 0 7 0; 188 | #X connect 8 1 6 0; 189 | #X connect 9 1 4 0; 190 | #X connect 10 0 9 0; 191 | #X connect 11 0 7 0; 192 | #X connect 12 0 20 0; 193 | #X connect 13 0 8 0; 194 | #X connect 15 0 0 0; 195 | #X connect 17 0 16 0; 196 | #X connect 20 0 13 0; 197 | #X restore -202 -106 pd buffer; 198 | #X connect 0 0 3 0; 199 | #X connect 1 0 3 0; 200 | #X connect 2 0 3 0; 201 | #X connect 4 0 6 0; 202 | #X connect 7 0 63 0; 203 | #X connect 8 0 10 0; 204 | #X connect 10 0 9 0; 205 | #X connect 12 0 11 0; 206 | #X connect 14 0 13 0; 207 | #X connect 16 0 48 0; 208 | #X connect 17 0 30 0; 209 | #X connect 18 0 29 0; 210 | #X connect 23 0 20 0; 211 | #X connect 24 0 22 0; 212 | #X connect 25 0 21 0; 213 | #X connect 27 0 19 0; 214 | #X connect 31 0 46 0; 215 | #X connect 32 0 47 0; 216 | #X connect 33 0 5 0; 217 | #X connect 34 0 7 0; 218 | #X connect 35 0 38 0; 219 | #X connect 36 0 35 0; 220 | #X connect 37 0 28 0; 221 | #X connect 38 0 37 0; 222 | #X connect 38 1 37 1; 223 | #X connect 39 0 15 0; 224 | #X connect 41 0 40 0; 225 | #X connect 42 0 40 0; 226 | #X connect 44 0 19 0; 227 | #X connect 45 0 27 0; 228 | #X connect 46 0 51 0; 229 | #X connect 49 0 37 0; 230 | #X connect 50 0 60 0; 231 | #X connect 51 0 52 0; 232 | #X connect 52 0 53 0; 233 | #X connect 53 0 54 0; 234 | #X connect 54 0 55 0; 235 | #X connect 55 0 56 0; 236 | #X connect 56 0 57 0; 237 | #X connect 57 0 58 0; 238 | #X connect 58 0 61 0; 239 | #X connect 59 0 50 0; 240 | #X connect 60 0 62 0; 241 | #X connect 61 0 59 0; 242 | -------------------------------------------------------------------------------- /S12_GranularField/data/patches/s_grainvoice.pd: -------------------------------------------------------------------------------- 1 | #N canvas 362 93 675 694 10; 2 | #X obj -142 274 *~; 3 | #X obj -143 336 +~; 4 | #X obj -31 246 *~ 256; 5 | #X obj -144 447 *~; 6 | #X obj -143 304 samphold~; 7 | #X floatatom 17 141 5 0 0 0 - - -, f 5; 8 | #X obj 17 202 min; 9 | #X obj -30 139 vline~; 10 | #X obj -30 87 f; 11 | #X msg -30 113 0 0 \, 1 \$1 0; 12 | #X obj 17 181 * 44.1; 13 | #X obj 5 -7 / 44.1; 14 | #X obj 0 32 *; 15 | #N canvas 0 22 1366 702 envelope 0; 16 | #X obj 23 28 inlet~; 17 | #X obj 23 259 outlet~; 18 | #X obj 23 109 cos~; 19 | #X obj 23 131 *~ 0.5; 20 | #X obj 24 160 +~ 0.5; 21 | #X obj 24 67 +~ 0.5; 22 | #X obj 24 88 wrap~; 23 | #X obj 79 115 sig~ 1; 24 | #X obj 79 143 -~; 25 | #X text 121 112 Ramp down; 26 | #X text 73 66 hanning shaper; 27 | #N canvas 276 152 450 300 multiplexer 0; 28 | #X obj 223 63 unpack f f f; 29 | #X obj 223 -28 sel 0 1 2; 30 | #X msg 223 -6 1 0 0; 31 | #X msg 240 16 0 1 0; 32 | #X msg 257 38 0 0 1; 33 | #X obj 25 114 *~; 34 | #X obj 72 115 *~; 35 | #X obj 115 116 *~; 36 | #X obj 26 -34 inlet~; 37 | #X obj 71 -34 inlet~; 38 | #X obj 116 -33 inlet~; 39 | #X obj 40 80 sig~; 40 | #X obj 86 80 sig~; 41 | #X obj 131 80 sig~; 42 | #X obj 24 154 outlet~; 43 | #X obj 223 -52 inlet; 44 | #X connect 0 0 11 0; 45 | #X connect 0 1 12 0; 46 | #X connect 0 2 13 0; 47 | #X connect 1 0 2 0; 48 | #X connect 1 1 3 0; 49 | #X connect 1 2 4 0; 50 | #X connect 2 0 0 0; 51 | #X connect 3 0 0 0; 52 | #X connect 4 0 0 0; 53 | #X connect 5 0 14 0; 54 | #X connect 6 0 14 0; 55 | #X connect 7 0 14 0; 56 | #X connect 8 0 5 0; 57 | #X connect 9 0 6 0; 58 | #X connect 10 0 7 0; 59 | #X connect 11 0 5 1; 60 | #X connect 12 0 6 1; 61 | #X connect 13 0 7 1; 62 | #X connect 15 0 1 0; 63 | #X restore 24 233 pd multiplexer; 64 | #X obj 207 146 route hanning decay attack; 65 | #X msg 207 172 0; 66 | #X msg 208 192 1; 67 | #X msg 209 216 2; 68 | #X obj 207 121 inlet; 69 | #X connect 0 0 5 0; 70 | #X connect 0 0 8 1; 71 | #X connect 0 0 11 2; 72 | #X connect 2 0 3 0; 73 | #X connect 3 0 4 0; 74 | #X connect 4 0 11 0; 75 | #X connect 5 0 6 0; 76 | #X connect 6 0 2 0; 77 | #X connect 7 0 8 0; 78 | #X connect 8 0 11 1; 79 | #X connect 11 0 1 0; 80 | #X connect 12 0 13 0; 81 | #X connect 12 1 14 0; 82 | #X connect 12 2 15 0; 83 | #X connect 13 0 11 3; 84 | #X connect 14 0 11 3; 85 | #X connect 15 0 11 3; 86 | #X connect 16 0 12 0; 87 | #X restore -129 416 pd envelope; 88 | #X obj 2 224 f; 89 | #X obj -144 538 *~; 90 | #X obj -93 540 *~; 91 | #X obj 43 452 sig~; 92 | #X obj 43 474 samphold~; 93 | #X obj 30 523 -~; 94 | #X obj 30 497 sig~ 1; 95 | #X obj -145 512 *~; 96 | #X obj -111 495 1; 97 | #X obj -111 28 r \$1-\$2-metro; 98 | #X obj 0 -51 r \$1-grainlength; 99 | #X obj 5 -31 r \$1-samples; 100 | #X obj 64 181 r \$1-samples; 101 | #X obj 43 360 r \$1-pan; 102 | #X obj -66 392 r \$1-envelope; 103 | #X obj -127 252 r \$1-samples; 104 | #X obj -145 566 throw~ \$1-out_L; 105 | #X obj -48 566 throw~ \$1-out_R; 106 | #X obj -143 182 receive~ \$1-pos; 107 | #N canvas 0 22 830 694 randomize 0; 108 | #X obj 240 72 random 1000; 109 | #X obj 240 112 * 0.001; 110 | #X obj 240 42 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 111 | -1; 112 | #X obj 240 147 *; 113 | #X floatatom 343 106 5 0 0 0 - - -, f 5; 114 | #X obj 240 283 +; 115 | #X obj 240 92 - 500; 116 | #X floatatom 240 314 5 0 0 0 - - -, f 5; 117 | #X floatatom 255 263 5 0 0 0 - - -, f 5; 118 | #X obj 280 456 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 119 | 1; 120 | #X obj 241 551 spigot; 121 | #X obj 144 546 spigot; 122 | #X obj 144 503 * -1; 123 | #X floatatom 144 632 5 0 0 0 - - -, f 5; 124 | #X obj 353 442 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 125 | 1; 126 | #X obj 353 408 >= 1; 127 | #X obj 376 596 spigot; 128 | #X obj 280 525 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 129 | 1; 130 | #X obj 240 342 t f f; 131 | #X obj 232 426 == 0; 132 | #X obj 315 424 == 0; 133 | #X obj 280 498 &&; 134 | #X obj 370 464 wrap; 135 | #X obj 375 574 -; 136 | #X obj 373 501 t b f; 137 | #X obj 280 409 >= 0; 138 | #X obj 315 455 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 139 | 1; 140 | #X msg 377 539 1; 141 | #X obj 255 241 inlet; 142 | #X obj 240 22 r \$1-\$2-metro; 143 | #X obj 343 81 inlet; 144 | #X obj 144 660 outlet; 145 | #X connect 0 0 6 0; 146 | #X connect 1 0 3 0; 147 | #X connect 2 0 0 0; 148 | #X connect 3 0 5 0; 149 | #X connect 4 0 3 1; 150 | #X connect 5 0 7 0; 151 | #X connect 6 0 1 0; 152 | #X connect 7 0 18 0; 153 | #X connect 8 0 5 1; 154 | #X connect 9 0 21 0; 155 | #X connect 10 0 13 0; 156 | #X connect 11 0 13 0; 157 | #X connect 12 0 11 0; 158 | #X connect 13 0 31 0; 159 | #X connect 14 0 16 1; 160 | #X connect 15 0 14 0; 161 | #X connect 15 0 20 0; 162 | #X connect 16 0 13 0; 163 | #X connect 17 0 10 1; 164 | #X connect 18 0 10 0; 165 | #X connect 18 0 12 0; 166 | #X connect 18 0 22 0; 167 | #X connect 18 1 15 0; 168 | #X connect 18 1 25 0; 169 | #X connect 19 0 11 1; 170 | #X connect 20 0 26 0; 171 | #X connect 21 0 17 0; 172 | #X connect 22 0 24 0; 173 | #X connect 23 0 16 0; 174 | #X connect 24 0 27 0; 175 | #X connect 24 1 23 1; 176 | #X connect 25 0 9 0; 177 | #X connect 25 0 19 0; 178 | #X connect 26 0 21 1; 179 | #X connect 27 0 23 0; 180 | #X connect 28 0 8 0; 181 | #X connect 29 0 2 0; 182 | #X connect 30 0 4 0; 183 | #X restore 43 432 pd randomize; 184 | #N canvas 610 34 675 694 randomizesig 1; 185 | #X obj 250 82 random 1000; 186 | #X obj 250 122 * 0.001; 187 | #X obj 250 52 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 188 | -1; 189 | #X obj 250 157 *; 190 | #X floatatom 353 116 5 0 0 0 - - -, f 5; 191 | #X obj 250 102 - 500; 192 | #X obj 250 32 r \$1-\$2-metro; 193 | #X obj 353 91 inlet; 194 | #X obj 250 233 +~; 195 | #X obj 250 188 sig~; 196 | #X obj 285 188 inlet~; 197 | #X obj 430 444 wrap~; 198 | #X obj 370 476 sig~ 1; 199 | #X obj 385 524 -~; 200 | #X obj 386 546 *~; 201 | #X obj 251 501 *~; 202 | #X obj 154 496 *~; 203 | #X obj 154 453 *~ -1; 204 | #X obj 155 618 outlet~; 205 | #X connect 0 0 5 0; 206 | #X connect 1 0 3 0; 207 | #X connect 2 0 0 0; 208 | #X connect 3 0 9 0; 209 | #X connect 4 0 3 1; 210 | #X connect 5 0 1 0; 211 | #X connect 6 0 2 0; 212 | #X connect 7 0 4 0; 213 | #X connect 8 0 11 0; 214 | #X connect 8 0 17 0; 215 | #X connect 8 0 15 0; 216 | #X connect 8 0 16 1; 217 | #X connect 8 0 15 1; 218 | #X connect 8 0 14 1; 219 | #X connect 9 0 8 0; 220 | #X connect 10 0 8 1; 221 | #X connect 11 0 13 1; 222 | #X connect 12 0 13 0; 223 | #X connect 13 0 14 0; 224 | #X connect 14 0 18 0; 225 | #X connect 15 0 18 0; 226 | #X connect 16 0 18 0; 227 | #X connect 17 0 16 0; 228 | #X restore -143 227 pd randomizesig; 229 | #N canvas 0 22 830 694 randomize 0; 230 | #X obj 240 72 random 1000; 231 | #X obj 240 112 * 0.001; 232 | #X obj 240 42 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 233 | -1; 234 | #X obj 240 147 *; 235 | #X floatatom 343 106 5 0 0 0 - - -, f 5; 236 | #X obj 240 283 +; 237 | #X obj 240 92 - 500; 238 | #X floatatom 240 314 5 0 0 0 - - -, f 5; 239 | #X floatatom 255 263 5 0 0 0 - - -, f 5; 240 | #X obj 280 456 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 241 | 1; 242 | #X obj 241 551 spigot; 243 | #X obj 144 546 spigot; 244 | #X obj 144 503 * -1; 245 | #X floatatom 144 632 5 0 0 0 - - -, f 5; 246 | #X obj 353 442 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 247 | 1; 248 | #X obj 353 408 >= 1; 249 | #X obj 376 596 spigot; 250 | #X obj 280 525 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 251 | 1; 252 | #X obj 240 342 t f f; 253 | #X obj 232 426 == 0; 254 | #X obj 315 424 == 0; 255 | #X obj 280 498 &&; 256 | #X obj 370 464 wrap; 257 | #X obj 375 574 -; 258 | #X obj 373 501 t b f; 259 | #X obj 280 409 >= 0; 260 | #X obj 315 455 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 261 | 1; 262 | #X msg 377 539 1; 263 | #X obj 255 241 inlet; 264 | #X obj 240 22 r \$1-\$2-metro; 265 | #X obj 343 81 inlet; 266 | #X obj 144 660 outlet; 267 | #X obj 131 245 r \$1-collision; 268 | #X floatatom 139 280 5 0 0 0 - - -, f 5; 269 | #X connect 0 0 6 0; 270 | #X connect 1 0 3 0; 271 | #X connect 2 0 0 0; 272 | #X connect 3 0 5 0; 273 | #X connect 4 0 3 1; 274 | #X connect 5 0 7 0; 275 | #X connect 6 0 1 0; 276 | #X connect 7 0 18 0; 277 | #X connect 8 0 5 1; 278 | #X connect 9 0 21 0; 279 | #X connect 10 0 13 0; 280 | #X connect 11 0 13 0; 281 | #X connect 12 0 11 0; 282 | #X connect 13 0 31 0; 283 | #X connect 14 0 16 1; 284 | #X connect 15 0 14 0; 285 | #X connect 15 0 20 0; 286 | #X connect 16 0 13 0; 287 | #X connect 17 0 10 1; 288 | #X connect 18 0 10 0; 289 | #X connect 18 0 12 0; 290 | #X connect 18 0 22 0; 291 | #X connect 18 1 15 0; 292 | #X connect 18 1 25 0; 293 | #X connect 19 0 11 1; 294 | #X connect 20 0 26 0; 295 | #X connect 21 0 17 0; 296 | #X connect 22 0 24 0; 297 | #X connect 23 0 16 0; 298 | #X connect 24 0 27 0; 299 | #X connect 24 1 23 1; 300 | #X connect 25 0 9 0; 301 | #X connect 25 0 19 0; 302 | #X connect 26 0 21 1; 303 | #X connect 27 0 23 0; 304 | #X connect 28 0 8 0; 305 | #X connect 29 0 2 0; 306 | #X connect 30 0 4 0; 307 | #X connect 32 0 5 0; 308 | #X connect 32 0 33 0; 309 | #X restore -96 469 pd randomize; 310 | #X obj 112 405 r \$1-panrnd; 311 | #X obj 185 405 r \$1-amprnd; 312 | #X obj 114 129 r \$1-posrnd; 313 | #X obj -96 447 r \$1-amp; 314 | #X obj -144 359 tabread4~ \$1-buffer; 315 | #X floatatom 258 -3 5 0 0 0 - - -, f 5; 316 | #X floatatom 258 104 5 0 0 0 - - -, f 5; 317 | #X obj 258 16 / 12; 318 | #X obj 258 82 pow 2; 319 | #X obj 258 36 t b f; 320 | #X msg 258 59 2; 321 | #X obj 243 149 sig~; 322 | #X obj -31 209 *~; 323 | #X obj 258 -30 r \$1-pitch; 324 | #X floatatom 24 60 5 0 0 0 - - -, f 5; 325 | #X obj 243 126 f; 326 | #X floatatom -78 492 5 0 0 0 - - -, f 5; 327 | #N canvas 980 344 450 300 direction 0; 328 | #X obj 47 29 inlet~; 329 | #X obj 49 241 outlet~; 330 | #X obj 120 133 -~; 331 | #X obj 120 106 sig~ 1; 332 | #X obj 119 165 *~; 333 | #X obj 176 126 == 0; 334 | #X obj 176 148 sig~; 335 | #X obj 48 160 *~; 336 | #X obj 62 121 sig~; 337 | #X obj 173 -44 r \$1-direction; 338 | #X obj 176 20 sel fwd rev; 339 | #X msg 176 49 1; 340 | #X msg 207 50 0; 341 | #X obj 176 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 342 | 1; 343 | #X obj 173 -20 list prepend symbol; 344 | #X obj 175 -1 list trim; 345 | #X connect 0 0 7 0; 346 | #X connect 0 0 2 1; 347 | #X connect 2 0 4 0; 348 | #X connect 3 0 2 0; 349 | #X connect 4 0 1 0; 350 | #X connect 5 0 6 0; 351 | #X connect 6 0 4 1; 352 | #X connect 7 0 1 0; 353 | #X connect 8 0 7 1; 354 | #X connect 9 0 14 0; 355 | #X connect 10 0 11 0; 356 | #X connect 10 1 12 0; 357 | #X connect 11 0 13 0; 358 | #X connect 12 0 13 0; 359 | #X connect 13 0 5 0; 360 | #X connect 13 0 8 0; 361 | #X connect 14 0 15 0; 362 | #X connect 15 0 10 0; 363 | #X restore -31 160 pd direction; 364 | #X obj 5 13 t b f; 365 | #X obj 43 384 + 1; 366 | #X obj 43 407 * 0.5; 367 | #X obj -111 57 t b b; 368 | #X obj 12 263 r \$1-buffer; 369 | #X obj 12 284 unpack s f; 370 | #X obj 12 303 list prepend set; 371 | #X obj 12 328 list trim; 372 | #X connect 0 0 4 0; 373 | #X connect 1 0 40 0; 374 | #X connect 2 0 1 1; 375 | #X connect 2 0 4 1; 376 | #X connect 2 0 18 1; 377 | #X connect 3 0 21 0; 378 | #X connect 4 0 1 0; 379 | #X connect 5 0 10 0; 380 | #X connect 6 0 14 1; 381 | #X connect 7 0 13 0; 382 | #X connect 7 0 53 0; 383 | #X connect 8 0 9 0; 384 | #X connect 9 0 7 0; 385 | #X connect 10 0 6 0; 386 | #X connect 11 0 54 0; 387 | #X connect 12 0 5 0; 388 | #X connect 12 0 8 1; 389 | #X connect 12 0 50 0; 390 | #X connect 13 0 3 1; 391 | #X connect 14 0 2 1; 392 | #X connect 15 0 30 0; 393 | #X connect 16 0 31 0; 394 | #X connect 17 0 18 0; 395 | #X connect 18 0 19 1; 396 | #X connect 18 0 15 1; 397 | #X connect 19 0 16 1; 398 | #X connect 20 0 19 0; 399 | #X connect 21 0 15 0; 400 | #X connect 21 0 16 0; 401 | #X connect 22 0 21 1; 402 | #X connect 23 0 57 0; 403 | #X connect 24 0 12 0; 404 | #X connect 25 0 11 0; 405 | #X connect 26 0 6 1; 406 | #X connect 27 0 55 0; 407 | #X connect 28 0 13 1; 408 | #X connect 29 0 0 1; 409 | #X connect 32 0 34 0; 410 | #X connect 33 0 17 0; 411 | #X connect 34 0 0 0; 412 | #X connect 35 0 22 1; 413 | #X connect 35 0 52 0; 414 | #X connect 36 0 33 1; 415 | #X connect 37 0 35 1; 416 | #X connect 38 0 34 1; 417 | #X connect 39 0 35 0; 418 | #X connect 40 0 3 0; 419 | #X connect 41 0 43 0; 420 | #X connect 42 0 51 1; 421 | #X connect 43 0 45 0; 422 | #X connect 44 0 42 0; 423 | #X connect 45 0 46 0; 424 | #X connect 45 1 44 1; 425 | #X connect 46 0 44 0; 426 | #X connect 47 0 48 1; 427 | #X connect 48 0 2 0; 428 | #X connect 49 0 41 0; 429 | #X connect 51 0 47 0; 430 | #X connect 53 0 48 0; 431 | #X connect 54 0 12 0; 432 | #X connect 54 1 12 1; 433 | #X connect 55 0 56 0; 434 | #X connect 56 0 33 0; 435 | #X connect 57 0 8 0; 436 | #X connect 57 1 51 0; 437 | #X connect 57 1 14 0; 438 | #X connect 57 1 22 0; 439 | #X connect 58 0 59 0; 440 | #X connect 59 0 60 0; 441 | #X connect 60 0 61 0; 442 | #X connect 61 0 40 0; 443 | -------------------------------------------------------------------------------- /S12_GranularField/data/patches/u_dispatch.pd: -------------------------------------------------------------------------------- 1 | #N canvas 1079 128 666 305 10; 2 | #X obj 145 129 inlet; 3 | #X obj 190 211 outlet; 4 | #X obj 145 234 s \$1-\$3; 5 | #X obj 145 175 route \$3; 6 | #X connect 0 0 3 0; 7 | #X connect 3 0 2 0; 8 | #X connect 3 1 1 0; 9 | -------------------------------------------------------------------------------- /S12_GranularField/data/tribal.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S12_GranularField/data/tribal.wav -------------------------------------------------------------------------------- /S13_WebApp/data/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S13_WebApp/data/apple-touch-icon.png -------------------------------------------------------------------------------- /S13_WebApp/data/main.pd: -------------------------------------------------------------------------------- 1 | #N canvas 689 132 480 414 10; 2 | #X obj 187 182 osc~; 3 | #X obj 162 159 mtof; 4 | #X obj 186 285 dac~; 5 | #X obj 203 232 *~ 0; 6 | #X obj 109 90 r pitch; 7 | #X obj 321 101 r volume; 8 | #X text 260 72 And this inlet controls volume; 9 | #X text 101 319 Audio finally comes out here and is played out your 10 | phones speakers; 11 | #X text 45 70 This inlet controls the pitch; 12 | #X obj 125 115 * 50; 13 | #X obj 139 136 + 40; 14 | #X connect 0 0 3 0; 15 | #X connect 1 0 0 0; 16 | #X connect 3 0 2 0; 17 | #X connect 3 0 2 1; 18 | #X connect 4 0 9 0; 19 | #X connect 5 0 3 1; 20 | #X connect 9 0 10 0; 21 | #X connect 10 0 1 0; 22 | -------------------------------------------------------------------------------- /S13_WebApp/data/sketch.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | WebApp Example: A modified version of the basic LibPd example. This code is entirely built on javascript using WebAudio API. 4 | The core libraries that are used: 5 | 6 | P5JS : the framework that makes possible to write processing-like code using cutting edge web technologies (canvas, sockets, webrtc, etc) 7 | WebPd : the framework that makes possible to turn your Pd patches into javascript and render audio using WebAudio API 8 | 9 | Thus, by targeting the web, you can try your code on iOS, Android, and any Browser that supports HTML5 Canvas and WebAudio. 10 | See readme file on more info how to try this example. 11 | 12 | Sonic Instruments Workshop / 2015 13 | (c) stc@binaura.net 14 | 15 | */ 16 | 17 | // use this for manually start DSP (because of iOS restrictions) 18 | // notice: in js world, all variables are declared as "var" + name 19 | 20 | var canstart = true; 21 | 22 | // notice: functions are called "void" in processing, 23 | // but they are called "function" in javascript 24 | 25 | function setup() { 26 | // instead of size, use this 27 | createCanvas(windowWidth,windowHeight); 28 | background(255); 29 | } 30 | 31 | function draw() { 32 | if(canstart) { 33 | noStroke(); 34 | fill(0); 35 | textSize(30); 36 | textAlign( CENTER, CENTER ); 37 | text( "Touch to start drawing & make some noise", width / 2, height / 2 ); 38 | } 39 | } 40 | 41 | function mouseDragged() { 42 | if(canstart) { 43 | Pd.start(); 44 | background(255); 45 | canstart = false; 46 | } 47 | Pd.send('pitch', [ map( mouseX, 0, width, 0, 1 ) ]); 48 | Pd.send('volume', [ map( mouseY, 0, height, 1, 0 ) ]); 49 | ellipse( mouseX, mouseY, 10, 10 ); 50 | } -------------------------------------------------------------------------------- /S13_WebApp/data/startup-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stc/Sonic-Code-Workshops/e23a105bb097eba77edfd1303c1cd0f0e64c5a64/S13_WebApp/data/startup-image.png -------------------------------------------------------------------------------- /S13_WebApp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 21 | 22 | 23 | 29 | 30 | --------------------------------------------------------------------------------