3 पॉइंट द्वारा GN⁺ 2024-08-11 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • बिना 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 बनाया जा सकता है
    • play note बजाता है, और Ruby के sleep के साथ time interval को control करता है
    • play_pattern_timed notes की 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 किया जा सकता है
    • arpeggiate function root note और optional minor flag लेकर ascending-descending pattern बनाता है
    • 4.times loop से वही 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 do block Sonic Pi में code को parallel चलाने के लिए इस्तेमाल होता है
  • अलग-अलग in_thread blocks रखने पर दो अलग “instruments” एक साथ चलाए जा सकते हैं
    • एक thread arpeggio pattern संभाल सकता है
    • दूसरा thread use_synth :saw और melody array, rhythm array का उपयोग कर अलग melody बजा सकता है
  • play_pattern_timed notes की list के साथ-साथ time intervals की list भी ले सकता है
    • [1] * 2 array की length बढ़ाकर contents को repeat करता है, जैसे [1, 1]
    • nested arrays को play_pattern_timed सीधे स्वीकार नहीं करता, इसलिए flatten से उन्हें एक-level array में फैलाकर उपयोग किया जाता है
  • choir की तरह overlapping notes बनाने के लिए ring(:c5, :e5) जैसे कई notes को साथ bundle किया जा सकता है
  • flatten ring के अंदर की 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.2 effect block बनाता है, और signal flow सबसे inner layer से शुरू होकर outer effect chain की ओर जाता है
  • mix wet 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_timed sustain value जोड़ता है, इसलिए long chords और short chords की sustain duration सीधे match की जा सकती है
  • attack, decay, sustain, release ADSR envelope हैं, जो बताते हैं कि volume समय के साथ कैसे बदलता है
    • attack 0 से पहली peak तक पहुँचने का समय है, और guitar string pluck करने या piano hammer लगने के क्षण जैसे initial impact से संबंधित है
    • decay पहली peak से नीचे आने का समय है, और piano key या guitar string दबाए रखने पर भी sound धीरे-धीरे कम होने वाले section से संबंधित है
    • sustain stable volume पर sound को बनाए रखने का समय है, और bow से बजाई गई string या long vocal जैसे sustained sounds से संबंधित है
    • release sound छोड़ने के बाद वास्तव में 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, sus function notes की list और sustain time लेकर ring(*notes) से उन्हें साथ बजाता है, sustain और release calculate करता है, फिर 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_thread loops को live_loop :some_unique_name के रूप में बदला जा सकता है
  • effect chain हर loop run पर फिर से बनती है, इसलिए जितने ज़्यादा effects stack हों, resource के लिहाज़ से उन्हें live_loop के बाहर रखना सस्ता पड़ता है
  • final example live_loop :harp और live_loop :choir से बना है
    • :harp loop :square synthesizer और 0.25 length वाले arpeggio pattern का उपयोग करता है
    • :choir loop :saw synthesizer, sleep 64, with_fx :reverb, mix: 0.75, choral_rings function 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 टिप्पणियां

 
GN⁺ 2024-08-11
Hacker News की राय
  • अगर आपको लाइव कोडिंग में दिलचस्पी है, तो Glicol(https://glicol.org) भी आज़माने लायक है
    TidalCycles भी है, और Haskell व Ruby की DSL बनाने की क्षमता सचमुच काबिले-तारीफ है
    Glicol में सिंथेसाइज़र से प्रेरित syntax, composition की speed, और sound design की सुविधा पर focus है। विचार यह है कि मौजूदा programming habits को साथ रखते हुए ऐसा DSL design किया जाए जो किसी खास language में कैद न हो

  • कुछ साल पहले YouTube पर किसी को Sonic Pi से THX Deep Note recreate करते हुए देखा था
    शुरुआत में उसने यह नहीं बताया कि वह क्या बनाने वाला है, और sound की एक अकेली “note” बनाते हुए उसे मधुमक्खी कहा। फिर उसने उस मधुमक्खी की आवाज़ को धीरे-धीरे tweak करके सुनाया, और अंत में कुछ ऐसा कहा, “चलो ऐसी कुछ सौ मधुमक्खियाँ बनाते हैं और देखते हैं कि छत्ते में यह कैसी सुनाई देती हैं”; उसी पल Deep Note सामने आ गया
    वह video वाकई शानदार था, लेकिन उसके बाद फिर कभी नहीं मिला। अगर किसी को link पता हो तो कृपया share करें

  • मेरे हिसाब से यह उन cases में से एक है जहाँ Ruby चमकती है। metaprogramming की वजह से syntax को लगभग English जैसा दिखाया जा सकता है

    • सही है, लेकिन Sonic Pi DSL natural language जैसा कम और थोड़ा Lisp जैसा ज़्यादा लगता है
    • हाँ, यह metaprogramming ही है
  • कुछ साल पहले मैंने Sam Aaron, यानी Sonic Pi के creator, को Sonic Pi के साथ live perform करते देखा था
    जैसे-जैसे code real time में बदलता था, music भी लगातार evolve होता गया, और वह सच में अच्छा था

    • मैं भी Sam से मिल चुका हूँ। करीब 2008–2010 में Clojure Conj में presentation देने के बाद हमने साथ dinner किया था; तब भी वे बहुत अच्छे इंसान थे और presentation भी बेहतरीन था
  • अगर 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/

    • फिर भी, कुछ मायनों में Ruby DSL MIDI sequence की तुलना में intent को ज़्यादा साफ तरीके से express करता है
      असल में कई बार हम “अब C minor arpeggio, अब F major arpeggio” जैसा सोचते हैं, और ऐसी intent को functions के जरिए बहुत स्पष्ट रूप से compose कर पाना अच्छी बात है
    • Sonic Pi सामान्य composition tool से ज़्यादा algorithmically generated music, खासकर live coding, पर focus करता लगता है
      हर note को play करने के बजाय algorithm से generate करना ही इसका मुख्य point लगता है
      फिर भी, ऐसे tools को unusual constraints की वजह से दिलचस्प तरीके से इस्तेमाल करना, जिन्हें आम तौर पर कोई न इस्तेमाल करे, Hacker News की रुचि से काफी मेल खाता है
    • coordination और fine motor skills की कमी वाले music theorist के लिए यह fit हो सकता है
    • मूल पोस्ट में भी इशारा था, लेकिन ज्यादातर वजह practical constraints ही हैं
      मेरे पास पसंदीदा 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 में बदल दिया है

    • सही पकड़ा। दरअसल find/replace बहुत जल्दी-जल्दी चलाते हुए मैंने ऐसी कुछ जगहें miss कर दीं XD
  • मेरे पसंदीदा Sonic Pi live coder alsoknownasrox की भी recommend करूँगा
    https://www.youtube.com/watch?v=wXIvXrBQFkE