Jump to content

Rangarajan

Members
  • Posts

    222
  • Joined

  • Last visited

Everything posted by Rangarajan

  1. Janusz, While I am waiting for your reply to my earlier queries, I want to ask one more doubt. The "osc-thread" function takes a finite list of data to be transmitted to the receiving controller. What if I want to send data continuously in a loop (like - forever)? Regards, Rangarajan
  2. Likewise, I would also like to know the meaning of the first argument to "gen-osc-data". The documentation uses the term "span", but I don't understand it fully. Sorry if I am giving too much trouble! Regards, Rangarajan
  3. Great! The example works now. Thanks for the help Janusz. I am trying to understand the finer details of this. 1) The third argument to "osc-thread" is a list of lists with two elements <controller-value, time>. What is the time unit assumed here? For example if a list element is '(0.5 1/2), what does "1/2" in this indicate? Is it 1/2 second, or something else? 2) Suppose the third argument to this function has 5 elements like this: '((a b) (c d) (e f) (g h) (I j)), what happens to the thread after it sends the last pair to the controller device? Does it get destroyed by itself? 3) Is there a way to check the status of any of these threads at any time after they have started? 4) Is there a way to destroy a thread and release its resource back to the runtime? Is that what (stop-osc-thread...) does? 5) Is it possible to re-start/re-use a thread? Regards, Rangarajan
  4. Thanks again for the example code. To test this example, I started Reaktor 6, and loaded the "Drive.ens" as you had suggested. Then enabled "OSC Activate" under "OSC Settings". To see if any OSC message was being received, I watched the "Incoming OSC Monitor" pane. I was able to run the example after making one minor correction - the variable "seed" had to be defined first (a minor issue). Also changed the IP address to what my Reaktor displayed under "OSC Settings". When I ran the example, nothing happened, but of course, there was no error message as well. "Incoming OSC Monitor" pane in Reaktor did not display anything, indicating it did not receive any message from outside. What is supposed to happen when the example program runs? 1) "osc-thread"function takes an ID as its second argument. Can you explain how this ID is mapped to a control on Reaktor? I believe this is crucial. Don't we also have to configure this appropriately in Reaktor? 2) What does "osc-thread" really do? Does it not send the data given to it to the controller at the other end? Would it be possible for you to include any additional code that is needed to actually make Reaktor play something (need not be interesting)? Right now I don't hear anything at all, so it is difficult to understand what is going on. Since OSC is a great addition to the current release of OM, it would be nice to include detailed documentation on the correct use of the feature. Regards, Rangarajan
  5. Thanks Janusz and Stephane! Let me work through the example and understand OSC support. Regards, Rangarajan
  6. Hi, I am getting back to Opusmodus after a long time. I am excited about the support for OSC in this new release. I have two questions: 1) Normally when we use OSC to send to a destination, we use an "address" like "/a/b/c". A device that has this destination "address" is expected to receive the message and act on it. How and where do we specify that address in "osc-thread" function. Just to give an example, a couple of years ago, I had written an article on how to control Reaktor using OSC. If I want to do something similar using OM, what is the procedure? 2) There could be occasions where I want to ping the destination at regular intervals. How do I do that in OM? A detailed example will be quite useful. Regards, Rangarajan
  7. Hi, A few weeks ago, I wrote about the Optima Pattern Matching library. In today's post, I have given a simple example of using the library to post-process a score, after reading a MIDI file. Regards, Rangarajan
  8. Sounds nice! Thanks for sharing the code. Regards, Rangarajan
  9. I hope to share some examples of use with OM in the next few posts. -Rangarajan
  10. As part of my research into other tools that can be used along with Opusmodus, in today's post I have given a basic introduction to the Optima Lisp library for pattern matching. I hope to continue the discussion in the next couple of posts as well. I think this library will be useful if we want to do any operations in Opusmodus involving pattern matching, for example, reading a score and looking for specific patterns in it. Regards, Rangarajan
  11. Seems like an interesting idea. When should we consider/prefer such a post-processing idiom? Any suggestions? Regards, Rangarajan
  12. Thanks a lot, SB, for sharing the code. -Rangarajan
  13. At the moment, I am blank on this. My limitation is that I do not have a music background, but I am reading a lot these days, so I am confident something will come up soon (hopefully). It would certainly help if people like you (both s/w and music expertise) and other musicians in our forum start to "introspect" on the creative process each goes through when composing, and then jot down notes, ideas, or whatever that comes to mind at that time. To me these are valuable artefacts that could be formalised eventually. When I get some inspiration, I will share in this forum. -Rangarajan
  14. For software development, we have requirement gathering tools, UML-like modelling tools, Design Patterns, IDEs for programming, and even software Testing tools. When it comes to music composition, if you are manually composing music, there are tools such as "Finale" for notating, or you can fall back on the ubiquitous "paper" for expressing your composition. On the other hand, if you use algorithmic composition, we have many tools such as Opusmodus, Open Music, SuperCollider, Max/MSP, and so on. I think what is missing, and what I feel is important, is a way to represent intermediate stages of composition, which is really the creative part. Just as in software development we say the design is more important than the final code, we should be able to independently study, understand and critique the compositional design of a musician. In fact, it might even be possible to automatically generate executable code from this intermediate design representation (just as in simple cases, UML design can be converted to code in any language). So what I am really proposing is to come up with a "Music Design Notation" for algorithmic composition. When I listen to some of Stephane's pieces, they sound good, but when I look at his code, his "design" insight is not obvious. This is true for any non-trivial program. On the other hand, if there was a MDN representation of his work, it might be easier to understand what is going on. Whether your final piece is rendered on paper, or Finale, or in Opusmodus, there is a great benefit to documenting the "higher" level design of the composition. Then we can even talk about "Design Patterns" in musical composition in a programming language-neutral way. For those of you who do not come from software background, I encourage you to read the works of Christopher Alexander, especially, "The Timeless Way of Building" (Oxford University Press, 1979). I have had this on my mind for a long time, so thought I will post it to see what others think. Regards, Rangarajan
  15. Nice and very realistic! Do you have a video of this session, and if you do, is it possible to share it? -Rangarajan
  16. Yes, I have also experienced this difficulty, for example, can't distinguish between 4/4 and 2/2 because both reduce to 1! As JP points out, this is a Lisp issue, nothing to do with OM. If we are adventurous, we could implement our own "data type", for example keeping numerator and denominator separately as a cons pair (numerator . denominator) or something similar. We can write a set of functions that operate on this, and then apply reduction when actually needed. More work, of course, but Lisp gives you control. Regards, Rangarajan
  17. Hi, Picat is a Prolog-derived language with good support for Constraint Programming. In today's blog, I have shown how to implement a simple CP-based function in Picat for chord/non-chord tone generation, and more interestingly, how we can interact with Picat from Opusmodus to get the results of the computation. To me, this opens up new possibilities for expanding what you can do from Opusmodus! Regards, Rangarajan
  18. I am the other way, so it helps to keep balance in the forum! -Rangarajan
  19. SB, Thanks. Useful function, I am sure. Thought I could re-write the function slightly differently, hope you don't mind: (defun gen-pitch-line2 (nb-pitch &key (compress 1) (ambitus '(c4 c6)) seed filter-repeat (type :white)) (let (pitches) (do-verbose ("gen-pitch-line2") (rnd-seed seed) (labels ((white-or-pink (nb-pitch seed type) (if (eq type ':pink) (gen-pink-noise nb-pitch :seed seed) (gen-white-noise nb-pitch :seed seed :type (if (eq type ':white) :normal type)))) (process (nb-pitch &key (compress 1) (ambitus '(c4 c6)) seed filter-repeat type) (setf pitches (vector-to-pitch ambitus (vector-smooth compress (white-or-pink nb-pitch seed type)))) (when filter-repeat (setf pitches (gen-trim nb-pitch (filter-repeat filter-repeat pitches)))) pitches) ) (process nb-pitch :compress compress :ambitus ambitus :filter-repeat filter-repeat :seed (seed) :type type))))) I hope I haven't messed up the logic! Regards, Rangarajan
  20. Janus, I find this discussion on tonality-series and tonality-map very informative. It seems to me that the documentation of both these functions could be substantially improved. For instance, I spent much time trying to understand tonality-series, but without much headway: 1) Where exactly would you use this function? 2) The argument list mentions the keyword "shift" and there is an example of its use, but what does this do? When to use it? 3) What is the role of "assoc"? 4) Should we supply "root" always, if not what is the default? 5) What is the meaning of "fixed"? 6) What is the use of "variant"? It was not obvious to me by looking at the documentation, that the first argument could be something like '((c4 maj) (f4 m)). In this case, the root is already specified, so should we additionally include :root '(c4 f4)? It appears unnecessary (I tried and it worked!) But for Torsten's sample code, I would not have guessed this possibility. And I know guessing is not always good in programming! Cross-references are also useful if this function is related to others. Having said this, I know how hard it is to document! -Rangarajan
  21. Hi Lasse, Glad you found it useful. Screamer is a powerful library and deserves more serious study in the context of music synthesis. -Rangarajan
  22. Hi, In today's blog post, I have shared some basic ideas about the Screamer Lisp library, with examples of how to start using it for constraint programming. The inspiration came from some earlier posts in OM forum on this topic. It was an exciting exercise and learnt a few interesting things! Regards, Rangarajan
  23. Thanks. I will look it up. -Rangarajan
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy