From 63305a132cf1a72e8d53d283471f0258d0f52bc7 Mon Sep 17 00:00:00 2001 From: Gerard van Dongen Date: Sat, 18 Oct 2003 13:20:49 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r1104, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/beatpipe/; revision=1105 --- .deps/beatpipe.Po | 1 + GnuGPL.txt | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README | 8 ++ beatpipe.c | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++ help-beatpipe.pd | 54 ++++++++++ makefile | 23 +++++ 6 files changed, 653 insertions(+) create mode 100644 .deps/beatpipe.Po create mode 100644 GnuGPL.txt create mode 100644 README create mode 100644 beatpipe.c create mode 100644 help-beatpipe.pd create mode 100644 makefile diff --git a/.deps/beatpipe.Po b/.deps/beatpipe.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/.deps/beatpipe.Po @@ -0,0 +1 @@ +# dummy diff --git a/GnuGPL.txt b/GnuGPL.txt new file mode 100644 index 0000000..fa0bef4 --- /dev/null +++ b/GnuGPL.txt @@ -0,0 +1,290 @@ +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This General +Public License applies to most of the Free Software Foundation's +software and to any other program whose authors commit to using it. +(Some other Free Software Foundation software is covered by the +GNU Library General Public License instead.) You can apply it to your +programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new free +programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone +to deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you distribute +copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis +or for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And +you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, +we want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS FOR +COPYING, DISTRIBUTION AND +MODIFICATION + +0. This License applies to any program or other work which contains a +notice placed by the copyright holder saying it may be distributed under +the terms of this General Public License. The "Program", below, refers +to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, either +verbatim or with modifications and/or translated into another language. +(Hereinafter, translation is included without limitation in the term +"modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of running +the Program is not restricted, and the output from the Program is +covered only if its contents constitute a work based on the Program +(independent of having been made by running the Program). Whether +that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the notices +that refer to this License and to the absence of any warranty; and give +any other recipients of the Program a copy of this License along with the +Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, and +can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based on +the Program, the distribution of the whole must be on the terms of this +License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based +on the Program. + +In addition, mere aggregation of another work not based on the +Program with the Program (or with a work based on the Program) on a +volume of a storage or distribution medium does not bring the other +work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding + machine-readable source code, which must be distributed under + the terms of Sections 1 and 2 above on a medium customarily + used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with + such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to control +compilation and installation of the executable. However, as a special +exception, the source code distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies the +executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy +the source code from the same place counts as distribution of the source +code, even though third parties are not compelled to copy the source +along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt otherwise +to copy, modify, sublicense or distribute the Program is void, and will +automatically terminate your rights under this License. However, parties +who have received copies, or rights, from you under this License will not +have their licenses terminated so long as such parties remain in full +compliance. + +5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all +its terms and conditions for copying, distributing or modifying the +Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms +and conditions. You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. You are not responsible +for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot distribute +so as to satisfy simultaneously your obligations under this License and +any other pertinent obligations, then as a consequence you may not +distribute the Program at all. For example, if a patent license would not +permit royalty-free redistribution of the Program by all those who +receive copies directly or indirectly through you, then the only way you +could satisfy both it and this License would be to refrain entirely from +distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents +or other property right claims or to contest validity of any such claims; +this section has the sole purpose of protecting the integrity of the free +software distribution system, which is implemented by public license +practices. Many people have made generous contributions to the wide +range of software distributed through that system in reliance on +consistent application of that system; it is up to the author/donor to +decide if he or she is willing to distribute software through any other +system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be +a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an +explicit geographical distribution limitation excluding those countries, so +that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new +versions of the General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number +of this License, you may choose any version ever published by the Free +Software Foundation. + +10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be guided by the +two goals of preserving the free status of all derivatives of our free +software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF +CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, +TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT +WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD +THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE +COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW +OR AGREED TO IN WRITING WILL ANY COPYRIGHT +HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED +ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING +ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT +LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE +WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR +OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS diff --git a/README b/README new file mode 100644 index 0000000..093f564 --- /dev/null +++ b/README @@ -0,0 +1,8 @@ +This is a realtime scheduler/event-delay/quantizer. +See the help patch. + +Bugs and reactions to gml@xs4all.nl + + + +Gerard van Dongen diff --git a/beatpipe.c b/beatpipe.c new file mode 100644 index 0000000..05970cd --- /dev/null +++ b/beatpipe.c @@ -0,0 +1,277 @@ +/* beatpipe externals for pd + * copyright 2003 Gerard van Dongen gml@xs4all.nl + +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + + +* objects: +* beatpipe +* schedules and quantizes lists. A realtime qlist, sort of. + + */ + + + +#include "m_pd.h" +#include +static t_class *beatpipe_class; + + +typedef struct queue_node{ + float time; + int argc; + t_atom *argv; + struct queue_node * next; + struct queue_node * previous; +}t_queue; + +typedef struct { + t_object x_obj; + t_queue *queue; + t_clock *x_clock; + double current_beat; + t_float tempo; + t_float tpq; + double delay; + int frozen; + t_outlet *queue_out,*done_out; +}t_beatpipe; + + + + +void beatpipe_tick(t_beatpipe *x) +{ + + + x->current_beat = x->current_beat + 1/x->tpq; + x->delay = 60000/(x->tempo*x->tpq);//to _milisecs_!! + if (x->frozen) return; + + while (x->queue) { + //pop of events of the top of the list + + if (x->current_beat >= x->queue->time) { + + t_queue *temp; + temp = x->queue; + outlet_anything(x->queue_out,&s_list,x->queue->argc,x->queue->argv); + x->queue = x->queue->next; + freebytes(temp->argv,temp->argc*sizeof(t_atom)); + freebytes(temp,sizeof(t_queue)); + + //if empty put out a bang on the right outlet: + if (!x->queue) outlet_bang(x->done_out); + + + } else { + break; + } + } + clock_delay(x->x_clock,x->delay); + + +} + +void beatpipe_bang(t_beatpipe *x) +{ + x->frozen = 0; + beatpipe_tick(x); +} + +void beatpipe_freeze(t_beatpipe *x) +{ + x->frozen =1; +} +void beatpipe_sync(t_beatpipe *x) +{ + x->frozen = 0; + clock_unset(x->x_clock); + beatpipe_tick(x); +} +void beatpipe_syncbeat(t_beatpipe *x) +{ + x->frozen = 0; + clock_unset(x->x_clock); + x->current_beat =floor(x->current_beat+1.0); + beatpipe_tick(x); + +} + +void beatpipe_set_tpq(t_beatpipe *x,t_floatarg tpq) +{ + x->tpq = tpq; + if (x->tpq == 0) x->tpq = 96; +} + + +void beatpipe_clear(t_beatpipe *x) +{ + while (x->queue) { + t_queue *temp; + temp = x->queue; + freebytes(x->queue,sizeof(t_queue)); + x->queue = temp->next; + } +} + + + + +void beatpipe_list(t_beatpipe *x,t_symbol *s,int argc, t_atom* argv) +{ + t_float beat; + t_queue *new; + t_queue * temp; + t_queue * previous; + + beat = atom_getfloatarg(0,argc,argv); + // if time<=0 (or first element of list is not a number)output immediatly + if (beat<=0.0) { + outlet_anything(x->queue_out,s,argc-1,argv+1); + return; + } + + beat=beat+x->current_beat; + + //now insert in the queue + + new = getbytes(sizeof(t_queue)); + new->time = beat; + new->argc = argc-1; + new->argv = copybytes(argv+1,new->argc * sizeof(t_atom)); + + + //is queue empty? + if (!x->queue) { + + + x->queue = new; + new->next = NULL; + new->previous = NULL; + return; + } + + //now walk the queue + + temp = x->queue; + + while (temp) { + + if (!temp->next) { + temp->next = new; + new->previous = temp; + return; + } + + if (beat > temp->time) { + temp= temp->next; + + } else { + if(!temp->previous) { + x->queue = new; + new->next = temp; + new->previous = NULL; + return; + } + new->previous = temp->previous; + temp->previous = new; + new->next = temp; + temp= new->previous; + temp->next= new; + return; + } + } + + + + + +} + +void *beatpipe_new(t_floatarg tempo,t_floatarg tpq) +{ + + + t_beatpipe *x =(t_beatpipe *)pd_new(beatpipe_class); + + x->x_clock = clock_new(x, (t_method)beatpipe_tick); + + + x->queue = NULL; + + if (tempo != 0.0) + x->tempo = tempo; + else + x->tempo = 60.0; + + if (tpq !=0.0) + x->tpq = tpq; + else + x->tpq = 96.0; + + + x->current_beat = 0; + x->delay = (double) 60000/(x->tempo*x->tpq);//to _milisecs_!! + floatinlet_new(&x->x_obj,&x->tempo); + + clock_delay(x->x_clock,x->delay); + + x->queue_out=outlet_new(&x->x_obj,0); + + x->done_out=outlet_new(&x->x_obj, &s_bang); + x->frozen = 0; + return (x); + +} + +void beatpipe_free(t_beatpipe *x) +{ + clock_free(x->x_clock); + + while (x->queue) { + t_queue *temp; + temp = x->queue; + freebytes(x->queue,sizeof(t_queue)); + x->queue = temp->next; + } + +} + + +void beatpipe_setup(void) +{ + + + beatpipe_class = class_new(gensym("beatpipe"), + (t_newmethod)beatpipe_new, + (t_method)beatpipe_free, + sizeof(t_beatpipe), + CLASS_DEFAULT, + A_DEFFLOAT, + A_DEFFLOAT,0); + + class_addbang(beatpipe_class,(t_method) beatpipe_bang); + + class_addmethod(beatpipe_class, (t_method)beatpipe_clear,gensym("clear"),0); + class_addmethod(beatpipe_class, (t_method)beatpipe_sync,gensym("sync"),0); + class_addmethod(beatpipe_class, (t_method)beatpipe_syncbeat,gensym("sync-beat"),0); + class_addmethod(beatpipe_class, (t_method)beatpipe_set_tpq,gensym("set-tpq"),A_DEFFLOAT,0); + class_addmethod(beatpipe_class, (t_method)beatpipe_freeze,gensym("freeze"),0); + class_addmethod(beatpipe_class, (t_method)beatpipe_bang,gensym("continue"),0); + class_addlist(beatpipe_class,(t_method) beatpipe_list); + class_sethelpsymbol(beatpipe_class,gensym("help-beatpipe")); + + +} diff --git a/help-beatpipe.pd b/help-beatpipe.pd new file mode 100644 index 0000000..81a940c --- /dev/null +++ b/help-beatpipe.pd @@ -0,0 +1,54 @@ +#N canvas 1197 112 488 497 10; +#X obj 162 461 beatpipe 120 16; +#X msg 242 341 1 one; +#X msg 242 392 3.75 and almost four; +#X obj 244 305 bng 30 250 50 0 empty empty click-me! 0 -6 0 12 -233017 +-1 -33289; +#X obj 162 509 print; +#X obj 408 305 vsl 25 128 30 300 0 0 empty empty tempo-in-BPM -40 -8 +0 12 -262144 -1 -1 0 1; +#X floatatom 408 446 5 0 0 0 - - -; +#X msg 22 281 set-tpq 4; +#X msg 162 379 bang; +#X msg 26 382 sync; +#X msg 27 412 sync-beat; +#X msg 162 347 freeze; +#X msg 30 442 clear; +#X msg 87 380 continue; +#X text 147 384 =; +#X obj 265 508 print done; +#X text 20 101 After the last list in the pipe \, a bang is sent to +the right outlet.; +#X text 20 134 A freeze message will suspend scheduling until a continue/bang +or sync/sync-beat message A sync message will immediatly call the next +tick. A sync-beat message will immediatly call the next whole beat. +A clear message will clear the pipe \, but not sent a done message. +Lists starting with 0 (or less) or a symbol will be output immediatly +and will not be quantized.; +#X text 20 -10 a event scheduler/quantizer Any list starting with a +number T sent to the left inlet \, will be sent to the output after +T beats \, quantized with tpq (tick per quarter) and stripped of the +leading beat number. The tempo can be changed dynamically on the right +inlet The quantification can be set at any time with a set-tpq message. +; +#X msg 242 416 16 and after sixteen; +#X msg 242 369 2 and two 3.14159; +#X connect 0 0 4 0; +#X connect 0 1 15 0; +#X connect 1 0 20 0; +#X connect 1 0 2 0; +#X connect 1 0 19 0; +#X connect 1 0 0 0; +#X connect 2 0 0 0; +#X connect 3 0 1 0; +#X connect 5 0 6 0; +#X connect 6 0 0 1; +#X connect 7 0 0 0; +#X connect 8 0 0 0; +#X connect 9 0 0 0; +#X connect 10 0 0 0; +#X connect 11 0 0 0; +#X connect 12 0 0 0; +#X connect 13 0 0 0; +#X connect 19 0 0 0; +#X connect 20 0 0 0; diff --git a/makefile b/makefile new file mode 100644 index 0000000..88a4c64 --- /dev/null +++ b/makefile @@ -0,0 +1,23 @@ +# where is your m_pd.h ??? + +LINUXINCLUDE = -I/usr/local/include + + + + +beatpipe: beatpipe.c + gcc $(CFLAGS) $(LINUXCFLAGS) $(LINUXINCLUDE) -o beatpipe.o -c beatpipe.c + ld -export_dynamic -shared -o beatpipe.pd_linux beatpipe.o -lc -lm + strip --strip-unneeded beatpipe.pd_linux + rm beatpipe.o + + +install: + + cp help-beatpipe.pd /usr/local/lib/pd/doc/5.reference + cp beatpipe.pd_linux /usr/local/lib/pd/externs + + +clean: + rm beatpipe.pd_linux + -- cgit v1.2.1