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;
- }
}
}