Storing symbols in table-like index
Hello. I'm trying to create a sample-player that plays random files from within the folder of the patch.
Right now it's composed of a [random] object sending out values between, say, 0 and 10 to a [select] object that then routes the bang to a message containing the specific filename, which is sent to an [open $1.wav] message for [readsf~], which is then read. No problem, it works just fine.
But as the patch grows and the number of samples I want to use increases, I want to be able to swap out filenames faster and with more ease, and typing in the individual filenames of each file quickly becomes a hassle. A workaround I did was to simply re-name the local samples to the values 0 through 10, so that I could skip the use of the [select]-object altogether, but having to re-name samples every time I want to use it in the patch is likewise a hassle.
Is there a way to create an index of symbols (for filenames) that can be used in a similar fashion to [table] and [tabread]? Input a number, it spits out the information sitting in the relevant index. Would [list] be a way to achieve this? I haven't worked too much with the object, but from what I gathered, it didn't seem to be the best choice. But please do enlighten me if I'm wrong.
I'm using Pd-extended for what it's worth.
Purr Data Beta 3
Do you have any plans for custom keyboard shortcuts? I am struggling to set something up in vanilla through tlc, but all those handles would disappear I guess in Purr Data? My biggest UI issue is actually having to mouseclick and modifier press so much. It hurts my hands when trying to patch fast! Would really love to have max-style shortcuts for objects, not using a modifier key: n for new object, m for message, b for bang, f for number, c for comment, t for toggle, s for slider. It's fast, and easy to remember.
I'd like to have custom key bindings. I haven't figured out an interface for them yet, so if you have any ideas let me know.
However, that only solves half of your issue. You still have to use mouse clicks to draw all the lines. I've got an idea for navigating the patch and creating lines by leveraging canvas "Find", but it's still in the planning stage.
In the meantime, you could take advantage of the following speedups in Pd-l2ork/Purr Data:
- If you select two objects-- like
[unpack 0 0 0]and
[pack 0 0 0]-- then make a connection between them, the rest of the inlet/outlet pairs will get a connection between them.
- If you want to connect one object to many objects-- let's say connecting
[bng]to a bunch of message boxes-- select the message boxes and make a connection from
[bng]to the first one. An additional connection will be made to the other message boxes.
- If you want to connect many objects to one inlet, select the many objects, make a connection to the one object, and the rest will be connected to the same inlet.
Hope that helps
C74 and my definitive Return2Pd
Again C74 shits on your users, as he makes enough with Pluggo.
Arbitrary changes and are not consulted frequently, but a change of license which means C74 owns everything that is created in Gen development tool, it really is a gesture of usury only expect from a corporation like Microsoft.
Many users have been developing in Gen since leaving, and read attentively the license before investing money, time and other resources to learn and develop.
Copyright (c) 2012 Cycling ’74
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies
or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Cycling ’74 License for Max-Generated Code for Export
Copyright (c) 2016 Cycling ’74
The code that Max generates automatically and that end users are capable of exporting and using, and any
associated documentation files (the "Software") is a work of authorship for which Cycling ’74 is the author
and owner for copyright purposes. A license is hereby granted, free of charge, to any person obtaining a
copy of the Software ("Licensee") to use, copy, modify, merge, publish, and distribute copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The Software is licensed to Licensee only for non-commercial use. Users who wish to make commercial use of the
Software must contact the copyright owner to determine if a license for commercial use is available, and the
terms and conditions for same, which may include fees or royalties. For commercial use, please send inquiries
to licensing (at) cycling74.com. The determination of whether a use is commercial use or non-commercial use is based
upon the use, not the user. The Software may be used by individuals, institutions, governments, corporations, or
other business whether for-profit or non-profit so long as the use itself is not a commercialization of the
materials or a use that generates or is intended to generate income, revenue, sales or profit.
The above copyright notice and this license shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
My return to Pd...
Is there a function that works like a table but with only one value?
in short: it's 1 float stored in 1 object of a separate data structure referenced by a pointer in each value object
in longer: when you create a value object with a given name. it checks to see whether a second class called vcommon has any objects that share the same name as the new value object. If not, it creates a vcommon object with that name and stores the float value inside. Then the value stores the pointer to this float and looks up that float using a pointer whenever it needs to modify or get the value (as do all of the other value objects that share the same name). The vcommon object knows how many value objects share it's name (a "reference count") and when the last value object with the same name is deleted, so is the vcommon object
iOS - Release archive with tilde objects will not run on 64 bit devices
I'm building an app using libpd and OpenFrameworks for iOS using Xcode 7. If I archive and install the app using a Release scheme, the app will run fine on 32 bit devices but not on 64 bit devices (an installed debug archive will run fine on either) - you can read some of the details re the crash log here:
The crash almost always occurs on lines that involve loading tilde objects, and I've found some possibly related info re Apple's 64 bit transition guide here:
In particular, I'm suspicious of the 'variadic function' issue, since the libpd code does contain variadic functions that appear to be used when tilde objects are loaded. What I know for sure is that as soon as I remove all tilde objects, I have no problems.
I'd be curious to know if anyone here has been able to successfully run a release archive using tilde objects on a 64 bit device? (i.e. Am I barking up the wrong tree or the right one?)
Needless to say, any other hints will be most welcome!
How to create multiple objects at once? Many objects with increasing arguments?
@lacuna I am about to be away without internet for 3 days...... so...... I will describe how it works and post another example....
Each object that you create in the subpatch has a reference within Pd...... a number... which depends on the order in which they are created..... so.....
Your 123 objects will have numbers 1-123..........
But you want to add some other objects. If you add an [outlet~] or [*~ 0.3] before you add your abstractions then that will be object 1 and your abstractions will be objects 2-124. You must be rigorous about the order in which you place the objects.
In this example......... example.pd There are already 3 objects placed in the sub-patch...... open [pd mixer_final] to have a look.
The patch then builds the objects and connects them.....
There is a [loadbang] to say how many of each object should be created, and that creates a [matrix~] with the correct number of inputs and outputs.
Lots of error messages appear in the terminal because the rest of the patches are missing... it does not matter for this example.
The [connect( messages are formatted like this..... [connect "object number" "outlet number" "object number" "inlet number"( and the inlet and outlet numbers are counted from 0-n...... first one "0"......
I do hope that is all makes sense!
Hit the bang at the top of the patch to see everything created in the sub-patch......
Implementing a low-pass filter
Well first, to be clear, the part inside the square brackets is just the Blackmann window. The fraction to the left (without K) is the sinc function.
Secondly, for sin(x), x itself is not a frequency and therefore should not go in the frequency inlet of [osc~]. It's more like a phase input, if you were treating sin() as an oscillator (which it isn't in this case). If you wanted to use dsp object to make this, you'd be better suited using [expr~ sin($v1)]. You could also use [cos~] but it expects a normalized phase, not radians, and needs a phase offset to make it act like sin().
Since FIR filters like these use convolution and tend to have long kernels, implementing it with vanilla objects can be a nightmare. You could probably use the FFT objects to do it, but since the overlap is based on the kernel size you might be restricted on what sizes you can use (I'm not entirely sure about that, though, never tried it).
I used to use [iemlib/FIR~] for it, but it doesn't seem to be working on 64-bit systems. You can use [bsaylor/partconv~], though. It does partitioned convolution and is meant for long IRs, but it works just fine for FIR filters as well. The annoying thing is that whenever you update the kernel you have to resend it to [partconv~] and you get some clicks and messages in the console when you do that.
Attached is an implementation. M is variable, between 3 and 255. As you can see, M doesn't actually need to be even. Odd values for M just place a zero at the Nyquist frequency, so the roll-off at high frequencies is different for even and odd values. I just used [until] to generate the kernel, so no dsp objects needed.
multiple messages - no such object
I use class_addmethod to register a message receiver,
everything works fine if I send messages independently
but once I put all messages ( separrated by semi colon ) in a single message object
then the first message is treated correctly, but for other messages, I get
message2: no such object
message3: no such object
message4: no such object
message5: no such object
can someone enlight me on this ? I just want to avoid multiple message boxes
Pd Internal Messages "remove object"
There are 3 options that I am aware of:
Easiest but not Vanilla: [iemguts/canvasdelete]. Once this object is loaded, you can send a delete message to the canvas, ie. "delete 2" will delete the 2nd object on the canvas (0 being the first). Note that you send this message to the canvas itself, not the [canvasdelete] object. The object just needs to be there in the patch, even if nothing is connected to it.
A "clear" message will delete everything in a patch window. This is usually no good, but depending on your needs you might be able to make a small sub-patch with one object plus a send and receive. The send and receive will be deleted as well, so you'll need to recreate and reconnect these if you want to re-make the object (inlets and outlets should be avoided for the same reason). But this can still work.
The other is a horrible hack involving simulated mouse messages. Basically you send all the messages that the mouse would have sent to delete the object (go to this coordinate, select the object, press delete, etc). This is documented (badly) in manuals-->pd-msg-->1... --> 3.2 cut_paste.
1 is definitely the easiest, if you can afford to use externals.
udpsend and receive
@toddak Phew...... finally a connection.
We can try to break it in a minute.
Yes, you have installed a very recent Vanilla... not extended.
I don't know the osc vanilla objects at all...... but @alexandros has sent you some help below!
OSC messages are just messages like "page1/fader3 0.2345" but they are sent as a string of data and the [packOSC] and presumably the [oscformat] objects will do that conversion.
Then [oscparse] will break up the message according to (and removing) the forward slashes.....
That can be done in a number of ways in extended without using osc objects at all but........ ..
Right-click [oscformat] for help...... the same goes for all objects.
Yes for [netsend] and [netrecieve] you can give your message a "header" like "param1" "param2".
Pure data works with lists, and adding a header has made the message into a list. If you attach a print object to the outlet of something you will see what messages are passing through. So if you send messages that are "lists"....... "param1 0.5" param2 0.75" and you send them to [route param1 param2] you will see your messages 0.5 and 0.75 drop out of the relevant outlets (it creates an outlet for every argument + one for any list that doesn't match).....
So........ aargh........ networking
http://manual.aptosid.com/en/inet-setup-en.htm is a reasonably good explanation from someone else in Melbourne, although a little complicated, but then it's never easy!.
Always make a backup before you change things......
and then try this. It should boot to your network every time (the wifi dongle must be plugged in at boot) and it should give you the same address on the ethernet connection if the wireless is not working..... AND....... it should try to reconnect to your network if it loses the connection.
If you cannot make it work with wpa-roam then change that to wpa-conf for now.
wpa-roam is what will allow your pi to reconnect if the connection is lost.
pi ip conf.txt