2012-05-22 25 views
6

मैं खोजने के लिए, कैसे नोट्स बनाए गए थे चाहते हैं। एक साधन (वायलिन या पियानो), नोट LA4 (A4) के लिए उदाहरण एक विशिष्ट आयाम एसी के साथ 440Hz पर मुख्य (या केंद्रीय) आवृत्ति एफसी है, लेकिन यह भी यह करना चाहिए अन्य आयाम के साथ अन्य आवृत्तियों (हार्मोनिक्स?) है एफ एच एएच।नोट संश्लेषण, हार्मोनिक्स (वायलिन, पियानो, गिटार, बास), आवृत्ति, मिडी

हार्मोनिक्स अन्य आवृत्तियों कि आयाम के साथ मुख्य आवृत्ति की निर्भर कर रहे हैं (लगभग) मुख्य आवृत्ति के आयाम की तुलना में कम है।

बनाने (निर्माण) नोट्स

मुझे पता है कि कैसे है का गठन (स्थापित) नोट्स (कोई समय माना जाता है) चाहते हैं।

उदाहरण: ए 4 = एसी (एफसी) + AH1 (FH1) + AH2 (FH2) + AH3 (FH3) + AH4 (FH4) .... Ahn (FHn) हो सकता है, FH1 = 2 * एफसी, FH2 = 3 * एफसी, मुख्य आवृत्ति एफसी FH3 = 4 * एफसी, और इतने पर ....

उपकरणों (वायलिन और पियानो)

पियानो के लिए के बीच मुकाबले नोट LA4 (A4) है 440Hz, और हो सकता है कि में, एफसी (पियानो) = एफसी (वायलिन), FH1 (पियानो) = FH1 (वायलिन), FH2 (पियानो) = FH2 (वायलिन), और इतने पर ....

लेकिन, एसी (Pian ओ) = एसी (वायलिन), AH1 (पियानो) = AH1 (वायलिन), AH2 (पियानो) = AH2 (वायलिन), और इतने पर ....

मेरे सवाल का उदाहरण है:! http://www.phys.unsw.edu.au/jw/sound.spectrum.html

मैं इस मिडी प्रारूप, इस में जावा/सी # (या अन्य भाषा प्रोग्रामिंग) बाद में लागू किया जा सकता, और मेरी लगता है की अधिक नियंत्रण से बचने के नोट खेलना चाहता हूँ।

धन्यवाद।

एना

उत्तर

3

मैं इस है ...

int iTone = 40; //Tone to be interpreted 
    iSmplRate = 32000; //Sample Rate 
    int NumBytesPerSample = 16; // 8 or 16 
    int NumChannels = 2; //1 Mono, 2 Stereo 
    double Duration = 6.5; //Seconds performing 
    Short sAmplit = 1200; 
    int iNumSmpl = (int)(SampleRate*Duration); 
    NumTotalBytes = (int)(SampleRate*Duration*NumBytesPerSample*NumChannels); 
    ByteBuffer bbWav = ByteBuffer.allocate(NumTotalBytes); 


    double dMaxInstr = (double)Short.MIN_VALUE; 
    double dMinInstr = (double)Short.MAX_VALUE; 


    //Amplitude for violin's armonics 
    double[] violAmps = {1.0, 0.286699025, 0.150079537, 0.042909002, 
         0.203797365, 0.229228698, 0.156931925, 
         0.115470898, 0.0, 0.097401803, 0.087653465, 
         0.052331036, 0.052922462, 0.038850593, 
         0.053554676, 0.053697434, 0.022270261, 
         0.013072562, 0.008585879, 0.005771505, 
         0.004343925, 0.002141371, 0.005343231, 
         0.000530244, 0.004711017, 0.009014153}; 

    //Amplitude for piano's armonics 
    double[] pianAmps = {1.0, 0.399064778, 0.229404484, 0.151836061, 
         0.196754229, 0.093742264, 0.060871957, 
         0.138605419, 0.010535002, 0.071021868, 
         0.029954614, 0.051299684, 0.055948288, 
         0.066208224, 0.010067391, 0.00753679, 
         0.008196947, 0.012955577, 0.007316738, 
         0.006216476, 0.005116215, 0.006243983, 
         0.002860679, 0.002558108, 0.0, 0.001650392}; 
    double[] operator = {1.0}; 
    if (instrument.equals("violin")) { 
     operator = violAmps; 
    } 
    if (instrument.equals("piano")) { 
     operator = pianAmps; 
    } 
    double dFreq = 440.0*Math.pow(2.0, (iTone-69)/12.0; 

    double dFreqRel = iSmplRate/dFreq; 
    Integer iSampleInstrument = null; 
    double PI2 = 2*Math.PI; 

    int[] iSamplesInstr = new int[iNumSmpl]; 
    for (int i = 0;i < iNumSmpl; i++) { 
     Double Angle = i*PI2/dFreqRel; 
     Double dInstrument = 0.0; 
     for (int a = 1; a <=operator.length; a++) { 
     dInstrument += operator[a-1]*Math.sin((double)a*Angle); 
     } 

     dMaxInstr = (dInstrument>dMaxInstr)?dInstrument:dMaxInstr; 
     dMinInstr = (dInstrument<dMinInstr)?dInstrument:dMinInstr; 

     iSampleInstrument = (int)(sAmplit*dInstrument); 

     if (instrument.equals("violin")) { 
     double FreqEnvV = iSmplRate/6.0; 
     double FracEnvV = 35.0; 
     double dEnvViolin = sAmplit*DStepperExt(Math.sin(1.0*i*PI2/FreqEnvV),4)/FracEnvV; 
     iSampleInstrument = (int)(iSampleInstrument+dEnvViolin); 
     } 
     if (instrument.equals("piano")) { 
     double FracEnvP = 8.0/10.0; 
     double AngP = (double)i/(iSmplRate*FracEnvP); 
     double EnvPiano = 1.0/Math.exp(AngP); 
     iSampleInstrument = (int)(iSampleInstrument*EnvPiano); 
     } 
     dMxSmplInstr = (iSampleInstrument>dMxSmplInstr)?iSampleInstrument:dMxSmplInstr; 
     dMnSmplInstr = (iSampleInstrument<dMnSmplInstr)?iSampleInstrument:dMnSmplInstr; 
     iSamplesInstr[i] = iSampleInstrument; 
    } 

    double dMaxAbs = 
      (Math.abs(dMaxInstr)>Math.abs(dMinInstr))?Math.abs(dMaxInstr):Math.abs(dMinInstr); 
    double dMxAbsSmpl = 
      (Math.abs(dMxSmplInstr)>Math.abs(dMnSmplInstr))?Math.abs(dMxSmplInstr):Math.abs(dMnSmplInstr); 
    double dNormal = 1.0; 
    if (dMxAbsSmpl > 32768.0) { 
     dNormal = 32768.0/dMxAbsSmpl; 
    } 

    for (int i = 0;i < iNumSmpl; i++) { 
     short sSampleInst = (short)(iSamplesInstr[i]*dNormal); 
     try { 
     if (iNumByteSmpl == 2) { 
      bbWav.put((byte)((sSampleInst >> 0) & 0xFF)); 
      bbWav.put((byte)((sSampleInst >> 8) & 0xFF)); 
      if (iNumChnnls == 2) { 
      bbWav.put((byte)((sSampleInst >> 0) & 0xFF)); 
      bbWav.put((byte)((sSampleInst >> 8) & 0xFF)); 
      } 
     } else { 
      byte ByteSample = (byte)((sSampleInst >> 8) & 0xFF); 
      short ShrtSample = (short)(ByteSample & 0xFF); 
      ShrtSample += 128; 
      bbWav.put((byte)(ShrtSample & 0xFF)); 
      if (iNumChnnls == 2) { 
      bbWav.put((byte)(ShrtSample & 0xFF)); 
      } 
     } 
     } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     } 

इस कोड वायलिन साधन में प्रयोग किया जाता है:

private Double DStepperExt(Double Val, Integer Steps) { 
    //Return a value inside in range defined by step 
    //Divide [-1.0,1.0]/(Steps-1), retorning the value according to the range 
    //The value must be between 0.0 and 1.0 
    if (Steps <= 0.0) { 
     return 0.0; 
    } 
    if (Val != -1.0 && Val != 1.0) { 
     Val = Val - Val.intValue(); 
    } 
    Double sDouble = new Double(Steps-1); 
    Double bdStep = 2.0/sDouble; 
    Double bdRef = bdStep/2.0; 
    bdRef = bdRef - 1.0; 
    Double bdInit = -1.0; 

    Double bdRet = null; 
    for (int c = 0; c<=sDouble;c++) { 
     if (Val < bdRef) { 
     bdRet = bdInit; 
     break; 
     } else { 
     bdInit = bdInit+bdStep; 
     bdRef = bdRef+bdStep; 
     } 
    } 
    return Math.min(bdRet.doubleValue(),1.0); 
    } 

इस कोड का प्रयास करें, मेरे ध्वनि सही नहीं है लेकिन बहुत समान है।

+0

ग्रेट, बहुत समान है ... – Anita

+0

इस कोड में बहुत सारी अनुपलब्ध घोषणाएं हैं, जो संदिग्ध परिवर्तनीय नाम हैं। कैंट रन पेलेज़ अविकसित varibles घोषित, या कोड से उन्हें हटा दें। अविकसित वैरिएबल का उपयोग बिना किसी मूल्य के कोड में किया जाता है .... अभी, कोड केवल प्रेरित होना है। –

0

अगर मैं सही ढंग से समझ, आप उम्मीद है कि मूल साधन करने के लिए कुछ इसी तरह परिणाम होगा, एक फूरियर संश्लेषण करने के लिए कोशिश कर रहे हैं। मैं सफलता के लिए अवसरों को देख काफी स्लिम:

  • के बाद से इस को शुद्ध साइन लहरों की आवश्यकता होती है गठबंधन होगा यह, मिडी का उपयोग कर काम नहीं करेगा (जो मानक मिडी जी एस उपकरणों द्वारा उपलब्ध नहीं हैं)
  • एक विशाल की जरूरत है द्वारा आने के लिए मुश्किल डेटा की मात्रा; ध्यान दें, कि आपके गुणांक विशिष्ट करने के लिए "पियानो" अकेले नहीं हैं, लेकिन यह भी पिच के साथ अलग अलग है, इसलिए "पियानो a5" "पियानो ए 6"
    • इस मॉडल टोन के स्थिर राज्य मान लिया गया है से अलग मान हैं (एक अलग लक्ष्य साइन लहरों जोड़कर प्राप्त नहीं है); एक उपकरण की विशेषता तथापि अधिक दृढ़ हमले चरण

मैं एक परिचय के लिए जॉन पियर्स, संगीत ध्वनि के विज्ञान की सिफारिश करेंगे कर रहा है।

2

ध्यान रखें कि आप जो उपक्रम कर रहे हैं वह विशाल कार्य है।यदि आपका लक्ष्य अपने स्वयं के सिंथेसाइज़र को बनाना है जो विशिष्ट आयामों के साथ सामंजस्य को जोड़कर पियानो, वायलिन इत्यादि की तरह लग सकता है तो किसी भी तरह से यथार्थवादी ध्वनि बनाने के लिए अविश्वसनीय रूप से मुश्किल होती है। एक ध्वनिक उपकरण के हार्मोनिक्स एक जटिल फैशन में समय के साथ बदलते हैं। Guidot नोट्स के रूप में, ध्वनि के हमले और देरी के हिस्सों बहुत अलग होंगे। यदि आप समय के साथ कई बिंदुओं पर वास्तविक उपकरण के सापेक्ष आयामों को मापने का प्रयास करते हैं और फिर साइनसॉइड्स को संश्लेषित करते हैं तो सबसे अच्छा आप प्राप्त करेंगे जो कि बच्चे के खिलौने की तरह होगा।

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

यदि आप यथार्थवादी प्लेबैक बनाना चाहते हैं तो आपके पास दो विकल्प हैं। एक Wavetable synthesis का उपयोग करना है, जो कि कितने सस्ते संश्लेषक (विशेष रूप से पीसी ध्वनि कार्ड पर) काम करते हैं। दूसरा Physical Modelling Synthesis में देखना है जो यथार्थवादी ध्वनियां बनाने के लिए एक उपकरण के भौतिकी को अनुकरण करता है।