Twinkle Twinkle Little Star


27

เขียนโปรแกรมเพื่อเล่นบทกวีภาษาอังกฤษยอดนิยม

แผ่นเพลง (ไฟล์นี้ได้รับอนุญาตภายใต้ Creative Commons Attribution-Share Alike 3.0 Unported License. คุณสมบัติ: Helix84ที่วิกิพีเดียภาษาอังกฤษ ; Blahedoที่วิกิพีเดียภาษาอังกฤษ )

บทความ Wikipedia บางบทความที่อาจมีประโยชน์:

หลักเกณฑ์บางประการสำหรับการส่งของคุณ:

  • โปรแกรมของคุณต้องใช้การ์ดเสียงของคอมพิวเตอร์ หากภาษาการเขียนโปรแกรมของคุณไม่มีการเข้าถึงฮาร์ดแวร์เสียงอย่างสะดวกโปรแกรมของคุณต้องสร้างไฟล์เอาต์พุตในรูปแบบมาตรฐานบางอย่างเช่น WAV หรือ MIDI

  • โปรแกรมของคุณจะต้องสร้างผลลัพธ์ ตัวอย่างเช่นการฝังไฟล์ Ogg Vorbis จาก Wikipedia จะไม่ได้รับอนุญาต

  • ต้องยอมรับคุณภาพเสียง อย่างน้อยที่สุดเพลงควรจะจดจำได้ง่าย ควรให้เสียงที่ดีเช่นกัน

  • โฟกัสควรเป็นขนาดรหัสคุณภาพเสียงหรือทั้งสองอย่าง (อธิบายว่าข้อใดที่คุณตัดสินใจ) โซลูชั่นที่สง่างามก็ยอดเยี่ยมเช่นกัน มีความสุข!

  • นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ


ฉันจะประมาณความถี่โน้ตได้อย่างไร
Ming-Tang

1
ทำไมถึงปิด
programmer5000

@ programmer5000 ผมว่าเหตุผลที่ใกล้อธิบายว่ามันเป็นอย่างดี ...
totallyhuman

2
แม้หลังจากทำโค้ดกอล์ฟฉันก็ยังบอกว่ามันยังไม่เป็นเช่นนั้น ต้องยอมรับคุณภาพเสียง ไม่ใช่เกณฑ์ความถูกต้องตามวัตถุประสงค์
เดนนิส

3
@Dennis ฉันว่ามันเหมือน "ไม่ชัดเจน" มากกว่า "นอกหัวข้อ"
Erik the Outgolfer

คำตอบ:


30

QBasic (56)

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

มุ่งเน้นที่ความทรงจำ :)

(ไม่มี QBasic เพื่อทดสอบสิ่งนี้)


1
ทำงานกับการติดตั้ง DOSBox ของฉันอย่างน้อยที่สุด แต่คุณสามารถปรับเปลี่ยนเพื่อเล่นเพลงเต็มได้หรือไม่
PleaseStand

เสร็จสิ้น ฉันจะไปทำงานกับทักษะการอ่านของฉัน: /
Eelvex

หน้านี้ผิดหรือเปล่า? en.wikibooks.org/wiki/QBasic/Appendix#PLAY -> อ็อกเทฟเริ่มต้นด้วย C และลงท้ายด้วย B ฉันไม่ได้คาดหวังว่าครึ่งหนึ่งของ QBASIC จะขึ้นอยู่กับ C กลาง แต่สัญกรณ์นี้บอกว่ามันเป็น A220 หากถูกต้องแน่นอน :)
mootinator

6
ว้าวสิ่งนี้นำความทรงจำย้อนกลับไปจากประสบการณ์การเขียนโปรแกรมครั้งแรกของฉันกับ QBasic ... ซึ่งเกี่ยวข้องกับการเขียนเพลงวิเศษ!
Daniel Standage

3
+1 สำหรับช่องทางเดินลงหน่วยความจำ! ตอนนี้สิ่งที่ฉันต้องการคือตัวอย่างคำสั่ง DRAW :)
ระบบลง

16

JavaScript ( 214 212 211 ตัวอักษร)

เปิด Safari, Opera หรือ Google Chrome ไปยังJavaScript Shellจากนั้นป้อนรหัสด้านล่าง:

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))

ไม่ จำกัด สำหรับความสามารถในการอ่าน (แม้จะยากที่จะเข้าใจ):

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));

ด้วยตัวละครอีกหลายตัวมันสามารถทำงานบน Firefox ได้เช่นกัน แต่คุณสามารถเปลี่ยนaudio/wavส่วนให้เป็นไฟล์ WAV อย่างน้อยก็บันทึกได้


1
ทำงานได้ดีใน Chrome
mootinator

@mootinator: ทำงานได้สำหรับฉันเช่นกัน ฉันไม่ได้คิดที่จะตรวจสอบใน Chrome - มันไม่ได้รับการสนับสนุนไฟล์ WAV จนกระทั่งค่อนข้างเร็ว ๆ นี้ code.google.com/p/chromium/issues/detail?id=23916
PleaseStand

ว้าว! มันวิเศษมาก
Phillip Senn

คุณหมายถึงอะไร "กับตัวละครอีกหลายตัว" ตัวละครเหล่านั้นจะเป็นอะไร?
Phillip Senn

@cf_PhillipSenn: เมื่อฉันรันโค้ดบน Firefox ฉันได้รับ QuickTime Player ที่ใช้งานไม่ได้ ฉันต้องเปลี่ยนรหัสopen(...)เป็นAudio(...).play()(อีก 8 ตัวอักษร) เพื่อให้มันใช้โปรแกรมเล่นเสียงในตัวของ Firefox
กรุณามา

11

C # (ความยาว: LOL)

ดังนั้นสิ่งที่ฉันทำที่นี่คือการสนับสนุนการสร้างไฟล์. wav จากสตริงที่ใช้สำหรับการแก้ปัญหา QBasic ใน C # (อ็อกเทฟเดี่ยวไม่มีอุบัติเหตุ) เน้นคือเมื่อ:

  1. หลีกเลี่ยงการunsafeบล็อกรหัส
  2. ไม่เสียเกินไปมากเวลาของฉันทำมัน
  3. ทำให้ค่อนข้างยืดง่าย

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);
        }
    }
}

ฉันสังเกตเห็นว่าคลื่นเอาต์พุตมีแอมพลิจูดขนาดเล็กมากในคำตอบของฉันด้านบน เห็นได้ชัดว่าฉันขาดอะไรบางอย่างเกี่ยวกับวิธีการทำงานของตัวอย่าง 8 บิต
mootinator

อ่าซ่อมมันซะ ลำดับการปฏิบัติงานมีความสำคัญ ตัวอย่างผลลัพธ์ที่นี่: dl.dropbox.com/u/469380/testfile.wav
mootinator

FromDigits["LOL",36]==28101ที่ไม่เหมือนกับ LOL <sub> 36 </sub> ไบต์ ...
เครื่องคิดเลข

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
ไม่สามารถย่อให้สั้นลงได้import ttlsไหม
zzzzBov

@zzz: เอ่อเป็นเรื่องตลกเหรอ?
John

2
@zzz: -Bangs-head-on-desk- คุณว่าอะไรกันแน่?
John

1
@ John เห็นได้ชัดว่าเป็น koan คุณควรโค้งคำนับหรือตีเขา
ixtmixilix

1
(ความคิดเห็นที่ล่าช้ามาก) สำหรับการอ้างอิงนี่คือรุ่น -60 ไบต์เพราะมันเป็นกอล์ฟ
Erik the Outgolfer

5

C, 277 ตัวอักษร

#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 ตัวอักษร

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}

สะดวกใช้ค่าเริ่มต้นของOSSเป็น/dev/dsp8kHz mono u8; สิ่งที่ฉันทำที่นี่คือเปิดอุปกรณ์และเขียนตัวอย่างที่คำนวณได้


โพสต์ Perl แยกกัน คุณอยู่บน 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

รหัส Golfed:

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)}

Ungolfed พร้อมความคิดเห็น:

# 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)
}

ไม่ใช่ความหมายที่ยิ่งใหญ่ที่สุดของเพลง แต่มันได้ผล


1
(ความคิดเห็นดึก) คุณสามารถทำn{แทนn {?
Erik the Outgolfer

4

C - 520

Bump

#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);}}

ทำไมต้องใช้ฮาร์ดแวร์ของศตวรรษที่ผ่านมาเช่นลำโพงและหูฟัง รหัสที่ยอดเยี่ยมนี้ช่วยให้คุณเล่นเพลงบนฮาร์ดแวร์ที่ทันสมัย: ไดรฟ์ฟลอปปี้!
ไม่มีข้อกำหนดพิเศษ:

  • IDE ฟลอปปี้ไดรฟ์
  • เคอร์เนล Linux
  • รวบรวมกับ -lm
  • ตรวจสอบให้แน่ใจว่าโปรแกรมสามารถเข้าถึง/dev/fd0ได้ดังนั้นจึงควรเลือกอุปกรณ์หรือเรียกใช้เป็น superuser

ก้มกฏเล็กน้อย แต่ให้ลองพิจารณาตัวที่สองว่าฟล็อปปี้ไดรฟ์เป็นอุปกรณ์เสียงและตัวควบคุม IDE เป็นการ์ดเสียงในตัว


ฉันจะบอกว่านี่เป็นเหตุผลไดรฟ์ฟลอปปี้มีความสามารถอย่างน่าประหลาดใจสำหรับงานนี้youtu.be/LkqYLOa76E0
Hotkeys

3

ไฮเปอร์การ์ด 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"

การใช้งาน:เริ่ม HyperCard พิมพ์⌘Mเพื่อเปิดกล่องข้อความวางรหัสด้านบนแล้วกด Enter

harpsichordอาจถูกแทนที่ด้วยfluteหรือboingเพื่อให้ได้เสียงที่แตกต่าง


(ความคิดเห็นที่ล่าช้ามาก) harpsichord-> flute-6 ลบช่องว่างระหว่างเครื่องมือและคำพูด -1 รวม -7
Erik the Outgolfer

3

C, 96 ตัวอักษร

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

สร้างข้อมูลเสียงโมโนโมโนที่ไม่มีการลงนามแบบ 8 บิตในสไตล์ไบต์คลาสสิก อัตราตัวอย่างที่แนะนำสำหรับการเล่นอยู่ระหว่าง 8 และ 16 kHz; การเปลี่ยนอัตราตัวอย่างจะเปลี่ยนจังหวะและระดับเสียง

หากต้องการคอมไพล์และเล่นภายใต้ Linux ให้บันทึกรหัสข้างต้นเป็นtwinkle.cและเรียกใช้คำสั่งต่อไปนี้:

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

หมายเหตุบางประการเกี่ยวกับการทำงานของรหัส:

  • เคล็ดลับทั่วไปที่ใช้สำหรับการแต่งเพลงแบบ bytebeat เช่นนี้คือputchar()ใช้ค่าจำนวนเต็ม แต่พิมพ์เพียงแปดบิตที่ต่ำเท่านั้น ดังนั้นputchar(t)ที่tเป็นเคาน์เตอร์เพิ่มขึ้นสร้างคลื่นฟันเลื่อยและความถี่ของคลื่นสามารถเปลี่ยนแปลงได้โดยการคูณtด้วยค่าที่เหมาะสม

  • !!(t>>9&7|!(-t>>12&7))สร้างรูปแบบบันทึกย่อ 6 + 1 ซ้ำ โดยเฉพาะให้!!(t>>9&7)ประเมิน0เมื่อใดก็ตามt>>9 & 7 == 0และไปเป็น1อย่างอื่น ดังนั้นมันจะสร้างช่องว่าง 512 ตัวอย่างในรูปคลื่นทุก 4096 ตัวอย่างในขณะที่!(-t>>12&7)กำจัดช่องว่างดังกล่าวทุก ๆ แปด

  • 96+"#d|dOE3#dOE3dOE3"[t>>13&15]สร้างทำนอง: รหัส ASCII ของแต่ละตัวละครในสตริงบวก 96 ให้ความถี่สัมพัทธ์ของบันทึกที่เกี่ยวข้อง ที่จริงแล้วค่าดังกล่าวเป็นความถี่โดยประมาณในเฮิร์ตซ์ของบันทึกเสียงคอนเสิร์ตในระดับ 3 / คู่เล็กเช่นกับ A ที่สอดคล้องกับ 220 อย่างไรก็ตามเนื่องจากเสียงฐานที่มีค่าเหล่านี้จะถูกคูณประมาณ 64 Hz (เมื่อเล่นที่ 16 kHz หรือ 32 Hz เมื่อเล่นที่ 8 kHz) เราจำเป็นต้องลดขนาดผลลัพธ์ลงโดยใช้อ็อกเทฟห้าตัว>>5เพื่อให้ความถี่กลับมาอยู่ในช่วงที่เหมาะสม

ps หากคุณต้องการที่จะลองรหัสนี้บนเครื่องเล่น bytebeat ใช้ JavaScript แทนที่ด้วย[t>>13&15].charCodeAt(t>>13&15)


2

หลาม 317 305 301

นี่เป็นวิธีแก้ปัญหาของฉันโดยใช้ไลบรารี python มาตรฐานเท่านั้น:

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)))

และนี่คือช่องว่างสำหรับการอ่านเพิ่มเติม:

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

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);}}

เสียบกริ่งในการส่งออก 11. ฉันข้นส่วนใหญ่ในที่มีคุณภาพแต่ยังเกี่ยวกับความยาวของรหัส


(ความคิดเห็นช้า) "ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc "ลบที่ว่าง? int beats[] =ลบที่ว่าง? for (longลบที่ว่าง? 11, LOWลบที่ว่าง? note, intลบที่ว่าง? i], durationลบที่ว่าง? 11, OUTPUTลบที่ว่าง?
Erik the Outgolfer

คุณลืมช่องว่างจริงๆหรือ เท่าที่ฉันเข้าใจพื้นที่ในffeeddc "นั้นมีไว้สำหรับการหน่วงเวลาบางอย่างซึ่งคุณไม่ต้องการในตอนท้ายและbeats[] =ไม่มีเหตุผลที่จะมีช่องว่าง นอกจากนี้คุณควรสร้างเวอร์ชันที่เน้นเรื่องความยาวโค้ดเพียงเพื่อให้ได้มาซึ่งความสนใจ!
Erik the Outgolfer

ฉันคิดว่าตัวแปรทั้งหมดอาจเป็นตัวอักษรเดียว แต่ฉันไม่คิดว่ามันคุ้มค่ากับคำตอบเก่า ๆ ขอบคุณสำหรับเคล็ดลับเหล่านั้น
Timtech

ตกลงอย่าลังเลที่จะโพสต์เป็นคำตอบที่แยกต่างหากถ้าคุณต้องการ
Timtech

@Timtech เมื่อคำถามถูกปิดคุณไม่สามารถทำได้อย่างน่าเสียดาย ... :-(
wizzwizz4

2

ทุบตี + พูด + gunzip, 136 ไบต์

sayแน่นอนว่าเป็นคำสั่ง OS X text-to-speech นี่คือ ... dorky ใช่ไปด้วยกันเถอะ

printf '<117 bytes>'|gunzip|sh

แน่นอน 117 ไบต์คือสตรีม gzip ที่มีอักขระที่ไม่สามารถพิมพ์ได้ นี่คือการถ่ายโอนข้อมูล xxd ของสคริปต์รวมถึงตัวละครเหล่านั้น:

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

คำอธิบาย

117 ไบต์เป็นสคริปต์ต่อไปนี้ gzipped:

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

ใช่แล้วฉันแค่ทำsayเสียงต่าง ๆ ให้พูดว่า "o" เพื่อหาว่าตัวไหนฉันเขียนสคริปต์โดยใช้aubionotesเพื่อประเมินเสียงที่รวดเร็วและสกปรกของแต่ละเสียงจากนั้นทำการทดลองและข้อผิดพลาดมากมายในการค้นหาเสียงที่ถูกต้องที่สุด

ฉันพิจารณาว่าจะพยายามเล่นกอล์ฟด้วยตนเอง แต่มีการทำซ้ำ ๆ มากมายที่ฉันคิดว่า Zopfli จะทำให้การทำงานของมันสั้นลงดังนั้นฉันจึงหาทางออกได้ง่าย



0

Powershell, 120 117 ไบต์

[Console]::beepป้ายกำกับและความถี่ที่ได้รับแรงบันดาลใจจากIszi

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

แนวคิดหลัก :

  • เมโลดี้จะถูกเข้ารหัสในสตริง
  • หมายเหตุถูกเข้ารหัสด้วยตัวอักษรA, C, D, E, ,FG
  • double durationตัวพิมพ์ใหญ่หมายความว่า
  • 3 บิตที่ต่ำกว่า ( $_-band7) ของแต่ละใช้บันทึกเป็นดัชนีในความถี่ array ( A->1, C->3, D->4... )
  • สคริปต์นี้จะใช้อัตราการสุ่มตัวอย่างลดความถี่: (0,110,0,65,73,82,87,98)[$_-band7]*4แทนของ (0,440,0,262,294,330,349,392)[$_-band7]Iszi [console]::Beepไม่ใช่เครื่องดนตรีที่แม่นยำที่สุดดังนั้นมันจึงปลอมได้เล็กน้อย :)

คำอธิบาย : สำหรับอักขระแต่ละตัวจากสตริงเมโลดี้ccggaaGffeeddCggffeeDggffeeDccggaaGffeeddCสคริปต์:

  • การค้นหาความถี่จากอาร์เรย์โดยใช้บิตที่ต่ำกว่าเป็นดัชนี
  • คำนวณระยะเวลาตามอักขระตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก
  • โทร[console]::beepเพื่อเล่นโน้ต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.