soundsurgeon

2025-12-11 0 930

soundsurgeon HTML5合成器

JS-11-16单声道:由Web Audio API创建的电子乐器,它生活在soundsurgeon .com上。

它始于我在2016 – 17年参加的大会JavaScript开发课程的最后一个项目。


此应用中使用的JavaScript库:

  • tone.js声音合成
  • teoria.js生成量表和模式
  • UI和活动处理的jQuery
  • 高级键盘事件处理的键盘
  • Vite构建工具

JS-11-16 Monosynth是一种乐器,可让用户使用Qwerty键盘的主排或通过屏幕上的按钮弹奏八度音符。

该HTML5应用程序使用Web音频API在浏览器中生成声音而无需使用音频文件。 Web音频API允许以1960年代和70年代的模拟模块化合成器的方式进行减法合成: MoogBuchla等。

在Web音频API中, AudioContext对象是一个音频处理接口,由相互连接的音频模块组成,例如模块化合成器。这些模块(称为节点)是使用构造方法方法创建的,而其他AudioContext方法连接并操纵节点。

 // create AudioContext
var a = new AudioContext ( ) ;

// create GainNode
var g = a . createGain ( ) ;

// create OscillatorNode
var o = a . createOscillator ( ) ;

// set OscillatorNode.type to \'sine\'
o . type = \'sine\' ;

// OscillatorNode.frequency.value in Hertz
o . frequency . value = \'1000\' ;

// connect OscillatorNode to GainNode
o . connect ( g ) ;

// connect GainNode to AudioDestinationNode
g . connect ( a . destination ) ;

// GainNode gain value range: 0 = 0%, 1 = 100%
g . gain . value = 0 ;

// start OscillatorNode instantly
o . start ( 0 ) ;

Tone.js是一个将Web音频API AudioContext和节点抽象到Tone对象中的框架,其中包含诸如InstrumentEffect的对象类型,在音乐环境中更易于使用。例如,您可以使用科学音调符号选择音符来选择频率,也可以像分数一样定义音符持续时间:

 // Tone.js \"Hello World\"

// create a synth and connect it to the destination (your speakers)
var synth = new Tone . Synth ( ) . toDestination ( ) ;

// play a middle \'C\' for the duration of an 8th note
synth . triggerAttackRelease ( \"C4\" , \"8n\" ) ;

App.init中, App.synthObj被分配了一个Tone.MonoSynth仪器的实例。

  • 一个振荡器
  • 连接到振幅信封
  • 连接到由自己的信封控制的过滤器
  • 连接到Tone.Destination输出对象。

Tone.js API描述了可用于Tone组件的各种方法和参数。主要Tone.MonoSynth单一声音参数是:

  • 振荡器
    • 静音按钮
    • 音量滑块
    • 波形:
    • 正弦
      • 正方形(默认)
      • 三角形
      • 锯齿
    • 解剖
    • 滑音
  • 振幅信封
    • 攻击
    • 衰变
    • 维持
    • 发布
  • 过滤信封
    • 攻击
    • 衰变
    • 维持
    • 发布
    • “问”

用户界面用于生活在index.html中,但现在通过App.view中的模板字符串生成。 HTML5 <input>元素用于控制以下参数:

  • 静音按钮的checkbox
  • radio选择
  • 所有其他参数的range滑块

App.init中调用的App.initControls方法。INIT接受tone.js Synth对象作为参数,获取合成器的声音参数,并调整UI以使用jQuery方法来表示这些值:

initControls: function ( synth ) {
  var initWaveform = \'input[value=\"\' + synth . oscillator . type + \'\"]\' ;
  $ ( initWaveform ) . attr ( \'checked\' , \'checked\' ) ;
  $ ( \'.envelope .attack\' ) . val ( synth . envelope . attack ) ;
  $ ( \'.envelope .sustain\' ) . val ( synth . envelope . sustain ) ;
  $ ( \'.envelope .decay\' ) . val ( synth . envelope . decay ) ;
  $ ( \'.envelope .release\' ) . val ( synth . envelope . release ) ;
  $ ( \'.portamento\' ) . val ( synth . portamento ) ;
  $ ( \'.detune\' ) . val ( synth . detune . value ) ;
  $ ( \'.filter .q\' ) . val ( synth . filter . Q . value ) ;
  $ ( \'.filter-envelope .attack\' ) . val ( synth . filterEnvelope . attack ) ;
  $ ( \'.filter-envelope .sustain\' ) . val ( synth . filterEnvelope . sustain ) ;
  $ ( \'.filter-envelope .decay\' ) . val ( synth . filterEnvelope . decay ) ;
  $ ( \'.filter-envelope .release\' ) . val ( synth . filterEnvelope . release ) ;
}

App.init中调用的App.bindEvents方法也接受tone.js synth对象作为参数,并包含在UI元素更改时处理事件侦听器的代码:

 $ ( \'.mute\' ) . change ( function ( e ) {
  if ( $ ( this ) . is ( \':checked\' ) ) {
    Tone . Destination . mute = true ;
  } else {
    Tone . Destination . mute = false ;
  }
} ) ;
$ ( \'.volume\' ) . change ( function ( e ) {
  Tone . Destination . volume . value = $ ( this ) . val ( ) ;
} ) ;
$ ( \'.waveforms input\' ) . change ( function ( e ) {
  var waveform = $ ( this ) . val ( ) ;
  synth . oscillator . type = waveform ;
} ) ;
$ ( \'.envelope input\' ) . change ( function ( e ) {
  var controlName = this . name ;
  var controlValue = $ ( this ) . val ( ) ;
  var currentEnv = synth . envelope ;
  currentEnv [ controlName ] = controlValue ;
} ) ;
$ ( \'.portamento\' ) . change ( function ( e ) {
  synth . portamento = $ ( this ) . val ( ) ;
} ) ;
$ ( \'.detune\' ) . change ( function ( e ) {
  synth . detune . value = $ ( this ) . val ( ) ;
} ) ;
$ ( \'.filter .q\' ) . change ( function ( e ) {
  synth . filter . Q . value = $ ( this ) . val ( ) ;
} ) ;
$ ( \'.filter-envelope input\' ) . change ( function ( e ) {
  var controlName = this . name ;
  var controlValue = $ ( this ) . val ( ) ;
  var currentEnv = synth . filterEnvelope ;
  currentEnv [ controlName ] = controlValue ;
} ) ;

App.bindEvents还使用键盘键,这是一个键绑定库,最重要的是允许.preventRepeat()方法在按键下键时禁用密钥重复。主排键的名称保存在CONSTANTS对象中的变量中,而音调触发器都附加到键绑定和<button> ui元素的<label>元素。

 CONSTANTS . HOME_ROW . forEach ( function ( elem , i ) {
  keyboardJS . bind ( elem , function ( e ) {
    e . preventRepeat ( ) ;
    synth . triggerAttack ( App . currentScale [ i ] ) ;
    $ ( keybtns ) . removeClass ( \'active\' ) ;
    $ ( keybtns [ i ] ) . addClass ( \'active\' ) ;
  } ,
  function ( event ) {
    $ ( keybtns [ i ] ) . removeClass ( \'active\' ) ;
    synth . triggerRelease ( ) ;
  } ) ;
} ) ;
document . querySelectorAll ( \'.keyboard label\' ) . forEach ( function ( elem , i ) {
  elem . addEventListener ( \'mousedown\' , function ( e ) {
    synth . triggerAttack ( App . currentScale [ i ] ) ;
  } ) ;
  elem . addEventListener ( \'mouseup\' , function ( e ) {
    synth . triggerRelease ( ) ;
  } ) ;
} ) ;

teoria.js是一个图书馆,允许在西方音乐理论背景下进行编程。在开发的早期, CONSTANTS.DEFAULT_SCALE数组为该应用提供了Tone对象所需的注释来创建完整的比例。 teoria.js允许对象表示尺度,注释和间隔,并且可以像jQuery一样将对象链接在一起。 App.generateScale方法现在返回用于创建注释的数组,以便将来,用户可以选择他们想要控制键盘的补品音符,八度和比例尺。

generateScale: function ( tonic , scaleType ) {
  var tonicObj = teoria . note ( tonic ) ;
  var scaleObj = tonicObj . scale ( scaleType ) ;
  var notesArr = scaleObj . notes ( ) ;
  var noteNamesArr = [ ] ;
  notesArr . forEach ( function ( e , i ) {
    noteNamesArr . push ( e . scientific ( ) ) ;
  } ) ;
  noteNamesArr . push ( teoria . interval ( tonicObj , \'P8\' ) . scientific ( ) ) ;
  return noteNamesArr ;
}

该应用程序可能会有许多不同的方向:

  • 通过JS生成UI
  • 添加效果和复音
  • 允许保存和回忆补丁
  • 添加和弦Arpeggator或Suequencer
  • 添加Web MIDI API支持,以便可以使用MIDI键盘播放合成器

上次更新:2023-12-23 07:25 UTC

下载源码

通过命令行克隆项目:

git clone https://github.com/oliverbaptiste/soundsurgeon.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 建站资源 soundsurgeon https://www.zuozi.net/34996.html

HTMLRadioPlayer
上一篇: HTMLRadioPlayer
ex_fontawesome
下一篇: ex_fontawesome
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务