首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎么吹萨克斯风?

问我怎么吹萨克斯风?
EN

Stack Overflow用户
提问于 2015-09-13 10:23:09
回答 1查看 203关注 0票数 3

该算法的结果如下所述:这里

我有一个注释数组:{ 60, 63, 67, 70, 73, 77, 73, 70, 67, 63 }和一个NOTE_LENGTH变量

首先,我用标准的MIDI男高音萨克斯管向MidiOutput设备发送第一个。

当最后一个音符播放2/3的NOTE_LENGTH毫秒时,我发送下一个音符。当为NOTE_LENGTH播放一个音符时,我就停止它。

笔记以Midi NoteOn开头,Midi NoteOff停止

很容易在产生的音频中找到音符的起始位置。这是不平滑的,而真正的萨克斯管是。如何实现像这段视频那样的平稳过渡?我不是音乐家,所以我不知道技术上的区别是什么。

更新

源代码,C# + NAudio.dll 1.3.8.0 (注意,它可能在以后的dll版本中不能工作)

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NAudio.Midi;

namespace Sax
{
    class Program
    {
        static void Main(string[] args)
        {
            MidiOut midi_out = new MidiOut(0);
            midi_out.Volume = 65535;
            midi_out.Send(MidiMessage.ChangePatch(67, 0).RawData);
            midi_out.Send(MidiMessage.ChangePatch(67, 1).RawData);
            int iteration = 0;
            int[] notes = new int[] { 60, 63, 67, 70, 73, 77, 73, 70, 67, 63 };
            //int[] notes = new int[] { 60, 61, 62, 63, 64, 65, 64, 63, 62, 61 };
            const int NOTE_LENGTH = 729;
            while (true)
            {
                midi_out.Send(MidiMessage.StartNote(notes[iteration % notes.Length], 127, iteration % 2).RawData);
                Thread.Sleep(1 * NOTE_LENGTH / 3);
                if (iteration != 0)
                    midi_out.Send(MidiMessage.StopNote(notes[(iteration - 1) % notes.Length], 127, (iteration - 1) % 2).RawData);
                Thread.Sleep(1 * NOTE_LENGTH / 3);
                midi_out.Send(MidiMessage.StartNote(notes[(iteration + 1) % notes.Length], 127, (iteration + 1) % 2).RawData);
                Thread.Sleep(NOTE_LENGTH / 3);
                midi_out.Send(MidiMessage.StopNote(notes[iteration % notes.Length], 127, iteration % 2).RawData);
                Thread.Sleep(NOTE_LENGTH/3);
                ++iteration;
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-13 13:22:02

使用midi音高弯道。有关一些示例的说明,请参见这就是答案。

为了获得正确的效果,你可能需要在第一个音符结束之前做一个快速的音高弯曲,在第二个音符结束时,弯曲结束与第二个音符完全一样。

你也可能想要看看内插的弯道,以获得最现实的声音可能,即,而不是一个线性螺距弯曲,你可能会得到更好的结果,慢进快速类型内插(反之亦然)。我不确定NAudio是否会支持插值,或者您是否必须自己实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32548644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档