Twinkle Twinkle Little Star


27

Tulis program untuk memainkan sajak anak-anak Inggris yang populer.

Lembar musik (File ini dilisensikan di bawah lisensi Creative Commons Attribution-Share Alike 3.0 Unported . Attribution: Helix84 di Wikipedia bahasa Inggris ; Blahedo di Wikipedia bahasa Inggris .)

Beberapa artikel Wikipedia yang mungkin bermanfaat:

Beberapa pedoman untuk pengiriman Anda:

  • Program Anda harus menggunakan kartu suara komputer. Jika bahasa pemrograman Anda tidak memiliki akses mudah ke perangkat keras audio, program Anda harus membuat file output dalam beberapa format standar seperti WAV atau MIDI.

  • Program Anda harus benar-benar menghasilkan outputnya. Misalnya, menyematkan file Ogg Vorbis dari Wikipedia tidak akan diizinkan.

  • Kualitas audio harus dapat diterima. Paling tidak, lagu itu harus mudah dikenali. Lebih disukai, itu seharusnya terdengar bagus juga.

  • Fokusnya harus pada ukuran kode, kualitas suara, atau keduanya (jelaskan yang mana yang Anda putuskan). Solusi elegan juga akan bagus. Selamat bersenang-senang!

  • Ini adalah , sehingga kode terpendek menang


dapatkah saya memperkirakan frekuensi catatan?
Ming-Tang

1
Kenapa ini ditutup?
programmer5000

@ programmer5000 Saya akan mengatakan alasan dekat menggambarkannya dengan sangat baik ...
totallyhuman

2
Bahkan setelah membuatnya kode golf, saya akan mengatakan ini masih di luar topik. Kualitas audio harus dapat diterima. bukan kriteria validitas obyektif.
Dennis

3
@ Dennis Saya akan mengatakan itu lebih seperti "tidak jelas" daripada "di luar topik".
Erik the Outgolfer

Jawaban:


30

QBasic (56)

A$="CCGGAAG2FFEEDDC2"
B$="GGFFEED2"
PLAY "L4"+A$+B$+B$+A$

Fokus adalah pada kenang-kenangan :)

(Tidak punya QBasic untuk menguji ini)


1
Paling tidak berfungsi pada instalasi DOSBox saya, tetapi bisakah Anda memodifikasinya untuk memutar lagu lengkap?
PleaseStand

Selesai Saya akan mengerjakan keterampilan membaca saya: /
Eelvex

Hmm, apakah halaman ini salah? en.wikibooks.org/wiki/QBasic/Appendix#PLAY -> Satu oktaf dimulai dengan C dan berakhir dengan B. Saya setengah berharap QBASIC menjadi berbasis C tengah, tetapi notasi itu akan menyarankan itu berbasis A220 jika tepat benar :)
mootinator

6
Wow, ini membawa kembali kenangan pengalaman pemrograman pertama saya dengan QBasic ... yang melibatkan, antara lain, menulis musik murahan!
Daniel Standage

3
+1 untuk jalur memori tersandung! Sekarang yang saya butuhkan adalah sampel perintah GAMBAR :)
Sistem Down

16

JavaScript ( 214 212 211 karakter)

Buka Safari, Opera, atau Google Chrome ke JavaScript Shell , lalu masukkan kode di bawah ini:

for(s="",y=192e3;x=--y/4e3|0;)s+="~ "[(y%4e3>800|x%8==1)&Math.pow(2,"024579702457245702457970"[x>>1]/12)*y/31%2];open("data:audio/wav;base64,UklGRiXuAgBXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQHuAgCA"+btoa(s))

Tidak ditambang untuk keterbacaan (meskipun itu mungkin sulit untuk dipahami):

for(s = "", y = 192E3; x = --y / 4E3 | 0;) {
  s += "~ "[(y % 4E3 > 800 | x % 8 == 1) & Math.pow(2, "024579702457245702457970"[x >> 1] / 12) * y / 31 % 2];
}
open("data:audio/wav;base64,UklGRiXuAgBXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQHuAgCA" + btoa(s));

Dengan beberapa karakter lagi, ini dapat bekerja di Firefox juga, tetapi Anda dapat mengubah audio/wavbagian untuk setidaknya menyimpan file WAV.


1
Bekerja dengan baik di Chrome.
mootinator

@mootinator: Berfungsi untuk saya juga. Saya tidak berpikir untuk memeriksanya di Chrome - itu belum mendapatkan dukungan file WAV sampai baru-baru ini. code.google.com/p/chromium/issues/detail?id=23916
PleaseStand

Wow! Ini luar biasa.
Phillip Senn

apa yang Anda maksud dengan "dengan beberapa karakter"? Akan jadi apa karakter-karakter itu?
Phillip Senn

@cf_PhillipSenn: Ketika saya menjalankan kode di Firefox, saya mendapat QuickTime Player yang tidak berfungsi. Saya harus mengubah kode open(...)menjadi Audio(...).play()(8 karakter lebih banyak) agar dapat menggunakan pemutar audio bawaan Firefox.
PleaseStand

11

C # (Panjang: LOL)

Jadi, apa yang saya lakukan di sini adalah menerapkan dukungan untuk menghasilkan file .wav dari string yang digunakan untuk solusi QBasic di C # (oktaf tunggal, tanpa disengaja). Penekanan pada:

  1. Menghindari unsafeblok kode
  2. Tidak membuang-buang terlalu banyak waktu saya melakukannya
  3. Membuatnya relatif mudah untuk diperluas

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.IO;

namespace ConsoleApplication1
{
    public static class Extension
    {
        public static byte[] ToByteArray(this object o)
        {
            return o.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .SelectMany(x =>
                                {
                                    var value = x.GetValue(o, null);
                                    if (value.GetType().Equals(typeof (UInt16)))
                                    {
                                        return BitConverter.GetBytes((UInt16) value);
                                    }
                                    if (value.GetType().Equals(typeof (UInt32)))
                                    {
                                        return BitConverter.GetBytes((UInt32) value);
                                    }
                                    if (value.GetType().Equals(typeof(char[])))
                                    {
                                        return ((char[]) value).Select(y => Convert.ToByte(y));
                                    }
                                    if (value.GetType().Equals(typeof(byte[])))
                                    {
                                        return (byte[]) value;
                                    }
                                    throw new NotImplementedException();
                                }).ToArray();
        }
    }
    public class Wave
    {
        public readonly byte[] WavFile; 

        public Wave(string notes)
        {
            var header = new Header();
            var data = new List<Chunk>();
            var f = new Fmt(8000);
            data.Add(f);
            data.Add(new WavData(notes, f));
            var thefile = data.SelectMany(x => x.ToByteArray()).ToArray();
            header.Size = (uint)thefile.Length + 4;
            WavFile = header.ToByteArray().Concat(thefile).ToArray();
        }
        class WavData: Chunk
        {
            private static IEnumerable<byte> RenderNote(string note, int length, Fmt fmt)
            {
                double frequency;
                switch (note)
                {
                    case "A":
                        frequency = 440;
                        break;
                    case "B":
                        frequency = 493.883;
                        break;
                    case "C":
                        frequency = 261.626;
                        break;
                    case "D":
                        frequency = 293.665;
                        break;
                    case "E":
                        frequency = 329.628;
                        break;
                    case "F":
                        frequency = 349.228;
                        break;
                    case "G":
                        frequency = 391.995;
                        break;
                    default:
                        throw new NotImplementedException("Unsupported Note");
                }
                var result = new byte[fmt.SampleRate / length * 2];  // For 120BPM tempo
                for (int i = 0; i < result.Length; i++)
                {
                    double time = (i % fmt.SampleRate) / (double)fmt.SampleRate;
                    double position = time * frequency;
                    if (result.Length - i <= fmt.SampleRate / 16)
                        result[i] = 127;
                    else
                        result[i] = (byte)Math.Round((Math.Sin(position * 2 * Math.PI) + 1) * 127);
                }
                return result;
            }
            public WavData(string notes, Fmt fmt)
            {
                Samples = new byte[0];
                foreach (var note in Regex.Matches(notes, @"[A-G][1|2|4|8]?").OfType<Match>().Select(x => x.Value))
                {
                    Samples = Samples.Concat(RenderNote(note[0] + "", note.Length > 1 ? note[1] - '0' : 4, fmt)).ToArray();
                }

            }
            public override char[] Id
            {
                get { return "data".ToCharArray(); }
            }
            public override uint DataSize
            {
                get { return (uint)Samples.Length; }
            }
            public byte[] Samples { get; private set; }
        }
        class Fmt : Chunk
        {
            public Fmt(UInt32 sampleRate)
            {
                CompressionCode = 1; // Unknown/PCM
                Channels = 1;
                SampleRate = sampleRate;
                SignificantBits = 8;
            }
            public override char[] Id
            {
                get { return "fmt ".ToCharArray();}
            }
            public override uint DataSize
            {
                get { return 16; }
            }
            public UInt16 CompressionCode { get; private set; }
            public UInt16 Channels { get; private set; }
            public UInt32 SampleRate { get; private set; }
            public UInt32 AvgBytesPerSecond { get { return SampleRate*BlockAlign; } }
            public UInt16 BlockAlign { get { return (UInt16) (SignificantBits/8*Channels); } }
            public UInt16 SignificantBits { get; private set; }
        }
        class Header
        {
            public Header()
            {
                Type = "RIFF".ToCharArray();
                RiffType = "WAVE".ToCharArray();
                Size = 0;
            }

            public char[] Type { get; private set; }
            public UInt32 Size { get; set; }
            public char[] RiffType { get; private set; }
        }
        abstract class Chunk
        {
            public abstract char[] Id { get; }
            public abstract UInt32 DataSize { get; }
        }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            var p1 = "CCGGAAG2";
            var p2 = "FFEEDDC2";
            var p3 = "GGFFEED2";
            var w = new Wave(p1+p2+p3+p3+p1+p2);
            using (var f = new FileStream("testfile.wav", FileMode.Create))
                f.Write(w.WavFile, 0, w.WavFile.Length);
        }
    }
}

Saya perhatikan gelombang output memiliki amplitudo yang sangat kecil dalam jawaban saya di atas. Jelas saya kehilangan sesuatu tentang cara kerja sampel 8 bit.
mootinator

Ah, perbaiki. Urutan operasi itu penting. Contoh keluaran di sini: dl.dropbox.com/u/469380/testfile.wav
mootinator

FromDigits["LOL",36]==28101Itu tidak terlihat seperti LOL <sub> 36 </sub> byte ...
CalculatorFeline

6

Python (259)

import pysynth

c=('c',4)
g=('g',4)
a=('a',4)
b=('b',4)
d=('d',4)
e=('e',4)
f=('f',4)
g2=('g',2)
c2=('c',2)
d2=('d',2)

s=(c,c,g,g,a,a,g2,f,f,e,e,d,d,c2,g,g,f,f,e,e,d2,g,g,f,f,e
            ,e,d2,c,c,g,g,a,a,g2,f,f,e,e,d,d,c2)

pysynth.make_wav(s,fn="s.wav")

3
tidak bisakah ini disingkat menjadi import ttls?
zzzzBov

@zzz: Um, apakah itu lelucon?
John

2
@zzz: -Bangs-head-on-desk- Apa yang Anda katakan sebenarnya
John

1
@ John jelas itu koan. Anda harus membungkuk atau memukulnya.
ixtmixilix

1
(sangat terlambat komentar) Untuk referensi, di sini adalah versi -60 byte, karena itu benar-benar golfed.
Erik the Outgolfer

5

C, 277 karakter

#include<math.h>
a[]={0,7,9,7,5,4,2,0,7,5,4,2,7,5,4,2,0,7,9,7,5,4,2,0},i,j,f;main(){unsigned char
b[8000];f=open("/dev/dsp",1);for(i=0;i<24;i++){for(j=0;j<8000;j++){b[j]=(i%4==3
||j/400%20!=9?1+sinf(j*powf(2,a[i]/12.)):1)*127;}for(j=0;j<8000;j+=write(f,b+j,
8000-j));}close(f);}

Perl, 203 karakter

open F,'>:raw','/dev/dsp';for$a(0,7,9,17,5,4,2,10,7,5,4,12,7,5,4,12,0,7,9,17,5,4
,2,10){$b=pack'C*',map 127*($a>9||$_/400%20!=9?1+sin($_*2**($a%10/12)):1),0..
7999;$b=substr$b,syswrite F,$b while length$b}

Mudah, OSS 's /dev/dspdefault untuk 8kHz mono u8; semua yang saya lakukan di sini adalah membuka perangkat dan menulis sampel yang dihitung.


Pos Perl secara terpisah; Anda menggunakan codegolf :)
Eelvex

179 -j,f;main(i){char b[8000];f=open("/dev/dsp",1);for(i=24;i--;write(f,b,j))for(j=0;j<8000;j++)b[j]=(i%4&&j/400%20==9?1:1+sinf(j*powf(2,("@BDEGIG@BDEGBDEG@BDEGIG@"[i]-64)/12.)))*127;}
gastropner

4

PowerShell: 207

Kode golf:

filter n {switch($_){C{262}D{294}E{330}F{349}G{392}A{440}}}$t="CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC";1..6|%{$t[0..5]|n|%{[console]::beep($_,600)};$t[6]|n|%{[console]::beep($_,1200)};$t=$t.SubString(7)}

Tidak disatukan, dengan komentar:

# Filter to define note frequencies.
filter n {switch($_){C{262}D{294}E{330}F{349}G{392}A{440}}}

# Notes for Twinkle, Twinkle, Little Star.
$t="CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC"

# Run through each phrase in the song.
1..6|%{
    # Play first six notes as quarter notes.
    $t[0..5]|n|%{[console]::beep($_,600)}
    # Play seventh note as half note.
    $t[6]|n|%{[console]::beep($_,1200)}
    # Left-shift $t by 7 notes.
    $t=$t.SubString(7)
}

Bukan membawakan lagu dengan suara terbesar, tetapi berhasil.


1
(akhir komentar) Dapatkah Anda melakukan n{bukan n {?
Erik the Outgolfer

4

C - 520

Menabrak.

#include <linux/fd.h>
#include <time.h>
struct timespec t,p;char*q="AAHHJJH  FFEECCA  HHFFEEC  HHFFEEC  AAHHJJH  FFEECCA";x,y,z,v,w;main(){x=open("/dev/fd0",3);for(y;q[y];y++){clock_gettime(CLOCK_MONOTONIC,&p);if(q[y]>' ')for(w=z=0;z<4e8;z+=t.tv_nsec,w++){struct floppy_raw_cmd s={0};s.flags=FD_RAW_NEED_SEEK;v=!v;s.track=v;ioctl(x,FDRAWCMD,&s);clock_gettime(CLOCK_MONOTONIC,&t);t.tv_nsec=(w+1)*5e8/pow(2.,q[y]/12.)-(t.tv_sec-p.tv_sec)*1e9-t.tv_nsec+p.tv_nsec;t.tv_sec=0;nanosleep(&t,0);}t.tv_nsec=2e8;nanosleep(&t,0);}}

Mengapa menggunakan perangkat keras abad lalu seperti speaker dan headphone? Bagian kode yang luar biasa ini memungkinkan Anda memutar lagu di perangkat modern: floppy drive!
Tidak ada persyaratan khusus:

  • Floppy drive IDE
  • Kernel Linux
  • Kompilasi dengan -lm
  • Pastikan program dapat mengakses /dev/fd0, jadi tandai perangkat atau jalankan sebagai superuser

Tekuk aturan sedikit, tapi mari kita pertimbangkan floppy drive sebagai perangkat suara, dan pengendali IDE kartu suara terintegrasi.


Menurut saya ini masuk akal, floppy drive secara mengejutkan mampu melakukan tugas ini youtu.be/LkqYLOa76E0
Hotkeys

3

HyperCard 2.2 - 113

play harpsichord "c c g g a a gh fq f e e d d ch gq g f f e e dh gq g f f e e dh cq c g g a a gh fq f e e d d ch"

Penggunaan: Mulai HyperCard, ketik ⌘M untuk membuka Kotak Pesan, tempel kode di atas, dan tekan enter.

harpsichorddapat diganti dengan fluteatau boinguntuk mendapatkan suara yang berbeda.


(komentar sangat terlambat) harpsichord-> flute-6 menghapus jarak antara instrumen dan kutipan -1 total -7
Erik the Outgolfer

3

C, 96 karakter

main(t){for(;++t>>16<3;)putchar(t*!!(t>>9&7|!(-t>>12&7))*(96+"#d|dOE3#dOE3dOE3"[t>>13&15])>>5);}

Menghasilkan data audio mono mentah 8-bit mentah dengan gaya bytebeat klasik . Kecepatan sampel yang disarankan untuk pemutaran antara 8 dan 16 kHz; mengubah laju sampel mengubah tempo dan nada.

Untuk mengkompilasi dan bermain di Linux, simpan kode di atas sebagai twinkle.cdan jalankan perintah berikut:

gcc twinkle.c -o twinkle
./twinkle | aplay

Beberapa catatan tentang cara kerja kode:

  • Trik umum yang digunakan untuk komposisi bytebeat seperti ini adalah putchar()mengambil nilai integer tetapi hanya mencetak delapan bit yang rendah. Jadi, di putchar(t)mana tpenghitung yang meningkat, menghasilkan gelombang gigi gergaji, dan frekuensi gelombang dapat diubah dengan mengalikannya tdengan nilai yang sesuai.

  • !!(t>>9&7|!(-t>>12&7))menghasilkan pola catatan 6 + 1 berulang. Secara khusus, !!(t>>9&7)mengevaluasi 0kapan saja t>>9 & 7 == 0dan 1sebaliknya. Dengan demikian, ini menghasilkan celah 512-sampel dalam bentuk gelombang setiap 4.096 sampel, sedangkan !(-t>>12&7)menghilangkan setiap kesenjangan kedelapan tersebut.

  • 96+"#d|dOE3#dOE3dOE3"[t>>13&15]menghasilkan melodi: kode ASCII dari setiap karakter dalam string plus 96 memberikan frekuensi relatif dari nada yang sesuai. Sebenarnya, nilainya adalah perkiraan frekuensi dalam Hz dari catatan pitch konser di 3 / oktaf kecil, yaitu dengan A yang sesuai dengan 220. Namun, karena nada dasar yang digunakan untuk mengalikan nilai-nilai ini adalah sekitar 64 Hz (bila dimainkan pada 16 kHz , atau 32 Hz saat dimainkan pada 8 kHz), kita perlu menurunkan hasilnya hingga lima oktaf >>5untuk mendapatkan frekuensi kembali ke kisaran yang masuk akal.

Ps. Jika Anda ingin mencoba kode ini pada pemutar bytebeat berbasis-JavaScript, ganti [t>>13&15]dengan .charCodeAt(t>>13&15).


2

Python 317 305 301

Ini solusi saya, hanya menggunakan pustaka python standar:

import math,wave,struct;d=24000;r=1100.;t=wave.open("t.wav","w");t.setparams((1,2,int(r),d,"NONE",""));a=[0,7,9,7];b=[5,4,2,0];c=[7,5,4,2]
for h in[math.sin(6*[240*2**(j/12.)for j in a+b+c+c+a+b][x/1000]*(x/r))*(x%500>9 or x/1000%4>2)for x in range(d)]:t.writeframes(struct.pack('h', int(h*64000/2)))

Dan ini dia dengan lebih banyak ruang kosong untuk dibaca:

import math,wave,struct;d=24000;r=1100.
a=[0,7,9,7];b=[5,4,2,0];c=[7,5,4,2];s=[240*2**(j/12.) for j in a+b+c+c+a+b]
z=[math.sin(6*s[int(x/1000)]*(x/r))*(x%500>10 or int(x/1000)%4>2) for x in range(d)]
t=wave.open("t.wav","w");t.setparams((1,2,int(r),d,"NONE",""))
for h in z:t.writeframes(struct.pack('h', int(h*64000./2)))

2

Mathematica, 86 karakter

s=SoundNote;If[#>9,s[#-10,2],{s@#,s@#}]&/@Join[a={0,7,9,17,5,4,2,10},b={7,5,4,12},b,a]

2

Arduino, 688

int length=15;char notes[]="ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc";int beats[]={1,1,1,1,1,1,2,1,1,1,1,1,1,2,4};int tempo=300;void playTone(int tone,int duration){for(long i=0;i<duration*1000L;i+=tone*2){digitalWrite(11,HIGH);delayMicroseconds(tone);digitalWrite(11, LOW);delayMicroseconds(tone);}}void playNote(char note, int duration){char names[]={'c','d','e','f','g','a','b','C'};int tones[]={1915,1700,1519,1432,1275,1136,1014,956};for(int i=0;i<8;i++){if(names[i]==note){playTone(tones[i], duration);}}}void setup(){pinMode(11, OUTPUT);}void loop(){for(int i=0;i<length;i++){if(notes[i]==' '){delay(beats[i]*tempo);}else{playNote(notes[i],beats[i]*tempo);}delay(tempo/2);}}

Pasang bel pada output 11. Saya berkonsentrasi terutama pada kualitas , tetapi juga pada panjang kode.


(komentar terlambat) "ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc "hapus spasi? int beats[] =hapus ruang? for (longhapus ruang? 11, LOWhapus ruang? note, inthapus ruang? i], durationhapus ruang? 11, OUTPUThapus ruang?
Erik the Outgolfer

Apakah Anda benar-benar lupa beberapa spasi? Sejauh yang saya mengerti, ruang dalam ffeeddc "adalah untuk beberapa jenis keterlambatan, yang Anda tidak perlu pada akhirnya, dan beats[] =tidak memiliki alasan untuk memiliki ruang. Juga, Anda harus membuat versi yang berkonsentrasi pada panjang kode, hanya untuk itu saja!
Erik the Outgolfer

Saya kira semua variabel bisa menjadi satu huruf tetapi saya tidak berpikir itu sepadan dengan waktu pada jawaban yang lama. Terima kasih atas tipsnya.
Timtech

Oke, silakan posting sebagai jawaban terpisah jika Anda mau.
Timtech

@Timtech Ketika pertanyaan ditutup, sayangnya tidak dapat dilakukan ... :-(
wizzwizz4

2

bash + say + gunzip, 136 byte

say, tentu saja, menjadi perintah text-to-speech OS X. Ini ... konyol Ya, mari kita pergi dengan dorky.

printf '<117 bytes>'|gunzip|sh

117 byte, tentu saja, aliran gzip yang mengandung karakter yang tidak patut. Berikut ini adalah xxd dump dari skrip termasuk karakter-karakter tersebut:

00000000: 7072 696e 7466 2027 1f8b 085c 305c 305c  printf '...\0\0\
00000010: 305c 305c 3002 032b 4eac 54d0 2d0b c9c8  0\0\0..+N.T.-...
00000020: cf4d 2c56 c8e7 c2ca 75cc cb4b c4ce 71cb  .M,V....u..K..q.
00000030: ccc7 c90b 4b4d 85f0 7252 530b 14f4 4ca0  ....KM..rRS...L.
00000040: c2de 8945 a979 4061 6cbc e0c4 dcc4 bc92  ...E.y@al.......
00000050: 8c44 dc02 2e89 7999 a939 685c 5c74 7723  .D....y..9h\\tw#
00000060: ec44 755c 6e2a 8f8a ee19 581b 8767 1402  .Du\n*....X..g..
00000070: 5c30 fa36 7e25 2599 025c 305c 3027 7c67  \0.6~%%..\0\0'|g
00000080: 756e 7a69 707c 7368                      unzip|sh

Penjelasan

117 byte adalah skrip berikut yang di-gzip:

say -vThomas o
say -vThomas o
say -vAnna o
say -vAnna o
say -vFiona o
say -vFiona o
say -vVeena o
sleep .4
say -vKaren o
say -vKaren o
say -vSamantha o
say -vSamantha o
say -vDaniel o
say -vDaniel o
say -vThomas o
sleep .4
say -vVeena o
say -vVeena o
say -vKaren o
say -vKaren o
say -vSamantha o
say -vSamantha o
say -vDaniel o
sleep .4
say -vVeena o
say -vVeena o
say -vKaren o
say -vKaren o
say -vSamantha o
say -vSamantha o
say -vDaniel o
sleep .4
say -vThomas o
say -vThomas o
say -vAnna o
say -vAnna o
say -vFiona o
say -vFiona o
say -vVeena o
sleep .4
say -vKaren o
say -vKaren o
say -vSamantha o
say -vSamantha o
say -vDaniel o
say -vDaniel o
say -vThomas o

Itu benar, saya hanya membuat banyak saysuara yang berbeda mengatakan "o." Untuk mencari tahu yang mana, saya menulis naskah menggunakan aubionotes untuk mendapatkan perkiraan cepat dan kotor dari setiap nada suara, kemudian melakukan banyak percobaan dan kesalahan menemukan yang terdengar paling benar.

Saya mempertimbangkan untuk mencoba golf ini secara manual, tetapi ada begitu banyak pengulangan yang saya pikir Zopfli akan membuatnya lebih pendek, jadi saya mengambil jalan keluar yang mudah.


1

SmileBASIC, 45 byte

BGMPLAY"{M=CCGGAAG2FFEEDDC2}{M}[GGFFEED2]2{M}

0

Powershell, 120 117 byte

[Console]::beep, perhatikan label dan frekuensi yang terinspirasi oleh Iszi

 ($a='ccggaaGffeeddC')+'ggffeeD'*2+$a|% t*y|%{[console]::beep((0,110,0,65,73,82,87,98)[$_-band7]*4,600+600*($_-lt97))}

Ide utama :

  • Melodi dikodekan dalam sebuah string.
  • Catatan dikodekan dengan karakter A, C, D, E, F, G.
  • Huruf besar berarti a double duration.
  • 3 bit rendah ( $_-band7) dari masing-masing menggunakan catatan sebagai indeks dalam array frekuensi ( A->1, C->3, D->4...)
  • Skrip ini menggunakan pengurangan laju sampling untuk frekuensi: (0,110,0,65,73,82,87,98)[$_-band7]*4sebagai gantinya Iszi (0,440,0,262,294,330,349,392)[$_-band7]. [console]::Beepbukan alat musik yang paling akurat, sehingga bisa sedikit palsu :)

Penjelasan : Untuk setiap karakter dari string melodi ccggaaGffeeddCggffeeDggffeeDccggaaGffeeddC, skrip:

  • frekuensi lookup dari array menggunakan bit yang lebih rendah sebagai indeks
  • menghitung durasi berdasarkan karakter huruf besar / kecil
  • panggilan [console]::beepuntuk memutar catatan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.