diff --git a/README.md b/README.md index 3766457b1848b3ff674cc0c6a206448a876d4a00..7dc1d103ceb4d2df8961eb418f35fc7afcb5dda4 100644 --- a/README.md +++ b/README.md @@ -84,39 +84,39 @@ To ***save*** your template, it's automatic ! Just type, edit what you want. It ### MIDI Variables -| Midi Event | Parameter | Informations | -|-------------|-----------|------------------------------------------| -| note | id | Note on, use case : note:21 | -| cc | id | Control change, use case : cc:10 | -| pb | | Pitchbend, use case : pb | +| Midi Event | Parameter | Informations | +|-------------|-----------|-----------------------------------------------------| +| note | id | Note on, use case : note:21 | +| cc | id | Control change, use case : cc:10 | +| pb | | Pitchbend, use case : pb | ### Audio Variables -| Audio Event | Parameter | Informations | -|-------------|-----------|------------------------------------------| -| low | | low energy, use case : low | -| lomi | | lomi energy, use case : lomi | -| low | | mid energy, use case : mid | -| mihi | | mihi energy, use case : mihi | -| hi | | High energy, use case : hi | -| loud | | Volume meter, use case : loud | -| onset | note | Note, use case : onset:A | -| attack | | Attack, use case : attack | +| Audio Event | Parameter | Informations | +|-------------|-----------|-----------------------------------------------------| +| low | | low energy, use case : low | +| lomi | | lomi energy, use case : lomi | +| low | | mid energy, use case : mid | +| mihi | | mihi energy, use case : mihi | +| hi | | High energy, use case : hi | +| loud | | Volume meter, use case : loud | +| onset | note | Note, use case : onset:A | +| attack | | Attack, use case : attack | ### Types -| Option | Informations | -|-------------|------------------------------------------------------| -| min:max | Decimal or hexadecimal min and max splited by ":" | -| A;B;C | Array splited by ";" | +| Option | Informations | +|-------------|-----------------------------------------------------------------| +| min:max | Decimal or hexadecimal min and max splited by ":" | +| A;B;C | Array splited by ";" | ### Options -| Option | Informations | -|-------------|------------------------------------------------------| -| r | Random value between type object | +| Option | Informations | +|-------------|-----------------------------------------------------------------| +| r | Random value between type object | | i:1 | Incremental value between type object, increment can be negative| -| d | Linear value between type object | +| d | Linear value between type object | ### Examples diff --git a/background.js b/background.js index f9042d609396251edebc1ab978a9a56e5332c69d..449614ee467896066f4a75edc2a12c95d539246d 100644 --- a/background.js +++ b/background.js @@ -16,28 +16,36 @@ let audioI = false; let midiI = false; let popup = false; let loopPlay = false; -let records = [ - [ - { - time: 1, - data: { value: 0, controller: { number: 1 } }, - type: 'controlchange' - }, - { - time: 2000, - data: { value: 1, controller: { number: 1 } }, - type: 'controlchange' - }, - { - time: 3000, - data: { value: 0, controller: { number: 1 } }, - type: 'controlchange' - } +let records = { + loop: [ + [ + { + time: 1, + data: { value: 0, controller: { number: 1 } }, + type: 'controlchange' + }, + { + time: 2000, + data: { value: 1, controller: { number: 1 } }, + type: 'controlchange' + }, + { + time: 3000, + data: { value: 0, controller: { number: 1 } }, + type: 'controlchange' + } + ], + [], + [], + [] ], - [], - [], - [] -]; + info: [ + {isLoop:false}, + {isLoop:false}, + {isLoop:false}, + {isLoop:false} + ] +}; let all = ""; //Initialize the CSS storage on startup diff --git a/content.js b/content.js index fd2162dc4cab098e3223b398b3173d7a75573cee..73c718f8161692f388153730d2a87a3b064153fd 100644 --- a/content.js +++ b/content.js @@ -356,31 +356,34 @@ function freqToBin(freq, rounding = 'round') { } // Allow to store the current note in an index, for duration computation -const CURRENT = {}; -// const RECORDED = []; chrome.storage.sync.get(['records'], function (result) { - RECORDED = result.records; + RECORDED = result.records.loop; + INFOLOOP = result.records.info; }); let recordCount = 0; let isRecording = false; -let isLoop = false; let recordingTime = 0; let theLoop; const record = (status, number) => { isRecording = status; - recordingTime = performance.now(); - recordCount = number; + if (status) { + recordingTime = performance.now(); + recordCount = number; + } + else { + chrome.storage.sync.set({ 'records': { loop: RECORDED, info: INFOLOOP } }); + } }; // Start loop const loop = (number) => { - isLoop = !isLoop; + INFOLOOP[number].isLoop = !INFOLOOP[number].isLoop; isRecording = false; if (RECORDED[number].length) { const loopLength = RECORDED[number][RECORDED[number].length - 1].time; - if (isLoop) { + if (INFOLOOP[number].isLoop) { loopNotes(number); theLoop = setInterval(() => loopNotes(number), loopLength); } else { @@ -392,10 +395,8 @@ const loop = (number) => { const loopNotes = (number) => { RECORDED[number].forEach(note => { setTimeout(() => { - // Prevent to keep playing also after stop - if (!isLoop) return; + if (!INFOLOOP[number].isLoop) return; midiEvent(note.type, note.data) - // setTimeout(() => play(note.note, 0), 200) }, note.time); }) } @@ -404,7 +405,7 @@ const reset = (number) => { RECORDED[number].length = 0; isRecording = false; isLoop = false; - chrome.storage.sync.set({ 'records': RECORDED }); + chrome.storage.sync.set({ 'records': { loop: RECORDED, info: INFOLOOP } }); } function audioEvent() { @@ -549,12 +550,10 @@ function onMessage({ type, data }) { break; } case 'playLoop': { - loop(data); - break; - } - case 'getLoop': { - chrome.storage.sync.get(['records'], function (result) { - chrome.runtime.sendMessage({ type: 'midiRecords', data: result.records }); + chrome.storage.sync.get(['activate'], function (result) { + if (result.activate) { + loop(data); + } }); break; } @@ -564,9 +563,7 @@ function onMessage({ type, data }) { } case 'resetLoop': { reset(data); - chrome.storage.sync.get(['records'], function (result) { - chrome.runtime.sendMessage({ type: 'midiRecords', data: result.records }); - }); + chrome.runtime.sendMessage({ type: 'updateUi', data: false }); break; } } diff --git a/main.js b/main.js index 5dc1230986dd30eeffbd9721770571334d5a0401..2fbb647be6bed472c2885bfadf19e44798f6d24a 100644 --- a/main.js +++ b/main.js @@ -109,12 +109,17 @@ function initUi() { $('.midiI').removeClass('active'); } }); - chrome.tabs.query({ active: true, currentWindow: true }, - function (tabs) { - chrome.tabs.sendMessage(tabs[0].id, { type: 'getLoop', data: false }); + chrome.storage.sync.get(['records'], function (result) { + $('#loopList').text(''); + for (let i = 0; i < result.records.loop.length; i++) { + if (result.records.loop[i].length > 0) { + $('#loopList').append('<tr><td>Boucle n°' + (i + 1) + '</td><td>' + result.records.loop[i][result.records.loop[i].length - 1].time + 'ms</td><td>' + result.records.loop[i].length + '</td><td><button id="record" value="' + i + '">' + recordIcon + '</button><button id="loopPlay" value="' + i + '">' + (result.records.info[i].isLoop?pauseIcon:playIcon) + '</button><button id="loopReset" value="' + i + '">' + trashIcon + '</button></td></tr>'); + } + else { + $('#loopList').append('<tr><td>Boucle n°' + (i + 1) + '</td><td></td><td>0</td><td><button id="record" value="' + i + '">' + recordIcon + '</button><button id="loopPlay" value="' + i + '">' + playIcon + '</button><button id="loopReset" value="' + i + '">' + trashIcon + '</button></td></tr>'); + } } - ); - + }); chrome.storage.sync.get(['parameters'], function (result) { parameters = JSON.parse(result.parameters); var tbl_body = ""; @@ -333,8 +338,8 @@ function onMessage({ type, data }) { case 'midiEvent': { if (dataMidi != data) { $('#midiEvent').text(data); - $('#midiEvent').parent().animate({'background-color': 'red'}, 'slow'); - $('#midiEvent').parent().animate({'background-color': 'transparent'}, 'slow'); + $('#midiEvent').parent().animate({ 'background-color': 'red' }, 'slow'); + $('#midiEvent').parent().animate({ 'background-color': 'transparent' }, 'slow'); var focusedTd = $('[contenteditable]:focus'); var focusedCol = $(focusedTd).index('#parameters tr:eq(' + $(focusedTd).parent().index('#parameters tr') + ') td'); if (focusedTd.length > 0 && focusedCol == 4) { @@ -348,19 +353,6 @@ function onMessage({ type, data }) { $('#midiDevices').text(data); break; } - case 'midiRecords': { - $('#loopList').text(''); - console.log(data); - for (let i = 0; i < data.length; i++) { - if (data[i].length > 0) { - $('#loopList').append('<tr><td>Boucle n°' + (i + 1) + '</td><td>' + data[i][data[i].length - 1].time + 'ms</td><td>' + data[i].length + '</td><td><button id="record" value="' + i + '">' + recordIcon + '</button><button id="loopPlay" value="' + i + '">' + playIcon + '</button><button id="loopReset" value="' + i + '">' + trashIcon + '</button></td></tr>'); - } - else { - $('#loopList').append('<tr><td>Boucle n°' + (i + 1) + '</td><td></td><td>0</td><td><button id="record" value="' + i + '">' + recordIcon + '</button><button id="loopPlay" value="' + i + '">' + playIcon + '</button><button id="loopReset" value="' + i + '">' + trashIcon + '</button></td></tr>'); - } - } - break; - } } }