在电脑上弹钢琴是什么体验?

简介: 在电脑上弹钢琴是什么体验?

学钢琴?用电脑就够了,实现网页版钢琴88音弹奏

一、起因

其实自己想学钢琴很久了,一直没有机会,偶然看到了网上有人做了网页版的钢琴,我试玩了一下,发现大多只有10多个音,这是完全无法满足我的,对此有了想要自己制作一个网页版钢琴的想法。

二、准备工作

为了制作这个钢琴,我首先是去查找了很多琴键的相关信息资料,知道了钢琴琴键的88个音,之后收集了88个琴键的音效就可以开始写代码了。

三、撸代码

1、创建黑白琴键

var m = document.getElementById("main");
var bk = [2,3,5,6,7];
for(var i = 1;i<53;i++){
    //创建元素
    var newNode = document.createElement("div");
    //添加元素
    newNode.id = "key" + i;
    newNode.className = "white";
    newNode.style.width = 100/52 + "vw";
    // newNode.innerText = (i+5)%7;
    m.appendChild(newNode)
    if(i==1){
        newNode = document.createElement("div");
        newNode.id = "key" + 53;
        newNode.className = "black";
        newNode.style.left = 75/52 + "vw";
        newNode.style.width = 50/52 + "vw";
        // newNode.innerText = i;
        m.appendChild(newNode)
    }
}
var bb = 54;
for(i=1;i<8;i++){
    for(var j = 0;j<bk.length;j++){
        //创建元素
        var newNode = document.createElement("div");
        //添加元素
        newNode.id = "key" + bb;
        bb++;
        newNode.className = "black";
        newNode.style.left = ((bk[j]+(i-1)*7)*100/52+75/52)+"vw";
        newNode.style.width = 50/52 + "vw";
        // newNode.innerText = i*(j+1);
        newNode.style.color = "white";
        m.appendChild(newNode)
    }
}

2、曲谱导入功能

//导入文件
var readAsText = document.getElementById("readAsText");
readAsText.addEventListener('click',function(){
    showDataByText();
},false)
//通过文件读取数据
function showDataByText(){
    var that = this;
    var resultFile = document.getElementById("fileUpload").files[0];
    if (resultFile) {
        var reader = new FileReader();
        //以GBK编码读取文件
        reader.readAsText(resultFile,'GBK'); 
        reader.onload = function (e) {
            // console.log("e",e);
            //获取上传文件名
            var a = document.getElementById("fileUpload").value;
            //截取文件名后缀
            var atype = a.substring(a.length-3);
            //获取文件文本内容
            var urlData = this.result;
            //判断上传文件类型
            if(atype != "txt"){
                alert("请选择txt文件");
            }
            else{
                // document.getElementById("result").innerHTML += urlData;
                // console.log(urlData);
                autoPlayMusic(urlData);
            }
        };
    }
}

3、琴键声音播放

function playSound(noteNumber){
    var soundId = 'sound' + noteNumber;
    var keyId = 'key' + noteNumber;
    var key = document.getElementById(keyId);
    var audio = null;
    if(key){
        audio = new Audio("sound/"+noteNumber+".mp3");
        audio.play();
        key.style.backgroundColor = '#9cf';
        setTimeout('setOriginColor(' + noteNumber + ')', 100);
    }
}

4、自动读取琴谱弹奏功能实现

var ii = 0,music;
var autoplay = function(){
    playSound(keyfrom[music[ii]]);
    ii++;
    if(ii<music.length)
        if(music[ii] == 0 ) {
            setTimeout('autoplay()', 300);
        }
        else {
            setTimeout('autoplay()', 320);
        }
}
var autoPlayMusic = function(e){
    ii = 0;
    e.replace("/n","");
    music = e.split(',');
    setTimeout('autoplay()', 2000);
    console.log(music);
}

5、键盘监听

document.onkeydown = function(e) {
    var pressEvent = e || window.event;
    var keyCode = '';
    if(pressEvent.keyCode){
        keyCode = pressEvent.keyCode;
    }else if(pressEvent.charCode){
        keyCode = pressEvent.charCode;
    }else if(pressEvent.which){
        keyCode = pressEvent.which;
    }
    switch(keyCode){
        case 97:    //1
            playSound(24);
            break;
        case 98:    //2
            playSound(25);
            break;
        case 99:    //3
            playSound(26);
            break;
        case 100:    //4
            playSound(27);
            break;
        case 101:    //5
            playSound(28);
            break;
        case 102:    //6
            playSound(29);
            break;
        case 103:    //7
            playSound(30);
            break;
        case 104:    //8
            playSound(31);
            break;
        case 105:    //9
            playSound(32);
            break;
        case 111:    ///
            playSound(33);
            break;
        case 106:    //*
            playSound(34);
            break;
        case 109:    //-
            playSound(35);
            break;
        case 107:    //+
            playSound(36);
            break;
        case 13:    //enter
            playSound(37);
            break;
        case 65:  // a
            playSound(17);
            break;
        case 83:  // s
            playSound(18);
            break;
        case 68:  // d
            playSound(19);
            break;
        case 70:  // f
            playSound(20);
            break;
        case 71:  // g
            playSound(21);
            break;
        case 72:  // h
            playSound(22);
            break;
        case 74:  // j
            playSound(23);
            break;
        case 75:  // k
            break;
        case 87:  // w
            playSound(64);
            break;
        case 69:  // e
            playSound(65);
            break;
        case 84:  // t
            playSound(66);
            break;
        case 89:  // y
            playSound(67);
            break;
        case 85:  // u
            playSound(68);
            break;
        case 86:  // v
            playSound(38);
            break;
        case 66:  // b
            playSound(39);
            break;
        case 78:  // n
            playSound(40);
            break;
        case 77:  // m
            playSound(41);
            break;
        case 188: // ,
            playSound(42);
            break;
        case 190: // .
            playSound(43);
            break;
        case 191: // /
            playSound(44);
            break;
        case 49:  //1
            playSound(10);
            break;
        case 50:  //2
            playSound(11);
            break;
        case 51:  //3
            playSound(12);
            break;
        case 52:  //4
            playSound(13);
            break;
        case 53:  //5
            playSound(14);
            break;
        case 54:  //6
            playSound(15);
            break;  
        case 55:  //7
            playSound(16);
            break;
        default:
            break;
    }
}

四、实现效果

可以通过键盘弹奏,也可以通过上传乐谱实现自动演奏,总的来说还是实现得很不错的,奈何自己弹奏水平有限,无法弹出很好的音乐。由于电脑键盘不是很够,所以暂时我只是放了五组音调进去,希望有想法的可以跟我反馈反馈,感谢大家的观看。

五、玩法

六、试玩地址

1、试玩地址

http://jdhnv787.xyz/JYeontu/#/cssEffects/piano

2、GitHub代码

https://github.com/yongtaozheng/html-css-js-Achieve-cool-results

3、个人博客

http://47.113.84.128:8090/

目录
相关文章
无影云电脑使用感受
简单谈谈无影云电脑使用的感受
836 0
无影云电脑使用感受
|
3天前
|
开发框架 运维 安全
无影云电脑,畅享极速渲染新体验
本文介绍了渲染行业面临的挑战及无影云电脑带来的革新。传统渲染依赖高性能本地设备,面临重投入、性能固定、灵活性差和数据安全问题。无影云电脑通过云端算力,实现了灵活扩展、任意终端接入及按需付费,大幅提升了渲染效率与体验,尤其在游戏设计、工业制造等领域表现突出。其核心技术确保了色彩还原、流畅操作及外设兼容性,满足专业设计师的需求。未来,无影将助力渲染行业实现更高效、安全的云端工作模式。
|
云安全 安全 小程序
无影-阿里云第一款云电脑,它拥有超越PC的完美体验
无影是一款面向数字经济时代的生产力工具,基于流式传输服务和容器化架构,可实现随时随地云上办公、海量算力触手可得、海量应用一网打尽,依托阿里云打造云管端一体化安全防护体系,全面保障企业业务和数据安全,拥有超越PC的便捷、流畅、安全、高效体验。
26982 0
无影-阿里云第一款云电脑,它拥有超越PC的完美体验
|
8月前
|
存储 人工智能 自然语言处理
每帧纵享丝滑——ToDesk云电脑、网易云游戏、无影云评测分析及ComfyUI部署
作为一种新兴的虚拟电脑服务方式,云电脑将传统电脑的计算、存储和应用服务等功能迁移到云端,打破了传统电脑的物理限制,通过云端连接,即可享受到高效、稳定的资源与服务,为人们提供了更加灵活、便捷、安全的工作与娱乐模式。 今天,本篇文章将带来ToDesk云电脑、网易云游戏、无影云三款云电脑的性能测评、AIGC科研测评和软件应用实测分析。
|
存储 运维 安全
能多端登录的无影云电脑有哪些花式玩法?
能多端登录的无影云电脑有哪些花式玩法?
712 1
|
存储 运维 安全
无影云电脑初体验
#我与无影初体验 #无影使用感受
72017 91
无影云电脑初体验
|
Windows
电脑史上最S的操作,让你电脑比德芙还丝滑
电脑史上最S的操作,让你电脑比德芙还丝滑
126 0
电脑史上最S的操作,让你电脑比德芙还丝滑
|
存储 运维 云计算
|
存储 运维 安全
无影日常办公体验
体验了云桌面的几项工作中常见的功能。总体感觉还不错。
27260 3
无影日常办公体验
|
Web App开发 机器学习/深度学习 安全
2022年来点不一样的体验,玩一玩云桌面吧!
最近阿里云推出云桌面体验活动,有幸被邀请参加。 作为一个开发者,和代入一个企业管理者的角度,分享一下云应用的使用。 整个过程非常顺畅,加上个人技巧,特此分享一下感受。
659 0
2022年来点不一样的体验,玩一玩云桌面吧!

热门文章

最新文章