मैं आर का उपयोग करके जन्मदिन संगीत कैसे खेल सकता हूं? [बन्द है]


80

मैं आर का उपयोग करके संगीत खेलना चाहता हूं। जबकि आर इस उद्देश्य के लिए सबसे अच्छा उपकरण नहीं हो सकता है, यह वह उपकरण है जिससे मैं परिचित हूं और ऐसे खुशी के अवसर पर दूसरों को इसका लचीलापन प्रदर्शित करना अच्छा होगा।

मैं इसे कैसे पूरा कर सकता हूं?


7
आप R के माध्यम से BD संगीत क्यों बजाना चाहेंगे? आर एक सांख्यिकीय प्रोग्रामिंग भाषा है, मुझे यकीन है कि ऐसे कार्यों के लिए बेहतर मंच हैं।
डेविड आरनबर्ग

13
@DavidArenburg कि निश्चित रूप से सच है, लेकिन इस फाइल के पेज 33 पर एक नज़र डालें tinyurl.com/odlurth (यह पॉल मुरेल के "आर ग्राफिक्स" है)। तथ्य यह है कि कुछ करने के लिए बेहतर कार्यक्रम हैं हमें फेंग तियान (शायद इस प्रक्रिया में कुछ नया) की मदद करने से रोकने की कोशिश नहीं करनी चाहिए
MaZe

11
IMHO, उस प्रश्न के लिए कुछ योग्यता हो सकती है। ध्वनि विश्लेषण ( 2 ) एक वैध विश्लेषणात्मक कार्य है, इसलिए ऐसी स्थिति की परिकल्पना करना संभव है जहां विश्लेषणात्मक कार्य करते समय ध्वनि के नमूनों को व्यवस्थित रूप से सत्यापित करने की इच्छा हो। यह कहते हुए कि, शीर्षक में जन्मदिन का संगीत अजीब है।
कोनराड

8
इस तरह के प्रश्नों को प्रोत्साहित न करें क्योंकि पूछने का मौका हो सकता है I would like to play video using R
अविनाश राज

7
@AvashRaj दिलचस्प बात यह है कि मैं के रूप में एक के बारे में सोचा था :) सभी गंभीरता में, विकल्प शायद या तो तुच्छ होगा (एक बाहरी कार्यक्रम शुरू), व्यर्थ (बाहरी कोड में एक वीडियो प्लेयर को लागू करना) या अनुपयोगी (आर कोड का उपयोग करके) एक वीडियो स्ट्रीम को डिकोड करने और rasterImageप्रत्येक फ्रेम को रेंडर करने के लिए)
निक केनेडी

जवाबों:


237

यदि आप वास्तव में ऐसा करना चाहते हैं:

library("audio")

bday_file <- tempfile()
download.file("http://www.happybirthdaymusic.info/01_happy_birthday_song.wav", bday_file, mode = "wb")
bday <- load.wave(bday_file)
play(bday)

नोट आपको install.packages("audio")पहले करना होगा। यदि आपके पास पहले से कोई विशिष्ट फ़ाइल है, तो आपको इसे पहले WAV प्रारूप में बदलना होगा।

अगर आपको WAV फ़ाइल चलाने की तुलना में कुछ अधिक प्रोग्रामर चाहिए था, तो यहां एक संस्करण है जो साइन लहरों की एक श्रृंखला से धुन उत्पन्न करता है:

library("dplyr")
library("audio")
notes <- c(A = 0, B = 2, C = 3, D = 5, E = 7, F = 8, G = 10)
pitch <- "D D E D G F# D D E D A G D D D5 B G F# E C5 C5 B G A G"
duration <- c(rep(c(0.75, 0.25, 1, 1, 1, 2), 2),
              0.75, 0.25, 1, 1, 1, 1, 1, 0.75, 0.25, 1, 1, 1, 2)
bday <- data_frame(pitch = strsplit(pitch, " ")[[1]],
                   duration = duration)

bday <-
  bday %>%
  mutate(octave = substring(pitch, nchar(pitch)) %>%
           {suppressWarnings(as.numeric(.))} %>%
           ifelse(is.na(.), 4, .),
         note = notes[substr(pitch, 1, 1)],
         note = note + grepl("#", pitch) -
           grepl("b", pitch) + octave * 12 +
           12 * (note < 3),
         freq = 2 ^ ((note - 60) / 12) * 440)

tempo <- 120
sample_rate <- 44100

make_sine <- function(freq, duration) {
  wave <- sin(seq(0, duration / tempo * 60, 1 / sample_rate) *
                freq * 2 * pi)
  fade <- seq(0, 1, 50 / sample_rate)
  wave * c(fade, rep(1, length(wave) - 2 * length(fade)), rev(fade))
}

bday_wave <-
  mapply(make_sine, bday$freq, bday$duration) %>%
  do.call("c", .)

play(bday_wave)

नोट करने के लिए कुछ बिंदु हैं। नोटों के लिए डिफ़ॉल्ट ऑक्टेव ऑक्टेव 4 है, जहां A4 440 हर्ट्ज पर है (ऑर्केस्ट्रा को ट्यून करने के लिए इस्तेमाल किया जाने वाला नोट)। ऑक्टेव्स C से अधिक बदलते हैं, इसलिए C3 B2 की तुलना में एक सेमीटोन अधिक है। फीका होने का कारण make_sineयह है कि इसके बिना नोट्स शुरू करने और बंद करने के लिए श्रव्य चबूतरे होते हैं।


6
@DavidArenburg धन्यवाद। बस चीजों को थोड़ा और हास्यास्पद बनाने के लिए, मैंने अब कुछ कोड जोड़े हैं जो साइन लहरों का उपयोग करके पहले सिद्धांतों से धुन उत्पन्न करता है :)
निक केनेडी

बहुत बढ़िया जवाब। मैंने कुछ नया सीखा: मैं लुप्त होती के बारे में नहीं जानता था, और मेरे हालिया प्रयोग में यह सटीक समस्या थी। नाइटपिक: बोली लगाने का कोई कारण नहीं cहै do.call, और अंतिम असाइनमेंट make_sineअनावश्यक है।
कोनराड रुडोल्फ

1
@KonradRudolph धन्यवाद मैं हमेशा फ़ंक्शन नाम में उद्धृत करता हूं do.call। यह सब बहुत आसान है a <- 1; b <- 2; c <- 3कि रास्ते में कुछ किया जा सकता है, और उस स्थिति do.call(c, ...)में विफल हो जाएगा, जबकि c(1, 2, 3)वह असफल नहीं होगा। हालांकि बाद के बिंदु से पूरी तरह सहमत हैं, और अनावश्यक असाइनमेंट को हटा दिया है!
निक कैनेडी

1
@KonradRudolph वास्तव do.call("c", ...)में काम करेगा। कोशिश करो c <- 4; do.call("c", list(1, 2))। R यथोचित रूप से सुसंगत है कि ज्यादातर मामलों में एक तर्क जो किसी फ़ंक्शन को स्वीकार करता है, वह या तो फ़ंक्शन को स्वीकार करेगा या फ़ंक्शन का नाम। कुछ मामलों में (उदाहरण के लिए lapply) यह है match.fun, जबकि अन्य में, उदाहरण के लिए do.call, getMethodकार्यान्वयन सी कोड में है (बाद में कॉल के माध्यम से C_R_getGeneric)। मैं देख सकता हूं कि स्टाइलिस्टिक रूप से आप इसके नाम के बजाय फ़ंक्शन को पास करना पसंद कर सकते हैं, लेकिन बाद का व्यवहार अच्छी तरह से प्रलेखित है।
निक केनेडी

2
@KonradRudolph मेला काफी मुझे लगता है कि संबंधित मुद्दा यह है कि आर हमेशा एक फ़ंक्शन की तलाश करेगा यदि कोई symbolकोष्ठक द्वारा पीछा किया जाता है, भले ही दूसरा एक symbolऔर खोज मार्ग पर मौजूद हो। यह c <- 4; c(1, 2)सामान्य रूप से काम करने की अनुमति देता है, जबकि c <- paste0; c(1, 2)आधार का उपयोग नहीं करेगा c। मैंने इसके द्वारा बनाई गई उलझन देखी है जहां कोई c(1, 2)अपने कोड में बहुत खुशी से बुला रहा है, लेकिन फिर do.call(c, ...)काम करने में विफल रहता है। दिन के अंत में, मैं दृढ़ता से महसूस नहीं करता कि क्या कार्य नाम या सीधे द्वारा प्रदान किए गए हैं।
निक कैनेडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.