Pduino + Arduino Output to Pins
Unfortunately, snapshot~ doesn't seem to send data at a rate which enables clean signaling of arduino pins. When it comes to audio anything, I find that outputting signal is necessary, as outputting control values just cannot keep up with audio. If you are looking to make a square wave generator that is controllable from puredata, the best way that I have found to do this is by using a combination of arduino, a DAC chip and an op-amp chip. Also, you'll want to use at least a 12 bit DAC, such as mcp4921 or mcp4725, as 8 bit DAC lacks the ability to tune the output fine enough to stay in tune with standard tuning. For opamp choices, you can pretty much take your pick. They all do pretty much the same thing, though you will find that every opamp has it's own unique sound quality. I really love the gritty sound of the CA313. A very good and popular sound for opamp VCO is the tl072 or tl075. There are tons of schematics out there for how to configure a square wave vco with opamps. You would just modify the components to fit the output of your DAC.
Next, you would send your controller values from PD to the arduino and have some code in the ar'dweener to handle communicating with the DAC. You can then add all sorts of fun stuff to your board like digipots, opamp buffers, VCAs and so on to make envelopes, LFOs etc.
If you don't want to track down additional chips (usually ordered from china being the only way to find them, cheap though they tend to be,) but want to have square waves being output directly from the arduino, then you would still be better off having pd send control values to the arduino and then let the arduino handle the signal generation to it's pins. For this purpose, you may want to look at the tone library or the mozzi library. Teensy boards have some expanded audio capabilities as well, but teensy boards are a bit expensive for my taste, as you can get a freakin raspberry pi with a full linux operating system on it for a fraction of what it costs. Still, teensies are great and extremely handy for these types of applications if you dont mind dropping some extra money. I try to build everything to work on cheap arduino clones just for financial and practicality sake.
I have code and patches that I have written to control these types of circuits for many DACs and digipots with SPI and I2C protocalls... let me know if you'd like to check them out for some guidance.
Pduino + Arduino Output to Pins
Dear Forum,
Experienced PD user, intermediate Arduino user here.
My goal is to send several different frequency square waves (to be used as "on" and "off" signals for a circuit) to various output pins on an Arduino.
I am up and running using the Pduino library, and have PD and Arduino talking to each other.
However, I am not able to output audio-rate signals to any Arduino pins. For example, sending a square~ into an appropriately timed snapshot~ to output 0's and 1's to Arduino pins yields random clicking/sputtering Arduino output, rather than the expected steady square wave tone at any freq.
My arduinos play a square wave out through the pins just fine when using the Arduino IDE...so, what am I missing in the communication between Arduino and PD/Pduino? A speed issue?
Thanks in advance for any advice!
Dynamic Effect/Plugin Loader esp. For Rapsberry PI (DIY2 and Stamp Album effects/plugins)
Dynamic Effect Plugin Loader esp. For Rapsberry PI (DIY2 and Stamp Album effects/plugins)
DynamicEffectPluginLoaderForPI.zip
Background:
In the last couple of days I finally built something I have needed and wanted for a while (which later on I will discuss in more detail under a separate thread): an Arduino electric guitar.
In other words, I took the connections off the 5-way and knobs (internally connected to the pickups and line out) and rerouted the switch and knobs to an arduino. The reasoning being I can control Way more with pd and those knobs than what they were originally intended to do if I capture their output using Arduino.
However, the patch I had built for it was clocking in at about 275-300% of the pi's cpu. And while I could have gone back and added switches (which I took out a while back, to replace with fade-mixers for when I change an effect) throughout, the thought of doing that was more daunting than (considering how elaborate the patch is) I wanted to undertake.
Enter: Dynamic Patching.
I found that with just 3 straight-chained effects the pi ran at only about 10%.
So...here's what I built and am sharing now (before tying it into the arduino guitar, because I think others might want to go ahead and learn from it, extend it, expand upon it, use it, etc. etc.).
The patch(es, there are two, one laid out for the DIY2 plugins and one laid out for the Stamp Album ones, will probably consolidate them later, but other things are demanding my attention) is pretty straight forward:
(Dependency on the tof/menubutton, tof can be found via deken)
Click on the menus at the top to select an effect for each of the 5 slots or select the "unchanged" effect to leave that slot open.
Then click the BUILD bang or the CLEAR bang (to start over).
The selected effects will load into the PALLETTE subpatch already connected to adc~ and dac~.
That's really about all there is to it. Very straight-forward, clean, and very cpu light-weight. The racks of all 5 slots I tested ran at about 10-12% on my PI 3r2.
Hope you can make use of it. And would love to hear feedback.
For the future:
Add a hid-stomp controller to load preset racks (which you can send in via the tof/menubotton) to load racks on the fly;
Add a meta-level to send either hid, osc, or arduino commands to each of the loaded effects.
Merry Music to us, one and all.
Peace,
Scott
p.s. Oh! The arduino guitar: though it has no connected pickups it gets its audio signal from an (about) 1" piezo mic fun-tacked to the knob-well inside the guitar. Sounds great. Just pure guitar. The tone, texture, etc. come after the fact via the pd-side.
Ciao for now.
Wanna say: the real genius lies not in what I cobbled together, but the strength of will and purpose it took for the two original developers to make abstractions so completely consistent and thoroughly aligned. My highest regards to you both. Thank you, both, so very much, for helping to make my "job" so easy.
How to „read out“ time values after a bang got triggered? How to define „time windows“ in ms?
Hi there!
I’m quite new to pd but getting more and more into it as I’m trying to build a simple game/app, where users must trigger sound-samples in a certain order and (most notably) at certain points in time. The samples are triggered with bangs and since I edited them by myself, I know the exact length of every sample.
Now let us assume we have 4 samples, each of them with a length of 1200ms and each sample has its own bang to trigger it. These bangs get their input from „buttons“ which the user can hit via a graphical user interface (I built this GUI with MOBMUPLAT, a GUI-editor which interacts with Pd patches). If the bangs are triggered with exact timing, the 4 samples will add up to a musical sequence.
The first bang starts sample1 - after 1200ms the second bang (= button on the interface) shall be hit to start sample2 and so on.. it’s obvious that the user will not hit the buttons on the interface with an accuracy of single milliseconds, so here are my questions for the pd patch:
-
How can I „read out“ certain points in time, after a bang got triggered? e.g. after the first bang was hit, how much time (in ms) has passed until the second bang got hit? And can I „store“ and „recall“ these values in any way?
-
Is it possible to define a kind of „time window“ in ms? e.g. after the first bang was hit, the second bang has to be hit within 1150-1250ms to trigger something, or else (if the second is triggered too soon/late) nothing will happen..
Hope this explanation of my problem is not too complicated. Any help would be much appreciated!
ALSA output error (snd\_pcm\_open) Device or resource busy
Sorry to necro this thread, but I finally found out how to run PureData under Pulseaudio (which otherwise results with "ALSA output error (snd_pcm_open): Device or resource busy").
First of all, run:
pd -alsa -listdev
PD will start, and in the message window you'll see:
audio input devices:
1. HDA Intel PCH (hardware)
2. HDA Intel PCH (plug-in)
audio output devices:
1. HDA Intel PCH (hardware)
2. HDA Intel PCH (plug-in)
API number 1
no midi input devices found
no midi output devices found
... or something similar.
Now, let's add the pulse
ALSA device, and run -listdev
again:
pd -alsa -alsaadd pulse -listdev
The output is now:
audio input devices:
1. HDA Intel PCH (hardware)
2. HDA Intel PCH (plug-in)
3. pulse
audio output devices:
1. HDA Intel PCH (hardware)
2. HDA Intel PCH (plug-in)
3. pulse
API number 1
no midi input devices found
no midi output devices found
Notice, how from the original two ALSA devices, now we got three - where the third one is pulse
!
Now, the only thing we want to do, is that at startup (so, via the command line), we set pd
to run in ALSA mode, we add the pulse
ALSA device, and then we choose the third (3) device (which is to say, pulse
) as the audio output device - and the command line argument for that in pd
is -audiooutdev
:
pd -alsa -alsaadd pulse -audiooutdev 3 ~/Desktop/mypatch.pd
Yup, now when you enable DSP, the patch mypatch.pd
should play through Pulseaudio, which means it will play (and mix) with other applications that may be playing sound at the time! You can confirm that the correct output device has been selected from the command line, if you open Media/Audio Settings... once pd
starts:
As the screenshot shows, now "Output device 1" is set to "pulse", which is what we needed.
Hope this helps someone!
EDIT: I had also done changes to /etc/pulse/default.pa
as per https://wiki.archlinux.org/index.php/PulseAudio#ALSA.2Fdmix_without_grabbing_hardware_device beforehand, not sure whether that makes a difference or not (in any case, trying to add dmix
as a PD device and playing through it, doesn't work on my Ubuntu 14.04)
Getting DHT-22 sensor data to PD/PD-l2Ork RPi3
Hello, first post here as a PD newbie (but Max veteran)
I have managed to get PD working on my RPi3 (well that was easy as it is included in the Rasbian repository!!) and I am currently installing PD-l2Ork. I hate to ask stuff without having had a good stab at it myself already but I just wanted to ask for tips on getting sensor information into PD.
I am going to take part in Tiree Tech Wave in a couple of weeks and I want to make some kind of reactive bio feedback sample player, trying to scrub local weather data looks like it might be quite hard so I thought of doing something a little more micro scale and use something like the DHT-22 to get local ambient data and to influence a generative system that plays back samples from file.
I am fairly competant with Arduino style C and have done a little work in Python (but Python does give me a headache!!) - I have managed to get DHT-22 collecting and feeding back data on the RPi with Python and on the Arduino individually. I have no idea right now how to go about getting that data into PD...
The DHT-22 has a basic microprocessor on it that sends the collected ambient readings as words on a single wire data line, People have made nice Arduino and Python libraries already to handle that painlessly...
I have installed pd-comport and I have the impression the PD-l2Ork has some good included GPIO handling, I think that what I could do quite easily right now is bring an Arduino along as well and get the Arduino to handle all the DHT-22 stuff, and also react to the data - this could result in something like triggers activating on several GPIO pins, all easy stuff. But it would be nicer and I would learn more if I could send the actual numbers based on temperature and humidity to PD and do stuff there... I have no idea how easy that would be, in Max/MSP I would use the serial object to get data from the Arduino, and it's pretty easy to filter what you see at either end.
I guess another possible benefit of serial is perhaps using Bluetooth and having the sensor located more remotely.
Of course, it's probably totally unnecessary to use an Arduino and it can all be handled by the RPi but using Python makes my blood pressure go up
Anyway, woops I have written an essay... any thoughts, tips or words of encouragement would be welcomed!
hid object causing crash
I made a nifty little patch for reading HID information from an Xbox controller and spitting it out all organized, and it was working fine about a month ago.
I finally decided to put it to use and now the HID object causes PD to crash without fail! O no!
When I open the hid help file (which I built my patch from), I click the green box that turns on the hid reading, and as soon as I click the object that lets me choose which hid (channel?) I'm reading, the whole program goes belly-up.
Why is this happening now and not before? Hid worked fine before... Is it my system?
I'm using pdL20rk and ubuntu 16.04
as always, I appreciate the help.
updates: vanilla crashed as well and jstest shows the controller is working fine
also ubuntu generated an error report but I've no idea what it means or what info would be useful to include from it. The most relevant piece seems to be "pd crashed with SIGSEV in hid_poll()"
for every position on the hradio in the help file patch, when I click it the console reads
error: [hid] open /dev/input/event0 failed
error: [hid] can not open device x
where x is the position of the hradio and the variable attached to the open message
FIXED?
for some reason hid was recognizing the controller as device 19, so I made an open message for device 19 and it is polling the controller.
This still doesn't tell me why it was crashing, which is worrisome.
Multiple patches sending to the same Arduino / change block size?
I'm working on a project involving Pure Data and Arduino. The idea is to play an audio file while controlling a pump that breathes air into an aquarium, based on the envelope of the audio, so that the bubbles correspond to the voice that you hear in headphones.
My problem is, while it works perfectly with one aquarium (playing the audio file + controlling the pump), it's less precise, and sometimes completely off, when I'm adding the others.
Files : main.pd, aquarium.pd, arduino.pd
The logic of one aquarium is inside an abstraction, [aquarium], with the file, threshold, audio output and Arduino pin as creation arguments. Every instance of the abstraction is playing its own file into a given audio output, and sending messages to the Arduino ("turn on pump X" or "turn off pump X"). It works quite well for most of the aquariums, so I guess (hope) the fix must be simple.
I tried different ideas to limit the message flow but didn't quite succeed (hence the mess below the [dac~] object, this stuff is not used anymore).
I only recently thought about increasing block size, thinking that would reduce the number of messages sent to the Arduino. However using the audio settings, it didn't seem to change anything, and I'm not sure how to use the [block~] object. Do I have to send the audio output through an [outlet~] object? I guess that would mean each of my 9 [aquarium…] blocks would need to have 9 outlets going into a [dac~] object in my main patch, and that would be a big spaghetti plate
I'd be curious to know if any of you has ever encountered this kind of issue, or has an idea to fix it, either with block size, pure data magic or anything else…
Thanks!
How to control an electric servo using pd?
How do you plan to do it? With an Arduino? If so, you'll need [comport]. Servos take bytes iirc, so you'll need to convert your number ranges to that of one byte (0-255) and send it to [comport] (make sure you convert them to ints with [i ] before you send them to [comport]).
If you have multiple servos you want to control, you'll need to separate them in your code. What I do in Arduino is use letters to separate the values. So the code is something like this:
if(Serial.available()){
static int temp_val;
byte in_byte = Serial.read();
if((in_byte >= '0') && (in_byte <= '9'))
temp_val = temp_val * 10 + in_byte - '0';
else if((in_byte >= 'a') && (in_byte <= 'z')){
int which_servo = in_byte - 'a';
analogWrite(servo_pins[which_servo], temp_val);
temp_val = 0;
}
}
Put the code above in your loop() function.
Of course you need to define an array with the pins of the servo motors (here it's called "servo_pins") for this code to work.
Then in Pd I send messages of the type "print $1a" for the first servo, "print $1b" for the second, etc.
Hope this helps.
Install PD extend on Ubuntustudio
I just installed Ubuntustudio 15.10 Wily Werewolf 32bit on a thinkpad and I am trying to upgrade PD to extend. I am fairly new to linux but it seems like the instructions on https://puredata.info/docs/faq/debian fails.
This is the log from executing the commands. Any suggestions and help will be appreciated
myuser@machine:~$ sudo add-apt-repository "deb http://apt.puredata.info/releases `lsb_release -c | awk '{print $2}'` main"[sudo] password for zoundart:
myuser@machine:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 9f0fe587374bbe81
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.beJyKhm5Lr --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv-key 9f0fe587374bbe81
gpg: requesting key 374BBE81 from hkp server keyserver.ubuntu.com
gpg: key 374BBE81: "Hans-Christoph Steiner <hans@guardianproject.info>" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
myuser@machine:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key D63D3D09C39F5EEB
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.BDfXAe3l5j --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv-key D63D3D09C39F5EEB
gpg: requesting key C39F5EEB from hkp server keyserver.ubuntu.com
gpg: key C39F5EEB: "Launchpad Pure Data" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
myuser@machine:~$ sudo apt-get update
Hit http://no.archive.ubuntu.com wily InRelease
Get:1 http://no.archive.ubuntu.com wily-updates InRelease [64,4 kB]
Get:2 http://no.archive.ubuntu.com wily-backports InRelease [64,5 kB]
Get:3 http://security.ubuntu.com wily-security InRelease [64,4 kB]
Ign http://apt.puredata.info wily InRelease
Ign http://apt.puredata.info wily Release.gpg
Ign http://apt.puredata.info wily Release
Get:4 http://security.ubuntu.com wily-security/main Sources [17,0 kB]
Get:5 http://no.archive.ubuntu.com wily-updates/main Sources [24,1 kB]
Get:6 http://no.archive.ubuntu.com wily-updates/restricted Sources [3 741 B]
Get:7 http://security.ubuntu.com wily-security/restricted Sources [2 854 B]
Get:8 http://no.archive.ubuntu.com wily-updates/universe Sources [6 112 B]
Get:9 http://no.archive.ubuntu.com wily-updates/multiverse Sources [1 922 B]
Get:10 http://security.ubuntu.com wily-security/universe Sources [3 691 B]
Get:11 http://no.archive.ubuntu.com wily-updates/main i386 Packages [59,3 kB]
Get:12 http://no.archive.ubuntu.com wily-updates/restricted i386 Packages [13,4 kB]
Get:13 http://security.ubuntu.com wily-security/multiverse Sources [1 922 B]
Get:14 http://no.archive.ubuntu.com wily-updates/universe i386 Packages [31,0 kB]
Get:15 http://no.archive.ubuntu.com wily-updates/multiverse i386 Packages [6 052 B]
Get:16 http://security.ubuntu.com wily-security/main i386 Packages [43,4 kB]
Err http://apt.puredata.info wily/main i386 Packages
404 Not Found
Ign http://apt.puredata.info wily/main Translation-en_US
Get:17 http://no.archive.ubuntu.com wily-backports/main Sources [750 B]
Get:18 http://security.ubuntu.com wily-security/restricted i386 Packages [10,8 kB]
Get:19 http://no.archive.ubuntu.com wily-backports/restricted Sources [28 B]
Ign http://apt.puredata.info wily/main Translation-en
Get:20 http://no.archive.ubuntu.com wily-backports/universe Sources [833 B]
Get:21 http://no.archive.ubuntu.com wily-backports/multiverse Sources [28 B]
Get:22 http://no.archive.ubuntu.com wily-backports/main i386 Packages [606 B]
Get:23 http://security.ubuntu.com wily-security/universe i386 Packages [24,8 kB]
Get:24 http://no.archive.ubuntu.com wily-backports/restricted i386 Packages [28 B]
Get:25 http://no.archive.ubuntu.com wily-backports/universe i386 Packages [714 B]
Get:26 http://security.ubuntu.com wily-security/multiverse i386 Packages [6 052 B]
Get:27 http://no.archive.ubuntu.com wily-backports/multiverse i386 Packages [28 B]
Hit http://no.archive.ubuntu.com wily-backports/multiverse Translation-en
Hit http://no.archive.ubuntu.com wily-backports/restricted Translation-en
Get:28 http://security.ubuntu.com wily-security/main Translation-en [23,2 kB]
Hit http://no.archive.ubuntu.com wily/main Sources
Hit http://no.archive.ubuntu.com wily/restricted Sources
Hit http://no.archive.ubuntu.com wily/universe Sources
Get:29 http://security.ubuntu.com wily-security/multiverse Translation-en [2 536 B]
Hit http://no.archive.ubuntu.com wily/multiverse Sources
Hit http://no.archive.ubuntu.com wily/main i386 Packages
Hit http://no.archive.ubuntu.com wily/restricted i386 Packages
Hit http://no.archive.ubuntu.com wily/universe i386 Packages
Get:30 http://security.ubuntu.com wily-security/restricted Translation-en [2 666 B]
Hit http://no.archive.ubuntu.com wily/multiverse i386 Packages
Hit http://no.archive.ubuntu.com wily/main Translation-en
Hit http://no.archive.ubuntu.com wily/multiverse Translation-en
Hit http://no.archive.ubuntu.com wily/restricted Translation-en
Get:31 http://security.ubuntu.com wily-security/universe Translation-en [15,2 kB]
Hit http://no.archive.ubuntu.com wily/universe Translation-en
Hit http://no.archive.ubuntu.com wily-updates/main Translation-en
Hit http://no.archive.ubuntu.com wily-updates/multiverse Translation-en
Hit http://no.archive.ubuntu.com wily-updates/restricted Translation-en
Hit http://no.archive.ubuntu.com wily-updates/universe Translation-en
Hit http://no.archive.ubuntu.com wily-backports/main Translation-en
Hit http://no.archive.ubuntu.com wily-backports/universe Translation-en
Fetched 496 kB in 7s (70,7 kB/s)
W: Failed to fetch http://apt.puredata.info/releases/dists/wily/main/binary-i386/Packages 404 Not Found
E: Some index files failed to download. They have been ignored, or old ones used instead.
myuser@machine:~$ sudo apt-get install pd-extended
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package pd-extended is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'pd-extended' has no installation candidate