写一个程序来演奏流行的英语童谣。

(此文件是在Creative 归属-共享- 3.0未移植许可下授权的。归因:Helix84在英语维基百科,布拉海多在英语维基百科。)
一些可能有用的维基百科文章:
你提交材料的一些准则:
发布于 2011-02-02 23:19:09
因此,我在这里所做的是实现对从用于QBasic解决方案的C# (单倍频程,没有意外)的字符串生成一个C#文件的支持。重点是:
unsafe代码块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);
}
}
}发布于 2014-02-20 15:09:52
#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);}}为什么要使用上个世纪的硬件,比如扬声器和耳机?这段优秀的代码可以让你在现代硬件上播放歌曲:软盘驱动器!
无特殊要求:
-lm编译/dev/fd0,所以要么设置设备,要么作为超级用户运行稍微扭曲一些规则,但让我们考虑一下软盘驱动器是声音设备,IDE控制器是集成的声卡。
发布于 2011-02-01 19:17:17
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")https://codegolf.stackexchange.com/questions/272
复制相似问题