本文介绍了注意合成,谐波(小提琴,钢琴,吉他,贝司),频率,MIDI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想找到,笔记是如何建造。
例如,对于一个乐器(小提琴或钢琴),注意LA4(A4)具有特殊振幅的交流在440Hz的主要(或中央)频率FC,而且它必须有其他的频率(谐波?)FH与其他振幅啊。

I want to find, how notes were built.Example for a Instrument (Violin or Piano), The Note LA4 (A4) has main (or central) frequency FC at 440Hz with a Specific Amplitude AC, but also it must has other frequencies (harmonics?) FH with other amplitudes AH.

谐波有依赖主频与幅度其它频率(几乎)小于主频率的幅度。

The Harmonics have other frequencies that are dependant of Main Frequency with amplitudes (almost) less than the amplitude of Main Frequency.

成型(建筑)注释

我想知道是如何形成(建立)的注意事项(无时间被认为是)。

I want to know how is formed (established) the notes (No time is considered).

例如:
A4 = AC(FC)+ AH1(FH1)+ AH2(FH2)+ AH3(FH3)+ AH4(FH4).... AHN(FHN)
也许,FH1 = 2 * FC,FH2 = 3 * FC,FH3 = 4 * FC,等等...

Example:A4 = AC(FC) + AH1(FH1)+ AH2(FH2) + AH3(FH3) + AH4(FH4)....AHn(FHn)Maybe, FH1 = 2*FC, FH2 = 3*FC, FH3 = 4*FC, and so on....

乐器(小提琴与钢琴)之间的比较

有关钢琴,音符LA4(A4)具有440Hz的主频率FC和
也许,FC(钢琴)= FC(小提琴),FH1(钢琴)= FH1(小提琴),FH2(钢琴)= FH2(小提琴),等等....

For Piano, The Note LA4 (A4) has main frequency FC at 440Hz, andMaybe, FC(Piano) = FC(Violin), FH1(Piano) = FH1(Violin), FH2(Piano) = FH2(Violin), and so on....

不过,AC(钢琴)!= AC(小提琴),AH1(钢琴)!= AH1(小提琴),AH2(钢琴)!= AH2(小提琴),等等....

But, AC(Piano) != AC(Violin), AH1(Piano) != AH1(Violin), AH2(Piano) != AH2(Violin), and so on....

我的问题的示例如下:
http://www.phys.unsw.edu.au/jw/sound.spectrum.html

我要玩这个笔记避免MIDI格式,这可以在Java / C#(或其他语言编程)来实现更高版本,以及更多的控制我的声音。

I want to play this notes avoiding MIDI format, this can be implemented in Java/C# (or other language programming) Later, and more control of my sounds.

感谢您。

安娜

推荐答案

我有这...

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

这code是小提琴仪器中使用:

This code is used in Violin instrument:

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

试试这个code,我的声音不完美,但很相似。

Try this code, my sound isn't perfect but is very similar.

这篇关于注意合成,谐波(小提琴,钢琴,吉他,贝司),频率,MIDI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-26 19:35