[源码]会议歌曲播放辅助工具V1

开源一个会议场合音乐播放辅助工具,

开发语言:易语言

工具主要是为了方便操作播放器,全依靠方向键,如下图:

QQ截图20181115150400

软件注册了全局热键:↑、→、↓、←

用户只需要控制方向键即可,音乐可以设定手动播放、自动播放(选中歌曲右键菜单)。

QQ截图20181115150620

以下是源码:

.版本 2
.支持库 shellEx
.支持库 iext
.支持库 eMMedia

.程序集 窗口程序集_启动窗口
.程序集变量 播放热键, 整数型
.程序集变量 暂停热键, 整数型
.程序集变量 上一首热键, 整数型
.程序集变量 下一首热键, 整数型

.子程序 __启动窗口_创建完毕

标题 = “会议歌曲播放辅助工具”
.如果真 (文件是否存在 (取运行目录 () + “\sysmp3.ini”) = 假)
写到文件 (取运行目录 () + “\sysmp3.ini”, #ini)
.如果真结束
扫描文件夹 ()
给文件上状态 ()
播放热键 = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, #右光标键)
暂停热键 = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, #左光标键)
上一首热键 = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, #上光标键)
下一首热键 = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, #下光标键)

.子程序 _自动播放_被选择

写配置项 (取运行目录 () + “\sysmp3.ini”, “MP3”, 超级列表框1.取标题 (超级列表框1.现行选中项, 0), “0”)
超级列表框1.置标题 (超级列表框1.现行选中项, 2, “自动播放”)

.子程序 扫描文件夹, , , MP3只能放在程序目录下

搜索文件夹 (取运行目录 (), “*.mp3”)
标签1.标题 = “就绪!”

.子程序 搜索文件夹
.参数 目录, 文本型
.参数 后缀名, 文本型
.局部变量 temp, 文本型
.局部变量 a, 整数型

.如果真 (取文本右边 (目录, 1) ≠ “\”)
目录 = 目录 + “\”
.如果真结束
输出调试文本 (目录)
temp = 寻找文件 (目录 + 后缀名, )

.判断循环首 (temp ≠ “”)
处理事件 ()
.如果真 (temp ≠ “.” 且 temp ≠ “..”)
处理事件 ()
标签1.标题 = “当前文件:” + temp
a = 超级列表框1.插入表项 (0, temp, , , , )
超级列表框1.置标题 (a, 1, 目录 + temp)
超级列表框1.置标题 (a, 2, “0”)

.如果真结束
temp = 寻找文件 (, )

.判断循环尾 ()

.子程序 _手动播放_被选择

写配置项 (取运行目录 () + “\sysmp3.ini”, “MP3”, 超级列表框1.取标题 (超级列表框1.现行选中项, 0), “1”)
超级列表框1.置标题 (超级列表框1.现行选中项, 2, “手动播放”)

.子程序 给文件上状态
.局部变量 i, 整数型
.局部变量 temp, 整数型

.计次循环首 (超级列表框1.取表项数 (), i)
temp = 到数值 (读配置项 (取运行目录 () + “\sysmp3.ini”, “MP3”, 超级列表框1.取标题 (i - 1, 0), “0”))
.判断开始 (temp = 0)
超级列表框1.置标题 (i - 1, 2, “自动播放”)
.判断 (temp = 1)
超级列表框1.置标题 (i - 1, 2, “手动播放”)
.默认
超级列表框1.置标题 (i - 1, 2, “未知”)
.判断结束

.计次循环尾 ()

.子程序 _超级列表框1_右键单击表项

.如果 (超级列表框1.取标题 (超级列表框1.现行选中项, 2) = “自动播放”)
自动播放.选中 = 真
.否则
自动播放.选中 = 假
.如果结束

弹出菜单 (菜单, , )
.子程序 _按钮1_被单击

_播放_被选择 ()

.子程序 _按钮2_被单击

_暂停_被选择 ()

.子程序 _按钮3_被单击

_下一首_被选择 ()

.子程序 _按钮4_被单击

_上一首_被选择 ()
.子程序 _播放_被选择
.局部变量 文件, 文本型
.如果 (媒体播放1.取状态 () = 1 且 全_继续播放 = 假)
媒体播放1.停止 ()
时钟1.时钟周期 = 0
标签1.标题 = “状态:停止”
按钮1.标题 = “播放”
进度条1.位置 = 0
.否则
全_继续播放 = 假
.如果真 (超级列表框1.现行选中项 = -1)
超级列表框1.现行选中项 = 0
超级列表框1.保证显示 (超级列表框1.现行选中项)
超级列表框1.获取焦点 ()
.如果真结束

文件 = 超级列表框1.取标题 (超级列表框1.现行选中项, 1)
媒体播放1.打开 (文件)
媒体播放1.播放 (-1, )

时钟1.时钟周期 = 1000
进度条1.最大位置 = 媒体播放1.取总时间 ()
分 = 取整 (媒体播放1.取总时间 () ÷ 60)
秒 = 媒体播放1.取总时间 () % 60
标签1.标题 = “正在播放:” + 超级列表框1.取标题 (超级列表框1.现行选中项, 0) + “ ” + 取文本右边 (“0” + 到文本 (分), 2) + “:” + 取文本右边 (“0” + 到文本 (秒), 2)
按钮1.标题 = “停止”
.如果结束

超级列表框1.保证显示 (超级列表框1.现行选中项)
超级列表框1.获取焦点 ()

.子程序 _暂停_被选择

.如果 (媒体播放1.取状态 () = 1)
媒体播放1.暂停 ()
时钟1.时钟周期 = 0
标签1.标题 = “状态:暂停”
按钮2.标题 = “继续”
.否则
媒体播放1.播放 (进度条1.位置 × 1000, )
时钟1.时钟周期 = 1000
按钮2.标题 = “暂停”
标签1.标题 = “正在播放:” + 超级列表框1.取标题 (超级列表框1.现行选中项, 0) + “ ” + 取文本右边 (“0” + 到文本 (分), 2) + “:” + 取文本右边 (“0” + 到文本 (秒), 2)
.如果结束
超级列表框1.保证显示 (超级列表框1.现行选中项)
超级列表框1.获取焦点 ()
.子程序 _下一首_被选择

.如果真 (超级列表框1.取表项数 () = 超级列表框1.现行选中项 + 1)
超级列表框1.现行选中项 = -1
.如果真结束
超级列表框1.现行选中项 = 超级列表框1.现行选中项 + 1
媒体播放1.停止 ()
时钟1.时钟周期 = 0
标签1.标题 = “状态:停止”
按钮1.标题 = “播放”
进度条1.位置 = 0
全_继续播放 = 真
_播放_被选择 ()

.子程序 _上一首_被选择

.如果真 (超级列表框1.现行选中项 = 0)
超级列表框1.现行选中项 = 超级列表框1.取表项数 ()
.如果真结束
超级列表框1.现行选中项 = 超级列表框1.现行选中项 - 1
媒体播放1.停止 ()
时钟1.时钟周期 = 0
标签1.标题 = “状态:停止”
按钮1.标题 = “播放”
进度条1.位置 = 0
全_继续播放 = 真
_播放_被选择 ()

.子程序 _时钟1_周期事件
.局部变量 i, 整数型
.局部变量 temp, 文本型

.如果 (秒 = 0)
秒 = 59
分 = 分 - 1
.否则
秒 = 秒 - 1
.如果结束
标签1.标题 = “正在播放:” + 超级列表框1.取标题 (超级列表框1.现行选中项, 0) + “ ” + 取文本右边 (“0” + 到文本 (分), 2) + “:” + 取文本右边 (“0” + 到文本 (秒), 2)
进度条1.位置 = 进度条1.位置 + 1

.如果真 (进度条1.位置 ≥ 进度条1.最大位置)

进度条1.位置 = 0
时钟1.时钟周期 = 0
temp = 超级列表框1.取标题 (超级列表框1.现行选中项 + 1, 2)

.如果 (temp = “自动播放”)
超级列表框1.现行选中项 = 超级列表框1.现行选中项 + 1
超级列表框1.保证显示 (超级列表框1.现行选中项)
超级列表框1.获取焦点 ()

全_继续播放 = 真
_播放_被选择 ()
.否则
标签1.标题 = “状态:停止”
按钮1.标题 = “播放”

超级列表框1.现行选中项 = 超级列表框1.现行选中项 + 1
超级列表框1.保证显示 (超级列表框1.现行选中项)
超级列表框1.获取焦点 ()
.如果结束

.如果真结束
.子程序 __启动窗口_将被销毁

撤销热键 (_启动窗口.取窗口句柄 (), 播放热键)
撤销热键 (_启动窗口.取窗口句柄 (), 暂停热键)
撤销热键 (_启动窗口.取窗口句柄 (), 上一首热键)
撤销热键 (_启动窗口.取窗口句柄 (), 下一首热键)

.子程序 _标签1_反馈事件, 整数型
.参数 参数一, 整数型
.参数 参数二, 整数型

.判断开始 (参数一 = 播放热键)
_播放_被选择 ()
.判断 (参数一 = 暂停热键)
_暂停_被选择 ()
.判断 (参数一 = 上一首热键)
_上一首_被选择 ()
.判断 (参数一 = 下一首热键)
_下一首_被选择 ()
.默认

.判断结束

 

 

以下是全局变量:

.版本 2

.全局变量 全_打开类型, 整数型
.全局变量 分, 整数型
.全局变量 秒, 整数型
.全局变量 全_继续播放, 逻辑型

文件下载地址:

链接:https://pan.baidu.com/s/1437Q4MCgIHr_RYdAmojXGw
提取码:mbmp

Neural networks made easy

现在谈人工智能已经绕不开“神经网络”这个词了。人造神经网络粗线条地模拟人脑,使得计算机能够从数据中学习。

机器学习这一强大的分支结束了 AI 的寒冬,迎来了人工智能的新时代。简而言之,神经网络可能是今天最具有根本颠覆性的技术。

看完这篇神经网络的指南,你也可以和别人聊聊深度学习了。为此,我们将尽量不用数学公式,而是尽可能用打比方的方法,再加一些动画来说明。

强力思考

AI 的早期流派之一认为,如果您将尽可能多的信息加载到功能强大的计算机中,并尽可能多地提供方法来了解这些数据,那么计算机就应该能够“思考”。比如 IBM 著名的国际象棋 AI Deep Blue 背后就是这么一个思路:通过对棋子可能走出的每一步进行编程,再加上足够的算力,IBM 程序员创建了一台机器,理论上可以计算出每一个可能的动作和结果,以此来击败对手。

通过这种计算,机器依赖于工程师精心预编程的固定规则——如果发生了 A,那么就会发生 B ; 如果发生了 C,就做 D——这并不是如人类一样的灵活学习。当然,它是强大的超级计算,但不是“思考”本身。

教机器学习

在过去十年中,科学家已经复活了一个旧概念,不再依赖大型百科全书式记忆库,而是框架性地进行模拟人类思维,以简单而系统的方式分析输入数据。 这种技术被称为深度学习或神经网络,自20世纪40年代以来一直存在,但是由于今天数据的大量增长—— 图像、视频、语音搜索、浏览行为等等——以及运算能力提升而成本下降的处理器,终于开始显示其真正的威力。

createJS开发小游戏

效果图:(录屏的时候有点卡)

910706-20170707164034456-1593675354

 demo:

https://github.com/beidan/canvas

游戏整体思路实现

1. 实现一个无缝连接的背景图,模拟出汽车在加速的状态

this.backdrop = new createjs.Bitmap(bg);
this.backdrop.x = 0;
this.backdrop.y = 0;
this.stage.addChild(that.backdrop);
this.w = bg.width;
this.h = bg.height;

//创建一个背景副本,无缝连接
var copyy = -bg.height;
this.copy = new createjs.Bitmap(bg);
this.copy.x = 0;
this.copy.y = copyy;  //在画布上y轴的坐标为负的背景图长
//使用createjs的tick函数,逐帧刷新舞台
createjs.Ticker.addEventListener("tick", tick);
function tick(e) {
   if (e.paused !== 1) {
        //舞台逐帧逻辑处理函数
        that.backdrop.y = that.speed + that.backdrop.y;
        that.copy.y = that.speed + that.copy.y;

        if (that.copy.y > -40) {
              that.backdrop.y = that.copy.y + copyy;
        }
        if (that.copy.y > -copyy - 100) {
              that.copy.y = copyy + that.backdrop.y;
        }
        that.stage.update(e);
    }          
}

2. 随机绘制障碍物

由于一条跑道肯定会有很多障碍物,对于超出屏幕的障碍物我们要进行‘资源回收’,否则游戏到后面会越来越卡顿。

// 删除越界的元素
for (var i = 0, flag = true, len = that.props.length; i < len; flag ? i++ : i) {
    if (that.props[i]) {
        if (that.props[i].y > height + 300) {
            that.stage.removeChild(that.props[i]);
            that.props.splice(i, 1);
            flag = false;
        } else {
            flag = true;
        }
    }
}

一共有3条赛道,我们不能出现3个道具同时出现在水平线上,因此我们会随机取1~2个值绘制障碍物。所有游戏我们都应该有参数去控制它的难易程度,免得临上线的时候,老板体验之后觉得游戏太难了……那就非常地尴尬了。 因此,我们会设置加速物体,减速物体,炸弹出现的比例,后期可以调整这个比例来设置游戏的难易程度。

var num = parseInt(2 * Math.random()) + 1, i;
    for (i = 0; i < num; i++) {
        var type = parseInt(10 * Math.random()) + 1;

        // 设置道具出现比例
        if (type == 1) {
            /绘制炸弹
        } else if ((type >= 2) && (type <= 5)) {
            //绘制加速道具
        } else if ((type >= 6) && (type <= 10)) {
            //绘制减速道具
        }
    }

第一次绘制完障碍物之后,会随机时间绘制下一次的障碍物。

var time = (parseInt(3 * Math.random()) + 1);  //随机取1~3整数
// 随机时间绘制障碍物
setTimeout(function () {
    that.propsTmp = [];  //清空
    that.drawObstacle(obj);
}, time * 400);  //400ms ~ 1200ms

 

3.碰撞检测

我们用一个数组来存放汽车占的矩形区域,障碍物占的矩形区域,在每一次tick的时候循环遍历数组,看是否有重叠的,若有重叠,则发生了碰撞。

createjs的一些小知识:

1. 暂停和恢复舞台渲染

createjs.Ticker.addEventListener(“tick”, tick); 
function tick(e) { 
    if (e.paused === 1) { 
    //处理 
    }
}     
createjs.Ticker.paused = 1; //在函数任何地方调用这个,则会暂停tick里面的处理 
createjs.Ticker.paused = 0; //恢复游戏

 

2. 由于汽车会有加速,减速,弹气泡的效果。因此我们把这几个效果绘制在同一个container中,方便统一管理,对这些效果设置name属性,之后可以直接使用getChildByName获取到该对象。

container.name = ‘role’; //设置name值
car = this.stage.getChildByName(“role”);  //使用name值方便获取到该对象

 

3. 预加载 preload (createjs 的 preload 非常的实用)

一开始是自己写的预加载,后来发现createjs里面对图片是有跨域处理的,自己处理跨域的img就比较麻烦,所以直接使用createjs的预加载。

//放置静态资源的数组
var manifest = [
    {src: __uri('./images/car_prop2_tyre@2x.png'), id: 'tyre'}
];
var queue = new createjs.LoadQueue();
queue.on('complete', handleComplete, this);
queue.loadManifest(manifest);
//资源加载成功后,进行处理
function handleComplete() {
   var tyre = queue.getResult('tyre');  //拿到加载成功后的img
}

一般做一个游戏,我们正常都会构建一个游戏类来承载。 下面是一个游戏正常有的接口:

;(function () {
    function CarGame(){}
    CarGame.prototype = {
        init:function(manifest) {
            this.preLoad(manifest);  //资源预加载
            //时间倒计时
            this.prepare(3, 3);  //倒计时3秒
            this.bindEvent(); 
        },
        render:function() {
           this.drawBg(bg1);
           this.drawRole(car, effbomb, effquick);
           this.drawObstacle(obj);
        },
        //在游戏结束的时候批量销毁
        destroy:function(){
            //移除tick事件
            createjs.Ticker.removeEventListener("tick", this.tick);
            //暂停里程,倒计时
            clearInterval(this.changem);
            clearTimeout(this.gametime);
        },
        //由于期间用户可能切出程序进行其他操作,因此都需要一个暂停的接口
        pause:function() {
            //暂停里程,倒计时
            clearInterval(this.changem);
            clearTimeout(this.gametime);

            //暂停页面滚动
            createjs.Ticker.paused = 1;
        },
        //重新开始游戏
        reStart:function(){
           this.destroy();
           this.init(manifest);
        },
        gameOver:function(){
           //显示爆炸效果
           var car = this.stage.getChildByName("role");
           car.getChildByName('bomb').visible = true;
           car.getChildByName('quick').visible = false;
           this.destroy();
        }
    }
})()

 

转载:https://www.cnblogs.com/beidan/p/7122731.html

HTML5声音引擎Howler.js简介

Howler.js是一个不错的HTML5声音引擎。功能强大,性能不错,用起来也很方便。

1. 官网

https://howlerjs.com/ 其代码托管在GitHub上。

2. 兼容性

Howler默认使用Web Audio,但在IE上可以自动转为HTML 5 Audio。这点很是贴心。

3. 声音激活

移动端的Safari和Chrome都禁止网页自动播放声音,必须通过用户的操作,touch, click等触发。Howler可以设置成自动捕捉用户操作激活(解禁)声音播放。

createJS实现复杂网页动画

我应该什么时候用createjs?

如果只是简单动画,建议使用css3或者animate.css这个库就可以了。
当需要开发复杂交互逻辑,例如问答游戏,打蚊子之类的小游戏,或者一些需要复杂图形/线条变换的页面,可以使用createjs完成。

EASELJS、TWEENJS、SOUNDJS、PRELOADJS都是什么?

EASELJS:一个JavaScript库,使HTML5 Canvas标签变得更简单。
用于创建游戏,生成艺术作品,和处理其他高级图形化等有着很友好的体验。(用来方便在页面上绘制元素的)

TWEENJS:TweenJS类库主要用来调整和动画HTML5和Javascript属性, 提供了简单并且强大的tweening接口。(用来做动画效果的)

SOUNDJS:SoundJS提供了简单而强大的API来处理音频。 通过插件来执行实际的音频实现,简单直接的处理声音。(用来控制音频播放的)

PRELOADJS:PreloadJS是一个用来管理和协调相关资源加载的类库, 它可以方便的帮助你预先加载相关资源。(资源预加载)

效果:

6276836-5d7746fc97948ee3

源码分析

打开src/index.html 引入createjs和swiperjs(用于实现页面切换)

<script src="libs/js/swiper.min.js"></script>
<script src="libs/js/createjs-2015.11.26.min.js"></script>
<script src="js/main.js"></script>

main.js主要页面逻辑片段

以下代码是swiper初始化代码,监听onSlideChangeEnd事件,防止页面多次渲染。

var hasSlidePage = [] // 存储已经看过的页面,用于防止页面反复渲染
var mySwiper = new Swiper('.swiper-container', {
  direction: 'vertical',
  pagination: '.swiper-pagination',
  mousewheelControl: true,
  touchRatio: 0.5,
  onSlideChangeEnd: function (swiper) {
    if (hasSlidePage.indexOf(swiper.activeIndex) > -1) {
      return
    }
    hasSlidePage.push(swiper.activeIndex)
    switch (swiper.activeIndex) {
      case 1:
        renderPage2()
    }
  }
})

使用preload预加载资源

// 加载资源
function loadAssest() {
  // 加载资源列表
  manifest = [
    { src: "clearLight/blue.png", id: "blue" }
    ... //此处省略
  ]
  // 统计加载进度
  var loadCount = 0
  preload = new createjs.LoadQueue(false, "./images/");
  // 每加载成功一个资源回调一次
  preload.on("fileload", function (event) {
    loadCount++
    document.querySelector("#process").innerHTML = (loadCount * 100 / manifest.length).toFixed(0) + '%'
  })
  // 所有资源加载完毕后的回调
  preload.on('complete', function (event) {
    // 隐藏加载层,显示内容层
    document.querySelector(".loading-cover").style.display = 'none'
    document.querySelector(".swiper-container").style.display = "block"
    // 渲染第一个页面
    renderPage1()
  })
  // 使用preload预加载指定资源
  preload.loadManifest(manifest)
}

第一个页面绘制代码

// 绘制第一页
function renderPage1() {
  // 创建画布
  var canvas = document.getElementById("canvas1")
  var stage = new createjs.Stage(canvas)
  // 由于添加元素后需要手动更新画布,比较麻烦,该防范监听tick事件,进行自动更新
  createjs.Ticker.addEventListener("tick", handleTicker);
  function handleTicker() {
    stage.update();
  }
  // 在画布添加元素
  var title = this.createText(stage, "超浓缩", "normal 80px microsoft yahei", "#fff", 40, 40)
  // 不知道为什么中文不能自动换行,英文是可以的,所以中文用\n进行换行
  var subTitle1 = this.createText(stage, "·科技突破,高能量配方,活性物浓度高达47%,是普通洗衣液\n的三倍以上,获得「浓缩+」洗衣液认证", "normal 24px microsoft yahei", "#fff", 40, 160)
  var subTitle2 = this.createText(stage, "·一泵8g洗8件,小体积,大能量,660g=2.2kg,用量减少\n70%以上", "normal 24px microsoft yahei", "#fff", 40, 240)
  var logo = this.createImage(stage, 'superEnrichment/logo', 116, 83, 320, 60)
  var bigPower = this.createImage(stage, 'big_power', 163, 154, 40, 320)
  var concentration = this.createImage(stage, 'concentration', 230, 154, 250, 320)
  var bottom = this.createImage(stage, 'bottom', 600, 360, 75, 800)
  var waterDrop = this.createImage(stage,'water_drop', 300, 350, 223, 600)
  var light_line_long = this.createImage(stage,'light_line_long', 23, 300, 110, 670)
  var light_line_long2 = this.createImage(stage,'light_line_long', 23, 300, 365, 810)
  var light_line_long3 = this.createImage(stage,'light_line_long', 23, 300, 620, 670)

  // 对元素设置淡出动画
  createjs.Tween.get(title).to({ alpha: 1 }, 300)
  createjs.Tween.get(subTitle1).to({ alpha: 1 }, 300)
  createjs.Tween.get(subTitle2).to({ alpha: 1 }, 300)
  createjs.Tween.get(logo).to({ alpha: 1 }, 300)
  createjs.Tween.get(bigPower).to({ alpha: 1 }, 300)
  createjs.Tween.get(concentration).to({ alpha: 1 }, 300)
  createjs.Tween.get(waterDrop).to({ alpha: 1 }, 300)
  createjs.Tween.get(waterDrop, { loop: true }).to({ y: 570 }, 1000, createjs.Ease.getPowInOut(2)).to({ y: 600 }, 1000, createjs.Ease.getPowInOut(2))
  createjs.Tween.get(bottom).to({ alpha: 1 }, 300)
  createjs.Tween.get(light_line_long, { loop: true }).to({ alpha: 1 }, 1000).to({ alpha: 0.4 }, 1000)
  createjs.Tween.get(light_line_long2, { loop: true }).to({ alpha: 1 }, 1000).to({ alpha: 0.4 }, 1000)
  createjs.Tween.get(light_line_long3, { loop: true }).to({ alpha: 1 }, 1000).to({ alpha: 0.4 }, 1000)
}

 

1234584