Skip to content

Instantly share code, notes, and snippets.

@rerrahkr
Created May 14, 2018 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rerrahkr/1441ed447654144176691870cf4719b9 to your computer and use it in GitHub Desktop.
Save rerrahkr/1441ed447654144176691870cf4719b9 to your computer and use it in GitHub Desktop.
MATLABでMMLもどき
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