- बिना instruments और equipment के भी music बनाने का माहौल देने वाले Sonic Pi का परिचय दिया गया है, और Ruby-आधारित DSL से notes, chords, scales और timing सीधे लिखे जा सकते हैं
- Ruby के functions, arrays, conditionals, loops और scope का उपयोग करके
play,sleep,play_pattern_timed,chord,scaleको जोड़कर दोहराए जाने वाले patterns और arpeggio संक्षेप में बनाए जा सकते हैं in_thread,ring,flatten, splat operator औरwith_fxको मिलाकर कई “instruments” साथ-साथ चलाए जा सकते हैं और overlapping notes तथा अलग rhythms की layering की जा सकती है- ADSR envelope में
attack,decay,sustain,releaseको adjust करना असली choir को reproduce करने से ज़्यादा sustain duration और separation मिलाने पर केंद्रित है live_loopचलते हुए code को update करते हुए loop में चला सकता है, जिससे Sonic Pi live performance tool बनता है और code को पढ़े जाने वाले text तथा creative act के रूप में देखने देता है
Code से नियंत्रित Sonic Pi
- Sonic Pi सामान्य audio applications से अलग, सिर्फ code से नियंत्रित होने वाला software synthesizer है
- इसकी अपनी control language Ruby को extend करने वाली domain-specific language (DSL) है, जो music और audio concepts को Ruby syntax पर map करती है
- बुनियादी elements Ruby values और Sonic Pi functions से बने होते हैं
:c4जैसे note names संबंधित MIDI code से मेल खाने वाले symbols के रूप में उपयोग होते हैंchord(:d3, :maj7)की तरह root note और chord structure को arguments के रूप में लेकर chord बनाया जा सकता हैplaynote बजाता है, और Ruby केsleepके साथ time interval को control करता हैplay_pattern_timednotes की list और time interval लेकर repeated playback code को छोटा कर देता है
- example का लक्ष्य external MIDI या samples के बिना केवल Sonic Pi की basic features से demo accompaniment को code में बनाना है
- Sonic Pi app install करने पर example code paste करके follow किया जा सकता है, और language documentation व tutorials भी built-in मिलते हैं
Ruby syntax से repeated patterns बनाना
- basic example
use_bpm 70से BPM बदलता है, औरuse_synth :pulseसे default sine wave की जगह pulse synthesizer इस्तेमाल करता है play :c2,sleep 0.25को दोहराने पर notes क्रम से बजाए जा सकते हैं, औरplay_pattern_timed [ :c3, :d3, :e3, :g3 ], 0.25से वही structure और छोटा लिखा जा सकता है- control language Ruby के ऊपर है, इसलिए functions और loops से patterns को abstract किया जा सकता है
arpeggiatefunction root note और optional minor flag लेकर ascending-descending pattern बनाता है4.timesloop से वही pattern कई octaves में चलाया जाता है- conditional से minor होने पर तीसरा note बदला जाता है, और array के
mapसे root note में intervals जोड़कर notes की list बनाई जाती है
use_synth_defaults amp: 0.1की तरह synthesizer default options पहले set किए जा सकते हैं, औरplayयाplay_pattern_timedको सीधे options भी दिए जा सकते हैं- Ruby में function call parentheses optional होते हैं, लेकिन
play chord(:a3, maj7)जैसे cases में distinction स्पष्ट करना पड़ सकता है
Parallel execution और layering
in_thread doblock Sonic Pi में code को parallel चलाने के लिए इस्तेमाल होता है- अलग-अलग
in_threadblocks रखने पर दो अलग “instruments” एक साथ चलाए जा सकते हैं- एक thread arpeggio pattern संभाल सकता है
- दूसरा thread
use_synth :sawऔर melody array, rhythm array का उपयोग कर अलग melody बजा सकता है
play_pattern_timednotes की list के साथ-साथ time intervals की list भी ले सकता है[1] * 2array की length बढ़ाकर contents को repeat करता है, जैसे[1, 1]- nested arrays को
play_pattern_timedसीधे स्वीकार नहीं करता, इसलिएflattenसे उन्हें एक-level array में फैलाकर उपयोग किया जाता है
- choir की तरह overlapping notes बनाने के लिए
ring(:c5, :e5)जैसे कई notes को साथ bundle किया जा सकता है flattenringके अंदर की list तक merge कर सकता है, इसलिए इस case में splat operator*से list contents को parent array में फैलाने का तरीका इस्तेमाल किया जाता है
Scope, effects और choir parts की रचना
- nested
in_threadइस्तेमाल करने पर outer scope के rhythm fragments share करते हुए भी, inner threads में वही variable names फिर से इस्तेमाल किए जा सकते हैं - soprano और alto जैसे parts को अलग threads में बाँटने पर हर block का अपना scope होता है, इसलिए वे एक-दूसरे के variables को सीधे access नहीं करते
with_fx :reverb, mix: 0.2effect block बनाता है, और signal flow सबसे inner layer से शुरू होकर outer effect chain की ओर जाता हैmixwet signal और dry signal के blending amount को दर्शाता है- wet signal वह signal है जिस पर effect लागू किया गया है
- dry signal वह signal है जिस पर effect नहीं है
- पूरी group को एक effect से wrap करना DAW के bus की तरह इस्तेमाल किया जा सकता है, लेकिन deeper routing manual होती है और scope के कारण आम तौर पर ऊपर से नीचे तक compose करना पड़ता है
- Sonic Pi को sophisticated production tool से ज़्यादा instrument की तरह treat करना अधिक natural है
ADSR envelope से note length मिलाना
play_pattern_timedsustainvalue जोड़ता है, इसलिए long chords और short chords की sustain duration सीधे match की जा सकती हैattack,decay,sustain,releaseADSR envelope हैं, जो बताते हैं कि volume समय के साथ कैसे बदलता हैattack0 से पहली peak तक पहुँचने का समय है, और guitar string pluck करने या piano hammer लगने के क्षण जैसे initial impact से संबंधित हैdecayपहली peak से नीचे आने का समय है, और piano key या guitar string दबाए रखने पर भी sound धीरे-धीरे कम होने वाले section से संबंधित हैsustainstable volume पर sound को बनाए रखने का समय है, और bow से बजाई गई string या long vocal जैसे sustained sounds से संबंधित हैreleasesound छोड़ने के बाद वास्तव में quiet होने तक का समय है
- हर sound में ADSR के सभी elements हों, ऐसा ज़रूरी नहीं है
- synthesizer tone generated sound है, इसलिए उसमें initial buildup या reverberation होना अनिवार्य नहीं है
- natural instruments में playing style के अनुसार elements का ratio बदलता है
- example का choir simulation realism से ज़्यादा इस बात पर focus करता है कि notes ठीक समय तक sustain हों और chords के बीच हल्की separation बने
choral_rings notes, susfunction notes की list और sustain time लेकरring(*notes)से उन्हें साथ बजाता है,sustainऔरreleasecalculate करता है, फिरsleep susसे अगले event तक इंतज़ार करता है
live_loop से live coding
live_loopइस्तेमाल करने पर code को अनिश्चितकाल तक repeated चलाया जा सकता है- Sonic Pi live performance को काफी ध्यान में रखकर बनाया गया tool है, और
live_loopके अंदर का code program रुकने तक चलता रहता है - playback के दौरान भी loop contents बदले जा सकते हैं, और start command दोबारा चलाने पर अगले iteration से updated loop लागू हो जाता है
- मौजूदा outer
in_threadloops कोlive_loop :some_unique_nameके रूप में बदला जा सकता है - effect chain हर loop run पर फिर से बनती है, इसलिए जितने ज़्यादा effects stack हों, resource के लिहाज़ से उन्हें
live_loopके बाहर रखना सस्ता पड़ता है - final example
live_loop :harpऔरlive_loop :choirसे बना है:harploop:squaresynthesizer और 0.25 length वाले arpeggio pattern का उपयोग करता है:choirloop:sawsynthesizer,sleep 64,with_fx :reverb, mix: 0.75,choral_ringsfunction calls से choir chords बजाता है
Programming को creative act के रूप में देखना
- technical work पर आम तौर पर computer science के नजरिए से चर्चा होती है, लेकिन programming भी art हो सकती है
- audio generation या CSS layout की तरह जानबूझकर creative output बनाने पर ही वह artistic हो, ऐसा नहीं है
- code केवल machine-optimized commands नहीं, बल्कि अन्य लोगों और भविष्य के अपने लिए पढ़ा जाने वाला organized text है
- अच्छा code वह है जिसे दूसरे लोग या 6 महीने बाद का आपका खुद का version एक नज़र में समझ सके
- कभी-कभी code की artistry अपने आप में उद्देश्य बन जाती है, और Sonic Pi example music production के जरिए यही point दिखाता है
1 टिप्पणियां
Hacker News की राय
अगर आपको लाइव कोडिंग में दिलचस्पी है, तो Glicol(https://glicol.org) भी आज़माने लायक है
TidalCycles भी है, और Haskell व Ruby की DSL बनाने की क्षमता सचमुच काबिले-तारीफ है
Glicol में सिंथेसाइज़र से प्रेरित syntax, composition की speed, और sound design की सुविधा पर focus है। विचार यह है कि मौजूदा programming habits को साथ रखते हुए ऐसा DSL design किया जाए जो किसी खास language में कैद न हो
https://github.com/tidalcycles/strudel
कुछ साल पहले YouTube पर किसी को Sonic Pi से THX Deep Note recreate करते हुए देखा था
शुरुआत में उसने यह नहीं बताया कि वह क्या बनाने वाला है, और sound की एक अकेली “note” बनाते हुए उसे मधुमक्खी कहा। फिर उसने उस मधुमक्खी की आवाज़ को धीरे-धीरे tweak करके सुनाया, और अंत में कुछ ऐसा कहा, “चलो ऐसी कुछ सौ मधुमक्खियाँ बनाते हैं और देखते हैं कि छत्ते में यह कैसी सुनाई देती हैं”; उसी पल Deep Note सामने आ गया
वह video वाकई शानदार था, लेकिन उसके बाद फिर कभी नहीं मिला। अगर किसी को link पता हो तो कृपया share करें
मेरे हिसाब से यह उन cases में से एक है जहाँ Ruby चमकती है। metaprogramming की वजह से syntax को लगभग English जैसा दिखाया जा सकता है
कुछ साल पहले मैंने Sam Aaron, यानी Sonic Pi के creator, को Sonic Pi के साथ live perform करते देखा था
जैसे-जैसे code real time में बदलता था, music भी लगातार evolve होता गया, और वह सच में अच्छा था
अगर Sonic Pi इस्तेमाल करने वाले artists के examples चाहिए, तो पहले मुझे DJ_Dave के बारे में पता चला था; मेरे हिसाब से यह एक talented और skilled musician द्वारा इस tool का अच्छा इस्तेमाल करने का बढ़िया example है
उन्होंने पहले Reddit पर AMA भी किया था, और लगता है GitHub पर भी उनका काम मौजूद है
[1] https://www.youtube.com/watch?v=JiQHclg_648
[2] https://www.reddit.com/r/audius/comments/19dxmy6/hey_audius_...
[3] https://github.com/algorave-dave
Ruby developer के तौर पर यह सचमुच बहुत cool दिखता है। algorithmic generative music में इस्तेमाल करना मज़ेदार होगा, और मैं noisy git repository events को किसी algorithmic music में बदलकर देखना चाहता था—यह उसके लिए काफी उपयुक्त लगता है
लेकिन कई keyboard instruments रखने वाले musician के नजरिए से, अगर कोई piece compose करना हो तो MIDI keyboard पर play कर सकते हैं या acoustic instrument record करके loop बना सकते हैं; फिर Ruby में music sequence लिखने की ज़रूरत क्यों पड़े, यह मुझे साफ नहीं लगता। मुझे पता है कि Ruby DSL में मनचाही चीज़ type की जा सकती है, लेकिन piano keyboard की तुलना में इसे बेहतर user experience कहना मुश्किल है
दूसरे शब्दों में, Logic को replace करने के लिए मैं शायद इसे इस्तेमाल नहीं करूँगा। बेशक यह निजी preference है
संदर्भ: http://listen.hatnote.com/
असल में कई बार हम “अब C minor arpeggio, अब F major arpeggio” जैसा सोचते हैं, और ऐसी intent को functions के जरिए बहुत स्पष्ट रूप से compose कर पाना अच्छी बात है
हर note को play करने के बजाय algorithm से generate करना ही इसका मुख्य point लगता है
फिर भी, ऐसे tools को unusual constraints की वजह से दिलचस्प तरीके से इस्तेमाल करना, जिन्हें आम तौर पर कोई न इस्तेमाल करे, Hacker News की रुचि से काफी मेल खाता है
मेरे पास पसंदीदा keyboard है और theoretically इसे इस काम के लिए इस्तेमाल भी कर सकता हूँ, लेकिन निजी तौर पर कुछ complex circumstances के कारण सारे instruments कुछ समय से storage में पड़े हैं
कुछ दिन पहले ही Sonic Pi के बारे में सोच रहा था और कुछ online videos देखे
कुछ साल पहले बस थोड़ी देर छेड़ा था, और तब classical Old MacDonald और Hot Cross Buns जैसी धुनें बना कर देखी थीं
अगर music programming के किसी दूसरे approach में रुचि है, तो live नहीं है, लेकिन Python के लिए scamp[0] भी देखने लायक है
इसके creator ने YouTube पर इससे किए गए काम के कई videos डाले हैं; उदाहरण के लिए Fourier Elise video[1] है
[0] http://scamp.marcevanstein.com/
[1] https://www.youtube.com/watch?v=zq32bIud3OM
लगता है HTML comments लागू नहीं हो रहे। शायद editor ने
--दो hyphens को—एक em dash में बदल दिया हैमेरे पसंदीदा Sonic Pi live coder alsoknownasrox की भी recommend करूँगा
https://www.youtube.com/watch?v=wXIvXrBQFkE