Created
May 14, 2018 10:37
-
-
Save rerrahkr/1441ed447654144176691870cf4719b9 to your computer and use it in GitHub Desktop.
MATLABでMMLもどき
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function song = m3l(isPlay, Fs) | |
% Matlab pseudo-MML (M3L) | |
% [input] | |
% isPlay: true - play song after create song data, false - not play | |
% Fs: sampling frequency | |
% [output] | |
% song: raw song data | |
initParams(Fs); | |
% % % % % MML section % % % % % | |
%%% part 1 | |
bar1 = [t(144) inst(2) v(100) l(16) Q(8) o(2) gs p c ds g gs p c ds g p gs g ds c m gs g ds m as]; | |
bar2 = [o(5) c m cs f as cs f gs cs g m as p ds gs m as p ds as m as p g m as p ds g gs c f gs as cs f as p c m ds p ds cs]; | |
bar3 = [o(5) c m cs f as cs f gs cs g ds m as p c cs ds g as p c m gs g f as g ds c gs f cs m as p g ds m as p c]; | |
bar4 = [o(5) lp(2,[c m f gs f r p c(8) m as(8,16) gs(8) g(8) gs(8)]) as ds g ds r as(8) gs(8,16) g(8) f(8) g(8) as ds g ds r as(8) gs(8,16) g(8) f(8) gs(8)]; | |
bar5 = [o(5) lp(2,[c m f gs f r p c(8) m as(8,16) gs(8) g(8) gs(8)]) g m as p ds m as p gs m as p ds m as p as m as p ds m as p gs m as p ds m as o(4) g m as p ds m as p as m as p ds m as p(2) ds m(2) as p ds m as p(2) g m(2) as p ds m as]; | |
bar6 = [o(3) lp(2,[f f p f m f p ds f g gs as gs g ds m as g g gs]) o(5) ds m f cs p cs m f cs p c m f cs as f cs p c m f p cs m f ds f g f g gs g gs as gs as p c cs ds f g]; | |
bar7 = [o(3) lp(2,[f f p f m f p ds f g gs as gs g],[ds m as g g gs]) p(2) ds cs c m as gs o(5) ds m f cs p cs m f cs p c m f cs as f cs p c m f p cs m f m ds f g f g gs g gs as gs as p c cs ds f g]; | |
part1 = [lp(4,bar1) lp(2,[bar2 bar3]) bar4 bar5 bar6 bar7]; | |
%%% part 2 | |
bar1 = [t(144) inst(2) v(65) l(16) Q(8) o(2) gs p c ds g gs p c ds g p gs g ds c m gs g ds m as]; | |
bar2 = [o(5) c m cs f as cs f gs cs g m as p ds gs m as p ds as m as p g m as p ds g gs c f gs as cs f as p c m ds p ds cs]; | |
bar3 = [o(5) c m cs f as cs f gs cs g ds m as p c cs ds g as p c m gs g f as g ds c gs f cs m as p g ds m as p c]; | |
bar4 = [o(5) lp(2,[c m f gs f r p c(8) m as(8,16) gs(8) g(8) gs(8)]) as ds g ds r as(8) gs(8,16) g(8) f(8) g(8) as ds g ds r as(8) gs(8,16) g(8) f(8) gs(8)]; | |
bar5 = [o(5) lp(2,[c m f gs f r p c(8) m as(8,16) gs(8) g(8) gs(8)]) g m as p ds m as p gs m as p ds m as p as m as p ds m as p gs m as p ds m as o(4) g m as p ds m as p as m as p ds m as p(2) ds m(2) as p ds m as p(2) g m(2) as p ds m as]; | |
bar6 = [o(3) lp(2,[f f p f m f p ds f g gs as gs g ds m as g g gs]) o(5) ds m f cs p cs m f cs p c m f cs as f cs p c m f p cs m f ds f g f g gs g gs as gs as p c cs ds f g]; | |
bar7 = [o(3) lp(2,[f f p f m f p ds f g gs as gs g],[ds m as g g gs]) p(2) ds cs c m as gs o(5) ds m f cs p cs m f cs p c m f cs as f cs p c m f p cs m f m ds f g f g gs g gs as gs as p c cs ds f]; | |
part2 = [r(16) lp(4,bar1) lp(2,[bar2 bar3]) bar4 bar5 bar6 bar7]; | |
%%% part 3 | |
bar1 = [t(144) inst(1) wd(0.4) v(90) l(16) Q(7) o(1) lp(4,[f f p f m f f p ds m f f p d m f f p cs m gs p gs m as p as])]; | |
bar2 = [o(1) lp(2,[cs cs p cs m cs cs p c m cs cs ds ds p ds m ds ds p cs m ds ds f f p f m f p ds f m f f],[p d m f f p cs m f f p c m f]) f p f ds d m f p c f g]; | |
bar3 = [o(1) lp(2,[cs cs p cs m cs p c m cs cs as cs cs gs cs cs as cs p cs])]; | |
bar4 = [o(1) lp(2,[c c p ds m c p cs m c c p c m c c as c c p c m c p cs])]; | |
bar5 = [o(1) lp(2,[ds ds p ds m ds p cs m ds p c m ds as ds gs ds gs ds p as(8)])]; | |
bar6 = [o(1) f f as f p c m f f as f f gs f g p g m gs p gs m ds ds as ds p c m ds ds as ds ds gs ds g p g m gs p gs]; | |
bar7 = [o(1) cs cs as cs p c m cs cs as cs cs gs cs g p g m gs p gs m ds ds g ds gs ds as ds p cs m ds p c m ds p ds m ds p cs m ds]; | |
part3 = [bar1 lp(2,bar2) lp(2,bar3, bar4) bar5 lp(2, [bar6 bar7])]; | |
song = partcascade(part1, part2, part3); | |
% % % % % % % % % % % % % % % % | |
if isPlay | |
playSong(song); | |
end | |
end | |
% note "c" | |
function nt = c(varargin) | |
global vol | |
nt = note(523.251, varargin, vol/100); | |
end | |
% note "c#" | |
function nt = cs(varargin) | |
global vol | |
nt = note(554.365, varargin, vol/100); | |
end | |
% note "d" | |
function nt = d(varargin) | |
global vol | |
nt = note(587.330, varargin, vol/100); | |
end | |
% note "d#" | |
function nt = ds(varargin) | |
global vol | |
nt = note(622.254, varargin, vol/100); | |
end | |
% note "e" | |
function nt = e(varargin) | |
global vol | |
nt = note(659.255, varargin, vol/100); | |
end | |
% note "f" | |
function nt = f(varargin) | |
global vol | |
nt = note(698.456, varargin, vol/100); | |
end | |
% note "f#" | |
function nt = fs(varargin) | |
global vol | |
nt = note(739.989, varargin, vol/100); | |
end | |
% note "g" | |
function nt = g(varargin) | |
global vol | |
nt = note(783.991, varargin, vol/100); | |
end | |
% note "g#" | |
function nt = gs(varargin) | |
global vol | |
nt = note(830.609, varargin, vol/100); | |
end | |
% note "a" | |
function nt = a(varargin) | |
global vol | |
nt = note(880.000, varargin, vol/100); | |
end | |
% note "a#" | |
function nt = as(varargin) | |
global vol | |
nt = note(932.328, varargin, vol/100); | |
end | |
% note "b" | |
function nt = b(varargin) | |
global vol | |
nt = note(987.767, varargin, vol/100); | |
end | |
% rest | |
function nt = r(varargin) | |
nt = note(1, varargin, 0); | |
end | |
% make note and rest | |
function n = note(stdhz, length, amplitude) | |
global len | |
if size(length,2) == 0 | |
length = {len}; | |
end | |
global oct | |
hz = stdhz * oct; | |
length_ = 0; | |
global tempo | |
for i=1:size(length,2) | |
length_ = length_ + 0.5 * 120 / tempo * (4 / length{i}); | |
end | |
global Fs | |
timeline = 0 : 1 / Fs : length_; % time line | |
n = zeros(1, size(timeline,2)); | |
global qt | |
timeline = 0 : 1 / Fs : length_ * qt / 8; | |
global wduty | |
global inst | |
switch (inst) | |
case 0 % sine wave | |
n = sin(2 * pi * hz * timeline); | |
case 1 % square wave | |
totalcnt = Fs / hz; | |
highcnt = totalcnt * wduty; | |
lowcnt = totalcnt - highcnt; | |
restcnt = 0; | |
tamp = 1; | |
for i=1:size(timeline, 2) | |
if tamp == 1 | |
if restcnt > highcnt | |
tamp = -1; | |
restcnt = restcnt - highcnt; | |
end | |
else | |
if restcnt > lowcnt | |
tamp = 1; | |
restcnt = restcnt - lowcnt; | |
end | |
end | |
n(i) = tamp; | |
restcnt = restcnt + 1; | |
end | |
case 2 % saw wave | |
resetcnt = Fs / hz; | |
restcnt = 0; | |
dif = 2 / resetcnt; | |
tamp = -1; | |
for i=1:size(timeline, 2) | |
if restcnt > resetcnt | |
restcnt = restcnt - resetcnt; | |
tamp = -1; | |
end | |
n(i) = tamp; | |
restcnt = restcnt + 1; | |
tamp = tamp + dif; | |
end | |
case 3 % triagle wave | |
resetcnt = Fs / hz / 2; | |
restcnt = 0; | |
dif = 2 / resetcnt; | |
tamp = -1; | |
for i=1:size(timeline, 2) | |
if restcnt > resetcnt | |
restcnt = restcnt - resetcnt; | |
dif = -dif; | |
end | |
n(i) = tamp; | |
restcnt = restcnt + 1; | |
tamp = tamp + dif; | |
end | |
end | |
n = n * amplitude; | |
end | |
% octave up | |
function r = p(times) | |
if nargin == 0 | |
times = 1; | |
end | |
global oct | |
global oi | |
for i=1:times | |
oct = oct * 2; | |
oi = oi + 1; | |
end | |
r = []; | |
end | |
% octave down | |
function r = m(times) | |
if nargin == 0 | |
times = 1; | |
end | |
global oct | |
global oi | |
for i=1:times | |
oct = oct / 2; | |
oi = oi - 1; | |
end | |
r = []; | |
end | |
% absolute octave | |
function r = o(octave) | |
global oi | |
dif = octave - oi; | |
if dif > 0 | |
p(dif); | |
elseif dif < 0 | |
m(-dif); | |
end | |
r = []; | |
end | |
% default length | |
function r = l(length) | |
global len | |
len = length; | |
r = []; | |
end | |
% tempo | |
function r = t(tem) | |
global tempo | |
tempo = tem; | |
r = []; | |
end | |
% volume | |
function r = v(volume) | |
global vol | |
vol = volume; | |
r = []; | |
end | |
% loop | |
function newnotes = lp(times, A, B) | |
sz1 = size(A,2); | |
if nargin == 2 | |
sz2 = 0; | |
else | |
sz2 = size(B,2); | |
end | |
totalsz = sz1 + sz2; | |
newnotes = zeros(1, totalsz * (times - 1) + sz1); | |
for i=1:times-1 | |
newnotes(1,((i-1)*totalsz+1):i*sz1) = A; | |
if sz2 > 0 | |
newnotes(1,i*sz1+1:i*totalsz) = B; | |
end | |
end | |
newnotes(1,end-sz1+1:end) = A; | |
end | |
% instrument | |
function r = inst(n) | |
% 0: sine wave, 1: square wave, 2: saw wave, 3: triangle wave | |
global inst | |
inst = n; | |
r = []; | |
end | |
% square wave duty cycle | |
function r = wd(duty) | |
global wduty | |
wduty = duty; | |
r = []; | |
end | |
% gate off | |
function r = Q(n) | |
global qt | |
qt = n; | |
r = []; | |
end | |
% initialize | |
function initParams(rate) | |
global Fs | |
Fs = rate; | |
global oct % octave | |
oct = 1; | |
global oi | |
oi = 4; | |
global len % length | |
len = 4; | |
global vol % amplitude | |
vol = 100; | |
global tempo % tempo | |
tempo = 120; | |
global inst % instrument | |
inst = 0; | |
global wduty % wave duty cycle | |
wduty = 0.5; | |
global qt % gate time | |
qt = 8; | |
end | |
% cascade parts | |
function s = partcascade(varargin) | |
maxlen = 0; | |
for p = varargin | |
if maxlen < size(p{1},2), maxlen = size(p{1},2); end | |
end | |
s = zeros(1,maxlen); | |
for p = varargin | |
s(1:size(p{1},2)) = s(1:size(p{1},2)) + p{1}; | |
end | |
end | |
% play song | |
function playSong(song) | |
global Fs | |
soundsc(song, Fs); | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment