কেবল একটি নোট - বাদ্যযন্ত্র সংশ্লেষিত [বন্ধ]


11

বিবৃতি

কাজটি হ'ল কিছু সাধারণ উদ্দেশ্যে প্রোগ্রামিং ল্যাঙ্গুয়েজে (আপনার পছন্দের) ফাংশনটি ব্যবহার করে কিছু বাদ্যযন্ত্রের (আপনার পছন্দ মতো) শব্দ (একটি নোট বাজানো) সংশ্লেষিত করা।

দুটি লক্ষ্য রয়েছে:

  • ফলাফল শব্দের গুণমান। এটি যথাসম্ভব জরিমানা হিসাবে আসল উপকরণের সাথে সাদৃশ্য করা উচিত;
  • Minimality। কোডটি 1500 বাইটের নীচে রাখার পরামর্শ দেওয়া হয় (কেবলমাত্র বেসিক সাউন্ড জেনারেশন থাকলে কম)।

কেবল প্রজন্মের ফাংশন সরবরাহ করা দরকার, বয়লারপ্লেট স্কোরের জন্য গণনা করা হয় না।

দুর্ভাগ্যক্রমে শব্দটির বিশ্বস্ততার জন্য কোনও স্কোর গণনা করা যায় না, তাই কঠোর নিয়ম থাকতে পারে না।

নিয়মাবলী:

  • নমুনা লাইব্রেরি, বিশেষ সংগীত উত্পাদনের জিনিসগুলির উপর নির্ভরতা নেই;
  • নেটওয়ার্ক থেকে ডাউনলোড হচ্ছে না বা মাইক্রোফোন বা অডিও কার্ডের এমআইডিআই বা এর চেয়ে খুব বাহ্যিক কিছু ব্যবহার করার চেষ্টা করছে না;
  • কোড আকার পরিমাপ ইউনিট বাইট হয়। ফাইল বর্তমান ডিরেক্টরিতে তৈরি হতে পারে। প্রাক-বিদ্যমান ফাইল (গুণমান সারণী, ইত্যাদি) উপস্থিত থাকতে পারে, তবে তাদের বিষয়বস্তু স্কোর + এ যুক্ত করা হবে তাদের নাম দিয়ে খোলার মাধ্যমে।
  • বয়লারপ্লেট কোড (স্কোর হিসাবে গণনা করা হয়নি) স্বাক্ষরিত পূর্ণসংখ্যার অ্যারে (তালিকা) প্রাপ্ত করে এবং কেবল সেগুলি আউটপুট দেওয়ার ক্ষেত্রে ডিল করে।
  • আউটপুট ফর্ম্যাটটিতে সামান্য এন্ডিয়ান 16-বিট শব্দগুলিতে স্বাক্ষর করা হয়েছে, প্রতি সেকেন্ডে 44100 নমুনা, optionচ্ছিক WAV শিরোলেখ সহ। প্লেইন ওয়াভের পরিবর্তে সংকুচিত অডিও আউটপুট দেওয়ার চেষ্টা করা হচ্ছে না;
  • দয়া করে সংশ্লেষণের জন্য বিভিন্ন যন্ত্র বাছাই করুন (বা অন্যান্য মানের বনাম কোডের আকারের বুনিয়াটি উপকরণটির জন্য); তবে আপনি কী অনুকরণ করছেন তা প্রাথমিকভাবে বলবেন না - অন্যান্য ব্যবহারকারীদের মন্তব্যে অনুমান করতে দিন;
  • বৈদ্যুতিন যন্ত্র নিরুৎসাহিত করা হয়;
  • ড্রাম একটি উপকরণ মানুষের কণ্ঠস্বর একটি উপকরণ।

Boilerplates

এখানে কয়েকটি ভাষার জন্য বয়লারপ্লেট রয়েছে। আপনি নিজের ভাষার জন্যও একই রকম বয়লার প্লেট লিখতে পারেন। মন্তব্য করা হয়েছে "জি" ফাংশনটি কেবল একটি ডেমো (1 সেকেন্ড 440 হার্জ সাইন টোন) এর জন্য।

সি:

//#!/usr/bin/tcc -run
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

/*
void g(signed short *array, int* length) {
    *length = 44100;
    int i;
    for(i=0; i<44100; ++i) array[i]=10000*sin(i*2.0*3.14159265358979323*440.0/44100.0);
}
*/

// define your g here

signed short array[44100*100];
int main(int argc, char* argv[]) {
    int size=0;
    memset(array,0,sizeof array);
    // i(array); // you may uncomment and implement some initialization
    g(array, &size);
    fwrite("RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00GolfNote\0\0\0\0\0\0data\x00\xff\xff\xff", 1, 80, stdout);
    fwrite(array, 1, size*sizeof(signed short), stdout);
    return 0;
}

পাইথন 2:

#!/usr/bin/env python
import os
import re
import sys
import math
import struct
import array


#def g():
#    return [int(10000*math.sin(1.0*i*2*3.141592654*440.0/44100.0)) for i in xrange(0,44100)]

# define your g here


sys.stdout.write("RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00GolfNotePy\0\0\0\0data\x00\xff\xff\xff");
array.array("h", g()).tofile(sys.stdout);

পার্ল 5:

#!/usr/bin/perl

#sub g() {
#    return (map 10000*sin($_*3.14159265358979*2*440.0/44100.0), 0..(44100-1))
#}

# define you g here

my @a = g();
print "RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00GolfNotePl\0\0\0\0data\x00\xff\xff\xff";
print join("",map(pack("s", $_), @a));

Haskell,:

#!/usr/bin/runhaskell

import qualified Data.Serialize.Put as P
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C8
import Data.Word
import Control.Monad

-- g :: [Word16]
-- g = map (\t->floor $ 10000 * sin(t*2*3.14159265358979*440/44100)) [0..44100-1]
-- insert your g here

main = do
    B.putStr $ C8.pack $ "RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\0INFOISFT\x0e\x00\x00\x00GolfNote\0\0\0\0\0\0data\x00\xff\xff\xff"
    B.putStr $ P.runPut $ sequence_ $ map P.putWord16le g

উদাহরণ

পিয়ানো সাউন্ডের পরে এখানে বর্ণহীন সি সংস্করণটি মডেল করা হয়েছে:

void g(signed short *array, int* length) {
    *length = 44100*5;
    int i;

    double overtones[]={4, 1, 0.5, 0.25, 0.125};

    double freq[]   = {393, 416, 376, 355, 339, 451, 555};
    double freq_k[] = {40,  0.8,  1,  0.8,   0.7,  0.4, 0.25};
    double corrector = 1/44100.0*2*3.14159265358979323;

    double volumes_begin[] ={0,     0.025, 0.05,   0.4};
    double volumes_end  [] ={0.025, 0.05,  0.4,    5};

    double volumes_kbegin[]={0,     1.8,   1,      0.4};
    double volumes_kend [] ={1.8,     1,   0.4,    0};

    for(i=0; i<44100*5; ++i) {
        int j;
        double volume = 0;

        for(j=0; j<sizeof volumes_begin/sizeof(*volumes_begin); ++j) {
            double t = i/44100.0;
            if(t>=volumes_begin[j] && t<volumes_end[j]) {
                volume += volumes_kbegin[j]*(volumes_end[j]-t  )/(volumes_end[j]-volumes_begin[j]);
                volume += volumes_kend[j]  *(t-volumes_begin[j])/(volumes_end[j]-volumes_begin[j]);
            }
        }

        int u;
        for(u=0; u<sizeof freq/sizeof(*freq); ++u) {
            for(j=0; j<sizeof overtones/sizeof(*overtones); ++j) {
                double f = freq[u]*(j+1);
                array[i] += freq_k[u]*volume*10000.0/(f)/1*overtones[j]*sin(1.0*i*corrector*f);
            }
        }
    }
}

এটি প্রায় 1330 বাইট স্কোর করে এবং দুর্বল / মাঝারি মানের সরবরাহ করে।


2
উপযুক্ত কোডগল্ফ চ্যালেঞ্জ হওয়ার জন্য আপনাকে উদ্দেশ্যমূলক বিজয়ী মানদণ্ডটি নির্ধারণ করতে হবে। (এই চ্যালেঞ্জের প্রকৃতি প্রদত্ত, আমি মনে করি এটি "জনপ্রিয়তা প্রতিযোগিতা", অর্থাত্ upvotes অধিকাংশ সংখ্যা হতে হবে।)
breadbox

উদাহরণটি কাজ করে বলে মনে হচ্ছে না। আউটপুট সম্পূর্ণরূপে বিকৃত হয় এবং এর মধ্যে অনেক ব্রেক-আপ রয়েছে। "Gcc -o piano.exe piano.c" দিয়ে MinGW তে সংকলিত এবং "পিয়ানো.এক্সে> পিয়ানো.ওয়াভ" দিয়ে মৃত্যুদন্ড কার্যকর করা হয়েছে। এমনকি সাধারণ 440 হার্জে টোন জি ফাংশনটি ব্যবহার করার একই ফলাফল রয়েছে। বিটিডাব্লু, আপনি আপনার বিশাল সংখ্যার জায়গায় এমপিআই ব্যবহার করতে পারেন। এটি গণিতের মধ্যে সংজ্ঞায়িত করা হয়েছে।
মাইক সি

@ মাইক সি, সি বয়লারপ্লেটের সংক্ষিপ্ত বিবরণ সহ আউটপুট শুরুর দিকটি qদেখতে এইরকম হওয়া উচিত: পেস্টবিন . com/ZCB1v7QQ । আপনার হোস্ট কি বড়-এডিয়ান?
vi।

না, আমি MinGW ব্যবহার করছি তাই আমি x86। আমি এটি আমার একটি লিনাক্স বাক্সে চেষ্টা করব। আমি বুঝতে পারি না কেন আমার কেন সমস্যা হচ্ছে। স্ট্রেঞ্জ।
মাইক সি

$><<7.chrরুবি গণনা করে না? : 9 টি চরিত্রের জন্য পি! অথবা $><<?\a7 অক্ষর জন্য
Doorknob

উত্তর:


2

জাভা

আমার বয়লারপ্লেট শব্দটি বাজায়। আমি g()আরও কিছুটা গল্ফ করতে পারলাম , তবে বর্তমানে এটি 273 টি পর্যায়ে রয়েছে যা 1500 এর নিচে ভাল I আমি এতে সন্তুষ্ট

import java.io.*;
import javax.sound.sampled.*;

public class codegolf13003 {
    byte[]g(){byte[]d=new byte[88000];int r=1,R=1103515247,b[]=new int[650],i,o,s,y;for(i=0;i<b.length;r*=R)b[i++]=0x4000+((r>>16)&0x3fff);for(i=o=0;i<d.length;o=s){s=(o+1)%b.length;y=(b[o]+b[s])/2*((r&0x10000)<1?-1:1);r*=R;d[i++]=(byte)(b[o]=y);d[i++]=(byte)(y>>8);}return d;}

    public static void main(String[] args) throws Exception {
        byte[] data = new codegolf13003().g();
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 1, 2, 44100, false/*LE*/);
        AudioInputStream stream = new AudioInputStream(bais, format, data.length / 2);
        new Previewer().preview(stream);
    }

    static class Previewer implements LineListener {
        Clip clip;

        public void preview(AudioInputStream ais) throws Exception {
            AudioFormat audioFormat = ais.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);

            clip = (Clip)AudioSystem.getLine(info);
            clip.addLineListener(this);

            clip.open(ais);
            clip.start();
            while (true) Thread.sleep(50); // Avoid early exit of program
        }

        public void update(LineEvent le) {
            LineEvent.Type type = le.getType();
            if (type == LineEvent.Type.CLOSE) {
                System.exit(0);
            }
            else if (type == LineEvent.Type.STOP) {
                clip.close();
            }
        }
    }
}

আরও পড়ুন: Karplus-স্ট্রং সংশ্লেষণ


পালস অডিও ছাড়া শুরু করতে আমি এটি ব্যবহার করি:java -Djavax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider -Djavax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider -Djavax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider -Djavax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider codegolf13003
vi।

ধরে নিচ্ছি আপনি কিছু পার্কশন চাইছিলেন, তবে কোনটি ঠিক তা নিশ্চিত নয়। এটি কিছুটা "বৈদ্যুতিন" শোনায়।
vi।

@ ভী।, আমি এটি প্রকাশ করার আগে আমি অন্য লোকেরা কোন উপকরণটি লক্ষ্য করছি বলে মনে করে তা বলার জন্য আমি এটি ছেড়ে দেব leave
পিটার টেলর

যেহেতু লোকেরা অনুমান করার জন্য কয়েক দিন সময় নিয়েছে, আমি মটরশুটি ছড়িয়ে দেব। অভিযুক্ত যন্ত্রটি একটি ফাঁদ।
পিটার টেলর

আপনি তুলনা করতে প্রকৃত রেকর্ড করা নমুনা একটি লিঙ্ক দিতে পারেন?
vi।

2

সি

এখানে g()ফাংশনটি রয়েছে, বয়লারপ্লেট ছাড়াই।

void g(signed short *array, int* length)
{
    short r[337];
    int c, i;

    *length = 44100 * 6;
    for (i = 0 ; i < 337 ; ++i)
        r[i] = rand();
    *array = *r;
    for (i = c = 1 ; i < *length ; ++i) {
        array[i] = r[c];
        r[c] = (r[c] + array[i - 1]) * 32555 / 65536;
        c = (c + 1) % 337;
    }
}

একটি আকর্ষণীয় পরীক্ষা হ'ল প্রথম লুপটি যা এলোমেলো মানগুলির একটি প্রাথমিক ক্রম সূচনা করে। থেকে কল প্রতিস্থাপন rand()সঙ্গে i*iএকটি বিশ্বাসযোগ্য ভাবে শব্দ চরিত্র পরিবর্তিত করে (যে শোনাচ্ছে সংশ্লেষণ মত একই উপকরণ পরিবারের একজন বিভিন্ন সদস্য অনুসারী হয়)। i*i*iএবং i*i*i*iঅন্যান্য শব্দ গুণাবলী প্রদান করুন, যদিও প্রত্যেকে এর মতো শোনার কাছাকাছি আসে rand()। একটি মান মত i*327584বা i*571, অন্য দিকে, পুরোপুরি ভিন্ন (এবং কম কিছু বাস্তব একজন অনুকরণ মত) শোনাচ্ছে।


একই ফাংশনের আরেকটি ছোটখাটো প্রকরণ অন্য যন্ত্রের আরও কাছাকাছি আসে বা কমপক্ষে এটি আমার কানে আসে।

void g(signed short *array, int* length)
{
    int i;

    *length = 44100 * 6;
    for (i = 0 ; i < 337 ; ++i)
        array[i] = rand();
    for ( ; i < *length ; ++i)
        array[i] = (array[i - 337] + array[i - 1]) * 32555 / 65536;
}

যোগ করার জন্য সম্পাদিত: আমি এটিকে কোড গল্ফ প্রশ্ন হিসাবে দেখছি না, যেহেতু এটি (1500-চর সীমা ছাড়িয়ে) হিসাবে চিহ্নিত করা হয়নি, তবে যেহেতু এটি মন্তব্যগুলিতে উত্থাপিত হয়েছে, তাই উপরের একটি গল্ফ সংস্করণ এখানে ( 96 টি অক্ষর):

g(short*a,int*n){int i=0;for(*n=1<<18;i<*n;++i)
a[i]=i>336?32555*(a[i-337]+a[i-1])/65536:rand();}

(আমি বিশ্বব্যাপী ভেরিয়েবলগুলি ব্যবহার করতে যদি ফাংশন ইন্টারফেসটি পরিবর্তন করতে পারি তবে আমি এটি 80 টি অক্ষরের নীচে নামতে পারতাম))


কার্প্লাস-স্ট্রং স্ট্রিং। আমার কাছে স্টিলের স্ট্রিংয়ের মতো শোনাচ্ছে।
পিটার টেলর

@ পিটারটেলর আমার চিন্তাভাবনা ঠিকঠাক। অন্যদিকে নীচের রূপটি আমার কাছে একেবারে হার্পসিফোর্ডের অন্ত্রের (বা নাইলন) স্ট্রিংয়ের মতো শোনাচ্ছে। বিভ্রমটি শেষ করতে এটির পরে কেবল ফিরে আসা কুইলের থঙ্ক প্রয়োজন।
ব্রেডবক্স

হোয়াইটস্পেস এবং সংক্ষেপিত সরানোর পরে array, length, voidএবং signed113 বাইট: দ্বিতীয় কোডে আমি স্কোর করেছেন। খুব সুন্দর চেষ্টা। এবং শব্দ বরং ভাল।
vi।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.