个性化阅读
专注于IT技术分析

如何使用alphaTab在带有JavaScript的浏览器中显示Guitar Pro选项卡

本文概述

如果你曾经尝试学习弹吉他, 并且内部已经存在怪胎, 那么你可能会尝试过很棒的Guitar Pro, 该软件可以创作音乐, 转录你喜欢的歌曲, 或者只是阅读数千个可用的标签在网上。你可以简单地下载歌曲的选项卡, 然后尝试用吉他弹奏, 这简直令人难以置信。

现在, 如果你具有Javascript的基本编程知识, 则可以尝试使用开放源代码库AlphaTab在浏览器中实现和创建自己的” Guitar Pro”, 并且你将在本文中学习如何轻松地做到这一点。

什么是AlphaTab

alphaTab是跨平台音乐符号和吉他谱渲染库。你可以在自己的网站或应用程序中使用alphaTab来加载和显示来自Guitar Pro或内置标记语言alphaTex的数据源中的乐谱。 alphaTab主要关注基于Web的平台, 该功能允许将音乐符号嵌入到网站和基于浏览器的应用程序中, 但还可以在Windows, UWP和Xamarin等基于.net的平台中使用。 AlphaTab最著名的功能是:

  • 加载GuitarPro 3-5, GuitarPro 6, AlphaTex或MusicXML
  • 渲染为SVG, HTML5画布, GDI +
  • 将单个或多个乐器显示为标准的音乐符号和吉他谱, 包括歌曲信息, 重复, 结尾, 吉他调, 谱号, 键签名, 时间签名, 音符, 休止符, 偶发, 鼓谱, 钢琴大谱, 并列音符, 宽限期音符, 死音, 鬼音, 标记, 节奏, 歌词, 和弦, 颤音, 动态, 敲击/拍打/流行音乐, 淡入, 让铃, 手掌静音, 弦弯曲, 打击乐器, 颤音采摘, 笔触, 幻灯片, 颤音, 敲击, 连音, 指法和三连音感觉。
  • 通过动态调整大小来适应你的响应式设计。
  • 通过HTML5 Web Audio API和Flash播放音乐表。

严禁以任何方式删除”使用alphaTab呈现”的版权声明。这意味着你不得:

  • 删除或更改负责呈现此通知的源代码部分。
  • 通过裁剪或着色消息来隐藏此消息。

通过使用alphaTab, 你同意不会尝试任何隐藏此消息的操作。请访问该项目的主页和Github官方存储库以获取更多信息。

要求

  • AlphaTab的Javascript的生成母版(Javascript源代码和字体)。
  • 由于AlphaTab使用WebWorkers, 因此需要使用http或https协议来提供文件(file://将不起作用)。
  • 一个有效的吉他专业选项卡进行测试(你可以在freeguitarprotabs.com上从喜欢的歌曲和艺术家中找到很多选项卡)。

此外, AlphaTab使用Bravura字体渲染音乐符号。 Bravura是一种音乐字体, 它借鉴了19世纪和20世纪初的欧洲最佳音乐雕刻, 其外观比大多数其他音乐字体更大胆, 更显眼:细笔触比其他字体稍粗, 从而改善了整体远距离阅读时字体的”黑色”及其易读性。 Bravura已获得SIL开放字体许可(OFL)的许可, 这意味着它可以免费下载而使用时几乎没有限制。

确保将字体导入项目中, 否则注释将无法正确呈现:

AlphaTab注意渲染错误

入门

1.添加所需的文件

添加所需的文件以使AlphaTab与某些脚本标签一起使用:

<!-- Including alphaTab -->
<script type="text/javascript" src="js/AlphaTab.js"></script>

<!-- jQuery Plugin -->
<script src="js/jquery-2.2.4.min.js"></script>
<script type="text/javascript" src="js/jquery.alphaTab.js"></script>

<!-- Including alphaSynth -->
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript" src="js/AlphaSynth.js"></script>

<!-- alphaSynth Plugin -->
<script type="text/javascript" src="js/jquery.alphaTab.alphaSynth.js"></script>

2.创建音乐表容器

第一步, 你需要创建一个容器, 该容器将包装库生成的整个画布或SVG。该div需要通过data-file属性提供到Guitar Pro Tab文件的URL, 并且你需要定义要显示的初始音轨(为防止错误, 始终将第一个音轨标识为0)。 (可选)你可以插入显示加载消息的div, 并在最终加载Guitar Pro选项卡时将其删除:

<div id="alphaTab" data-file="/path/to/myguitarpro-tab-file.gp3" data-tracks="0">
    
    <div id="loading-div">
        Loading ...
    </div>
</div>

3.添加动作按钮

为了提供播放的基本控制, 我们需要添加一些按钮, 使我们可以播放, 暂停和停止MIDI声音。此外, 我们将添加一个div以显示选项卡的信息:

<input type="button" id="playPause" value="Play/Pause"/>
<input type="button" id="stopBtn" value="Stop"/>

<div id="file-info"></div>

4.声明标志变量并初始化alphaTab

我们将使用一些标志来了解选项卡的状态, 以便有条件地执行其他操作:

var playerReady = false;
var playerState = 0;
var at = $('#alphaTab');

// Load alphaTab
at.alphaTab({
    width: -1, // negative width enables auto sizing
    useWorker: true
});

// Initialize Player and Setup Player UI
var as = at.alphaTab('playerInit'); // init alphaSynth

5.添加一些基本的事件侦听器和操作

现在添加一些事件侦听器, 以了解何时加载了Guitar Pro选项卡, 播放器的状态何时改变以及单击侦听器以开始, 停止和暂停播放:

at.on('loaded', function (e) {
    var score = e.originalEvent.detail;
        
    // Add only the name of the tracks for information: 
    var info = jQuery('#file-info');
    info.html('');
    info.append('<p><b>Title:</b> ' + score.Title + '</p>');
    info.append('<p><b>Subtitle:</b> ' + score.Subtitle + '</p>');
    info.append('<p><b>Album:</b> ' + score.Album + '</p>');
    info.append('<p><b>Tempo:</b> ' + score.Tempo + '</p>');
    info.append('<p><b>Bars:</b> ' + score.MasterBars.length + '</p>');
    info.append('<p><b>Tracks:</b> (' + score.Tracks.length + ')</p>');
    var tracksHTML = $('<ul></ul>');

    for (var i = 0; i < score.Tracks.length; i++) {
        tracksHTML.append('<li> (#' + i + ') ' + score.Tracks[i].Name + '</li>');
    }

    info.append(tracksHTML);

    // Remove loading window
    $("#loading-div").remove();
});


// Important to load the file that allows to play sounds
as.On('ready', function (r) {
    // Load sound data (used to play sound, not the song itself)
    // Note: you need to provide the correct path to the default.sf2 file
    as.LoadSoundFontUrl('files/default.sf2');
});

// Show progress of the load of the guitar pro tab
as.On('soundFontLoad', function (loaded, full) {
    var percentage = ((loaded / full) * 100) | 0;

    console.log("Percentage sound loaded ", percentage + '%');
});


as.On('soundFontLoaded', function () {
    console.log("The sound source has been loaded");
});


as.On('readyForPlay', function (r) {
    playerReady = r;
});

as.On('playerStateChanged', function (s) {
    playerState = s;

    console.log(playerState);
    // 0 stopped 
    // 1 playing
    // 2 paused
});

$('#playPause').click(function () {
    if (playerState == 1) {
        as.Pause();
    } else {
        as.Play();
    }
});

$("#stopBtn").click(function () {
    as.Stop();
});

6.启用光标并添加基本CSS

启用光标以查看播放进度并突出显示音符:

at.alphaTab('playerCursor');

并添加一些CSS以使播放器起作用(这将为容器提供宽度, 并为光标提供某种样式):

.barCursor {
    opacity: 0.15;
    background: #FFF200;
}

.beatCursor {
    opacity: 0.75;
    background: #0078ff;
}

.selectionWrapper div {
    opacity: 0.1;
    background: #4040FF;
}

.atHighlight * {
    fill: #0078ff;
}

.alphaTabSurface {
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
    background: #FFF;
    border-radius: 3px;
}

#alphaTab {
    width: 95%;
    display: block;
    margin: auto;
}

#wrapper {
    position: absolute;
    top: 100px;
    background: blue;
    height: 600px;
    width: 80%;
    overflow: auto;
}

完成上一步之后, 你现在应该在浏览器中非常简单地实现Guitar Pro文件播放器。此外, 我们建议你在此处检查AlphaTab的其他功能和示例。

例子

以下示例显示如何显示Guitar Pro Tab文件的音轨以及播放, 暂停或停止它的按钮:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Guitar Pro tab with AlphaTab</title>

    <!-- Including alphaTab -->
    <script type="text/javascript" src="js/AlphaTab.js"></script>

    <!-- jQuery Plugin -->
    <script src="js/jquery-2.2.4.min.js"></script>
    <script type="text/javascript" src="js/jquery.alphaTab.js"></script>

    <!-- Including alphaSynth -->
    <script type="text/javascript" src="js/swfobject.js"></script>
    <script type="text/javascript" src="js/AlphaSynth.js"></script>

    <!-- alphaSynth Plugin -->
    <script type="text/javascript" src="js/jquery.alphaTab.alphaSynth.js"></script>

    <!-- Styles used during the reproduction of the MIDI melody -->
    <style type="text/css">
        .barCursor {
            opacity: 0.15;
            background: #FFF200;
        }
        
        .beatCursor {
            opacity: 0.75;
            background: #0078ff;
        }
        
        .selectionWrapper div {
            opacity: 0.1;
            background: #4040FF;
        }
        
        .atHighlight * {
            fill: #0078ff;
        }
        
        .alphaTabSurface {
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
            background: #FFF;
            border-radius: 3px;
        }
        
        #alphaTab {
            width: 95%;
            display: block;
            margin: auto;
        }
        
        #wrapper {
            position: absolute;
            top: 100px;
            background: blue;
            height: 600px;
            width: 80%;
            overflow: auto;
        }
    </style>
</head>

<body>
    <!-- START CONTROLS AND INFORMATION -->
    <div>
        <div style="display: inline-block; margin: 1em;">
            <!-- The action button to play or pause the tab -->
            <input type="button" id="playPause" value="Loading ... " disabled="disabled" />
            <input type="button" id="stopBtn" value="Stop" disabled="disabled" />
        </div>
        <div style="display: inline-block; margin: 1em;">
            <!-- The basic information of the gp file will be shown here -->
            <div id="file-info"></div>
        </div>
        <div style="display: inline-block;margin: 1em;">
            <!-- The track filter will be rendered in this div-->
            <div id="trackList"></div>
        </div>
    </div>
    <!-- END CONTROLS AND INFORMATION -->


    <!-- START DYNAMIC MUSIC SHEET -->

    <!-- 
        The data-tracks defines which track of the gp file should be initially used 
        Note: change the data-file property according to the URL of your guitar tab file
    -->
    <div id="alphaTab" data-file="files/guns_november_rain.gp3" data-tracks="0">
        <!-- This loading div is removed once the gp file is loaded -->
        <div id="loading-div">
            Loading ...
        </div>
    </div>

    <!-- END DYNAMIC MUSIC SHEET -->

    <script> 
        var playerReady = false;
        var playerState = 0;
        var at = $('#alphaTab');

    
        // 1. Register resize event 
        // we do this before initializing to receive the initial resize event
        $(at).on('resize', function (e) {
            var info = e.originalEvent.detail;
            var newSize = info.NewWidth;

            if (newSize < 700) {
                console.log(info.NewWidth, 'horizontal');
                info.Settings.Layout.Mode = "horizontal";
            } else {
                console.log(info.NewWidth, 'page');
                info.Settings.Layout.Mode = "page";
                delete info.Settings.Layout.AdditionalSettings['barsPerRow'];
            }
        });

        //
        // 2. Load alphaTab
        at.alphaTab({
            width: -1, // negative width enables auto sizing
            useWorker: true
        });

        //
        // 1. Initialize track selector
        // Note that in this example we allow to render multiple tracks in the view
        // You can simply create a select box that displays only 1 track at time
        var tracks = [];
        at.on('loaded', function (e) {
            var score = e.originalEvent.detail;
            var trackList = $('#trackList');
            trackList.empty();

            // Loop through the tracks of the file and add the tracks filter
            for (var i = 0; i < score.Tracks.length; i++) {
                // build list item for track
                var li = $('<li></li>');
                var a = $('<a href="#"></a>')
                    .data('track', score.Tracks[i].Index)
                    .append('<input type="checkbox" />')
                    .append(score.Tracks[i].Name)

                    // here we build the new track list and render it
                    .on('click', function (e) {
                        var track = $(this).data('track');
                        var index = tracks.indexOf(track);
                        if (index > -1) {
                            tracks.splice(index, 1);
                            $(this).find('input').prop('checked', false);
                        } else {
                            tracks.push(track);
                            tracks.sort(), $(this).find('input').prop('checked', true);
                        }

                        // render new tracks
                        at.alphaTab('tracks', tracks);

                        $(e.target).blur();

                        return false;
                    });

                li.append(a);

                trackList.append(li);
            }


            // Add only the name of the tracks for information: 
            
            var info = jQuery('#file-info');
            info.html('');
            info.append('<p><b>Title:</b> ' + score.Title + '</p>');
            info.append('<p><b>Subtitle:</b> ' + score.Subtitle + '</p>');
            info.append('<p><b>Album:</b> ' + score.Album + '</p>');
            info.append('<p><b>Tempo:</b> ' + score.Tempo + '</p>');
            info.append('<p><b>Bars:</b> ' + score.MasterBars.length + '</p>');
            info.append('<p><b>Tracks:</b> (' + score.Tracks.length + ')</p>');
            var tracksHTML = $('<ul></ul>');

            for (var i = 0; i < score.Tracks.length; i++) {
                tracksHTML.append('<li> (#' + i + ') ' + score.Tracks[i].Name + '</li>');
            }

            info.append(tracksHTML);

            $("#loading-div").remove();
        });


        // 3. Initialize Player and Setup Player UI
        var as = at.alphaTab('playerInit'); // init alphaSynth

        as.On('ready', function (r) {
            // Load sound data (used to play sound, not the song itself)
            as.LoadSoundFontUrl('files/default.sf2');
        });



        as.On('soundFontLoad', function (loaded, full) {
            var percentage = ((loaded / full) * 100) | 0;

            console.log("Percentage sound loaded ", percentage + '%');
        });


        as.On('soundFontLoaded', function () {
            console.log("The sound source has been loaded");
        });


        as.On('readyForPlay', function (r) {
            playerReady = r;
            updateControls();
        });

        as.On('playerStateChanged', function (s) {
            playerState = s;
            updateControls();
        });

        $('#playPause').click(function () {
            if (playerState == 1) {
                as.Pause();
            } else {
                as.Play();
            }
        });

        $("#stopBtn").click(function () {
            as.Stop();
            // Disable stop btn
            $(this).attr("disabled", "disabled");
        });

        function updateControls() {
            if (playerReady) {
                $('#playPause').prop('disabled', false);
                $('#playPause').removeAttr('disabled');

                switch (playerState) {
                    case 0: // stopped
                        $("#playPause").val("Play");
                        break;

                    case 1: // playing
                        $("#playPause").val("Pause");
                        $('#stopBtn').removeAttr('disabled').removeClass('disabled');
                        break;

                    case 2: // paused
                        $("#playPause").val("Play");
                        $('#stopBtn').removeAttr('disabled').removeClass('disabled');
                        break;
                }
            }
        }

        // 3. Add cursors (optional, displays the current position of the playback etc)
        at.alphaTab('playerCursor');
         
    </script>
</body>

</html>

先前的html文件(包含所有JS文件和字体)应在浏览器中显示以下结果:

Guitar Pro Tab JavaScript Web浏览器

如前所述, 该示例非常不可知, 而且确实非常简单, 但是了解AlphaTab的基本方法如何工作非常有用。或者, 你可以简单地下载最新版本的AlphaTab, 其中包括该库和一些示例(包括将显示的选项卡):

AlphaTab发布演示

编码愉快!

赞(2)
未经允许不得转载:srcmini » 如何使用alphaTab在带有JavaScript的浏览器中显示Guitar Pro选项卡

评论 抢沙发

评论前必须登录!