View difference between Paste ID: YeAFpYfN and H59t8Vvv
SHOW: | | - or go back to the newest paste.
1
local note_lookup_table={ 
2-
    ['1000']='4',	 ['0100']='2',
2+
	['1000']='4',	 ['0100']='2',
3
	['0010']='8',	 ['0001']='6',
4
	['1100']='1',	 ['1010']='7',
5
	['1001']='A',	 ['0110']='B',
6
	['0101']='3',	 ['0011']='9',
7
	['1110']='<A4>', ['0111']='<A6>',
8
	['1101']='<B2>', ['1011']='<B8>',
9
	['1111']='<AB>', ['0000']='0',
10
}
11
12
local function processMeasure(measure)
13
	local measure_notes={}
14
	local note_count=0
15
	for note in measure:gmatch('%d%d%d%d') do
16
		measure_notes[#measure_notes+1]=note_lookup_table[note]
17
		note_count=note_count + 1
18
	end
19
20
	if note_count==12 then
21
		measure_notes[0]='['
22
23
		measure_notes[25]=']'
24
	elseif note_count==16 then
25
		measure_notes[0]='('
26
		measure_notes[17]=')'
27
	elseif note_count==24 then
28
		measure_notes[0]='['
29
		measure_notes[25]=']'
30
	elseif note_count==32 then
31
		measure_notes[0]='{'
32
33
		measure_notes[65]='}'
34
	elseif note_count==48 then
35
		measure_notes[0]='`'
36-
		
36+
37
		measure_notes[49]='\''
38
	elseif note_count==64 then
39
		measure_notes[0]='{'
40
		measure_notes[65]='}'
41
	elseif note_count==96 then
42
		measure_notes[0]='`'
43
44
		measure_notes[96]='\''
45
	elseif note_count==192 then
46
		measure_notes[0]='`'
47
		measure_notes[193]='\''
48
	end
49
50
51
	return table.concat(measure_notes)
52
end
53
54
local sm_file
55
do
56
	local tmp=io.open(sm_filename)
57
	sm_file=tmp:read('*a')
58
	tmp:close()
59
end
60
61
local title=sm_file:getField('TITLE')
62
local artist=sm_file:getField('ARTIST')
63
local file=sm_file:getField('FILE')
64
local bpm=sm_file:getField('BPM')
65
local gap=sm_file:getField('GAP')
66
local sample_start=sm_file:getField('SAMPLESTART')
67
local sample_length=sm_file:getField('SAMPLELENGTH')
68
local note_data, idx=sm_file:getField('NOTES')
69
70
local measure
71
do
72
	local _, idx=sm_file:find('%s*%d+%s*%.%s*%d+%s*%:', idx)
73
	measure=sm_file:match('%b:,', idx)
74
	_, idx=sm_file:find(',', idx)
75
	sm_file:sub(idx)
76
end
77
78
processMeasure(measure)
79
80
for measure in sm_file:gmatch('.*%,') do
81
	processMeasure(measure)
82
end
83
84
local file_contents={}
85
86
file_contents[#file_contents+1]='#TITLE:' .. title .. ';\n'
87
file_contents[#file_contents+1]='#ARTIST:' .. artist .. ';\n'
88
file_contents[#file_contents+1]='#FILE:' .. file .. ';\n'
89
file_contents[#file_contents+1]='#BPM:' .. bpm .. ';\n'
90
file_contents[#file_contents+1]='#GAP:' .. gap .. ';\n'
91
file_contents[#file_contents+1]='#SAMPLESTART:' .. sample_start .. ';\n'
92
file_contents[#file_contents+1]='#SAMPLELENGTH:' .. sample_length .. ';\n'
93
file_contents[#file_contents+1]='#SINGLE:ANOTHER:1:\n'
94
95
file_contents[#file_contents+1]=';'
96
97
do
98
	local dwi_file=io.open(sm_filename .. '.dwi', 'w')
99
	dwi_file:write(table.concat(file_contents))
100
	dwi_file:close()
101
end
102
103
function string.getField(file_string, field)
104
	local _, idx=file_string:find('#' .. field:upper() .. ':')
105
	return file_string:match('%b:;', idx), idx
106
end