Audio Player
How do I make an audio player?
As a response to http://css-tricks.com/css-pie-timer/ I wrote this SVG Pie Timer.Credits: Heavily inspired by http://itpastorn.github.com/webbteknik/future-stuff/svg/color-wheel.html.. What is a audio player? How do you make a audio player? This script and codes were developed by Cory on 13 December 2022, Tuesday.
Audio Player - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Audio Player</title> <link rel="stylesheet" href="css/style.css">
</head>
<body> <figure class="audio_module" data-require="audio"> <svg id="audio_player" class="audio_player_ui" preserveAspectRatio="xMidYMid" data-state="pause" viewbox="-150 -150 300 300" draggable="false"> <path id="" class="indicator track" transform="translate(0, 0)" draggable="false"/> <path id="progress" class="indicator progress" transform="translate(0, 0)" draggable="false"/> <path id="" class="indicator scrubber" transform="translate(0, 0)" draggable="false"/> <path id="" class="play_toggle" transform="translate(0, 0) scale(.9)" draggable="false"/> <text class="feedback" transform="translate(0 15)" text-anchor="middle"> <tspan id="text" class="timer" x="0" data-action="play">play</tspan> <tspan class="action" x="0" dy="-5">play</tspan> </text> </svg> <audio src="http://1stdraftdesign.com/wp-content/themes/sandbox/404d.mp3"></audio> </figure> <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script> <script src="js/index.js"></script>
</body>
</html>
Audio Player - Script Codes CSS Codes
@import compass
$player_size: 300px
body background: #333
.audio_module display: block margin: 0 auto width: $player_size height: $player_size background: transparent cursor: pointer user-drag none -moz-user-select none -webkit-user-drag none * user-drag none -moz-user-select none -webkit-user-drag none .audio_player_ui position: relative .play_toggle stroke-width: 0 fill: transparent .indicator stroke-width: 1.5em fill: transparent .progress stroke: #fd0 pointer-events: none .scrubber stroke: hsla(0, 0%, 100%, .2) pointer-events: none .track stroke: hsla(0, 0%, 100%, .04) pointer-events: stroke .feedback font-family: 'Helvetica Neue', Helvetica, sans-serif text-align: center font-size: 3em font-style: italic fill: hsla(0, 0%, 100%, .08) opacity: 1 pointer-events: none .timer transition all 0.25s .play_toggle:hover & ~ .feedback .timer opacity: 0 & ~ .feedback .action opacity: 1 .action opacity: 0 transition all 0.5s
Audio Player - Script Codes JS Codes
(function() { (function() { var $, defaults, drawArc, formatSeconds, methods, pluginName, startTime, t, π; $ = jQuery; Math.arcAngle = function(x, y, deg) { var centerX, centerY, deltaX, deltaY, radius, theta; centerX = 0; centerY = 0; radius = Math.sqrt((x * x) + (y * y)); deltaX = x; deltaY = y + radius; theta = Math.acos(1 - ((deltaX * deltaX + deltaY * deltaY) / (2 * radius * radius))); if (x < 0) { theta = (2 * π) - theta; } if (deg) { return theta * (180 / Math.PI); } else { return theta; } }; pluginName = 'audio'; π = Math.PI; t = 60; startTime = window.mozAnimationStartTime || Date.now(); formatSeconds = function(sec) { var mins, secs; mins = parseFloat(sec / 60, 10).toFixed(); secs = Math.floor(sec % 60); if (secs.toString().length < 2) { secs = "0" + secs; } return mins + ":" + secs; }; drawArc = function(theta, r, $elem) { var d, largeArcFlag, sweepFlag, x, y, zero; largeArcFlag = theta > π ? 1 : 0; sweepFlag = theta < (2 * π) ? 1 : 0; zero = 1e-10; x = r * Math.sin(theta); if (Math.abs(x) <= zero) { x = 0; } y = -(r * Math.cos(theta)); d = "M 0 " + (-r) + " v 0 A " + r + " " + r + " 1 " + largeArcFlag + " " + sweepFlag + " " + x + " " + y; return $elem.attr('d', d); }; defaults = { r: 100, visualizer: '.audio_player', progress_indicator: '.progress', track: '.track', scrubber: '.scrubber', play_toggle: '.play_toggle', timer: '.timer' }; methods = { init: function(options) { return this.each(function() { var $this, data, opts; $this = $(this); data = $this.data(pluginName); opts = $.extend({}, opts, defaults); if (!data) { data = opts; data.$player = $this.find(opts.visualizer); data.$progress = $this.find(opts.progress_indicator); data.$play_toggle = $this.find(opts.play_toggle); data.$track = $this.find(opts.track); data.$track.attr('d', "M 0 " + (-data.r) + " v 0 A " + data.r + " " + data.r + " 1 1 1 -.1 -100"); data.$scrubber = $this.find(opts.scrubber); data.$timer = $this.find(opts.timer); data.$audio = $this.find('audio'); data.at = 0; data.mousedown = [false, false, false]; data.$play_toggle.attr('d', "M 0 " + (-data.r) + " v 0 A " + data.r + " " + data.r + " 1 1 1 -.1 -100"); data.$audio.on('canplaythrough', function(e) { var d; d = $this.data(pluginName); d.audioReady = true; d.$timer.text("/" + (formatSeconds(data.duration))); return $this.data(pluginName, d); }); data.$audio.on('loadedmetadata', function(e) { var d; d = $this.data(pluginName); d.duration = d.$audio[0].duration; return $this.data(pluginName, d); }); data.$audio.on('ended', function(e) { return methods.reset.call($this[0]); }); data.$track.on('mouseleave', function(e) { return data.$scrubber.attr('d', "M 0 " + (-data.r) + " v 0 A " + data.r + " " + data.r + " 1 1 1 0 -100"); }); data.$track.on('mousedown', function(e) { return data.mousedown[e.button] = true; }); $(window).on('mouseup', function(e) { return data.mousedown[e.button] = false; }); data.$track.on('mousemove mousedown', function(e) { var angle, arcAsRatio, dAttr, offsetX, offsetY, theta, translation, viewBox, x, xArcStart, xTrack, y, yArcStart, yTrack; data = $this.data(pluginName); if (data.mousedown[0]) { dAttr = data.$scrubber.attr('d'); dAttr = dAttr.split(' '); xArcStart = 0; yArcStart = -data.r; xTrack = parseFloat(dAttr[dAttr.length - 2], 10); yTrack = parseFloat(dAttr[dAttr.length - 1], 10); angle = Math.arcAngle(xTrack, yTrack); arcAsRatio = angle / (2 * π); methods.scrubTo.call($this[0], arcAsRatio); } if (e.type === 'mousemove') { viewBox = document.querySelector('#audio_player').getAttribute('viewBox'); viewBox = viewBox ? viewBox.split(' ') : []; translation = viewBox.slice(0, 2); if (translation.length !== 2) { translation = [0, 0]; } offsetX = e.originalEvent.hasOwnProperty('offsetX') ? e.offsetX : e.originalEvent.layerX; offsetY = e.originalEvent.hasOwnProperty('offsetY') ? e.offsetY : e.originalEvent.layerY; x = offsetX + parseInt(translation[0], 10); y = offsetY + parseInt(translation[1], 10); theta = Math.arcAngle(x, y); return drawArc(theta, data.r, data.$scrubber); } }); data.$play_toggle.on('click', function(e) { var curr_state; curr_state = $this.attr('data-state'); if (curr_state === 'play') { return methods.pause.call($this[0]); } else { return methods.play.call($this[0]); } }); data.$audio.on('ended', function() { return methods.reset.call($this[0]); }); $(window).on('keyup', function(e) { if (e.which === 32) { e.preventDefault(); data.$play_toggle.trigger('click'); return false; } }); $(window).on('keydown', function(e) { if (e.which === 32) { return e.preventDefault(); } }); $this.data(pluginName, data); if (data.$audio[0].duration) { data.$audio.trigger('loadedmetadata'); return data.$audio.trigger('canplaythrough'); } } }); }, play: function() { var $player, animate, data; $player = $(this); data = $player.data(pluginName || {}); animate = function() { var diff, drawStart, Θi; drawStart = Date.now(); diff = drawStart - startTime; if ($player.attr('data-state') !== 'pause' && data.at < (2 * π)) { if (diff >= t) { Θi = (2 * π) * (diff / 1000) / data.duration; data.at += Θi || 0; drawArc(data.at, data.r, data.$progress); startTime = drawStart; data.$timer.text("/" + (formatSeconds(data.$audio[0].currentTime))); } return window.requestAnimationFrame(animate); } else { return startTime = void 0; } }; if (data.audioReady || data.$audio[0].duration) { this.setAttribute('data-state', 'play'); this.querySelector('.action').textContent = $(this).attr('data-state') === 'play' ? 'pause' : 'play'; this.querySelector('audio').play(); startTime = window.mozAnimationStartTime || Date.now(); return requestAnimationFrame(animate); } }, pause: function() { this.setAttribute('data-state', 'pause'); this.querySelector('.action').textContent = $(this).attr('data-state') === 'play' ? 'pause' : 'play'; return this.querySelector('audio').pause(); }, reset: function() { var data; data = $(this).data(pluginName || {}); data.$progress.attr('d', "M 0 " + (-data.r) + " v 0 A " + data.r + " " + data.r + " 1 0 1 .00001 -100"); data.$audio.currentTime = 0; data.at = 0; return this.setAttribute('data-state', 'pause'); }, scrubTo: function(time) { var $module, audio, data; $module = $(this); data = $module.data(pluginName); audio = data.$audio[0]; audio.currentTime = time * audio.duration; data.at = 2 * π * time; return drawArc(data.at, data.r, data.$progress); } }; if (!window.requestAnimationFrame) { window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function(func) { return setTimeout(func, t); }; } return $.fn[pluginName] = function(method) { if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { return $.error("Wha\'cho talkin\' \'bout Willis? There ain't no method " + method + " here."); } }; })(); (function() { return window.jQuery(document).ready(function() { return $('.audio_module').audio(); }); })();
}).call(this);
Developer | Cory |
Username | uniqname |
Uploaded | December 13, 2022 |
Rating | 3 |
Size | 7,940 Kb |
Views | 14,168 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Javascript Digital Clock Example | 1,797 Kb |
Floating Labels | 2,238 Kb |
A content slider | 2,374 Kb |
Paper like dialog compoent | 4,701 Kb |
CSA-React POC | 5,660 Kb |
X-Picture tag | 2,573 Kb |
JS REPL | 5,216 Kb |
React Carousel POC | 12,622 Kb |
PictureTime | 3,565 Kb |
Hover activated accordian with default state | 1,946 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Foundation 5 Menu - Accessibility | Xporter | 1,999 Kb |
Ball Physics | Getsetbro | 3,149 Kb |
Slider css only | Armandobau | 2,161 Kb |
Pomodoro Clock | Osycon | 3,705 Kb |
Promodoro | Bencarp | 1,712 Kb |
SVG email test v2.0 | M_J_Robbins | 2,090 Kb |
Starting out with Ember.JS | Cfleschhut | 4,808 Kb |
SVG Basics | HipsterBrown | 1,852 Kb |
Learning FlexBox | Alex_rodrigues | 2,821 Kb |
Basic 3D Fullscreen Transition | Apetrov | 3,270 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!