Compare commits

...

9 Commits

Author SHA1 Message Date
Kay Thomas
80969ca029 Merge pull request #35 from kaythomas0/v0.6.4
v0.6.4
2022-09-12 22:29:59 -07:00
Kevin Thomas
26fc54054f Fix bug that causes editing a sample to discard unsaved work 2022-09-11 21:17:45 -07:00
Kay Thomas
8a1fc99fb5 Merge pull request #34 from kaythomas0/v0.6.3
v0.6.3
2022-09-11 17:38:08 -07:00
Kevin Thomas
e6cc5b36c5 Fix typo 2022-09-11 15:11:17 -07:00
Kevin Thomas
6c4c24c166 Fix unwanted display of unsaved work dialog 2022-09-06 02:36:36 -07:00
Kevin Thomas
9466ed692b Use strict sameSite cookies 2022-09-06 02:36:19 -07:00
Kevin Thomas
5ace3d9996 Update package*.json 2022-09-06 02:35:54 -07:00
Kay Thomas
c4642df353 Merge pull request #33 from kaythomas0/v0.6.2
v0.6.2
2022-09-04 20:41:54 -07:00
Kevin Thomas
aca7fbd1e0 Fix sporadic playback with timer 2022-09-04 19:46:31 -07:00
5 changed files with 53 additions and 40 deletions

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{ {
"name": "noisedash", "name": "noisedash",
"version": "0.6.0", "version": "0.6.4",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "noisedash", "name": "noisedash",
"version": "0.6.0", "version": "0.6.4",
"private": true, "private": true,
"author": "Kay Thomas <kaythomas@pm.me> (https://kaythomas.dev)", "author": "Kay Thomas <kaythomas@pm.me> (https://kaythomas.dev)",
"scripts": { "scripts": {

View File

@@ -36,7 +36,8 @@ app.use(session({
store: new FileStore(fileStoreOptions), store: new FileStore(fileStoreOptions),
secret: sessionSecret, secret: sessionSecret,
resave: true, resave: true,
saveUninitialized: true saveUninitialized: true,
cookie: { sameSite: 'strict' }
})) }))
app.use((req, res, next) => { app.use((req, res, next) => {
const msgs = req.session.messages || [] const msgs = req.session.messages || []

View File

@@ -50,7 +50,7 @@
label="Profiles" label="Profiles"
class="mx-3 mb-5" class="mx-3 mb-5"
:disabled="playDisabled" :disabled="playDisabled"
@change="loadProfile" @change="loadProfile(true)"
/> />
</v-row> </v-row>
@@ -297,7 +297,7 @@
<v-card-text> <v-card-text>
<v-container> <v-container>
<v-row> <v-row>
<p>Select profile to record audio for. This is only supported on Chrome and Firefox.</p> <p>Select profile to record audio for. This is only supported on Chrome and Firefox. Current profile will be saved before recording.</p>
</v-row> </v-row>
<v-row> <v-row>
<v-select <v-select
@@ -788,7 +788,7 @@
value="continuous" value="continuous"
/> />
<v-radio <v-radio
label="Sporadic (Not Looped, Plays Randomly Within Interval" label="Sporadic (Not Looped, Plays Randomly Within Interval)"
value="sporadic" value="sporadic"
/> />
</v-radio-group> </v-radio-group>
@@ -1026,7 +1026,7 @@
<v-text-field <v-text-field
v-model="previewSampleFadeIn" v-model="previewSampleFadeIn"
type="number" type="number"
label="Fade In Time" label="Fade In Time (In continuous mode, this only effects first playback)"
:disabled="previewSamplePlaying" :disabled="previewSamplePlaying"
:rules="[rules.gt(-1)]" :rules="[rules.gt(-1)]"
@change="updatePreviewSamplePlayerFadeIn" @change="updatePreviewSamplePlayerFadeIn"

View File

@@ -188,6 +188,18 @@ export default {
this.lfo.connect(this.filter.frequency).start() this.lfo.connect(this.filter.frequency).start()
} }
if (this.isTimerEnabled) {
this.duration = parseInt((this.hours * 3600)) + parseInt((this.minutes * 60)) + parseInt(this.seconds)
this.timeRemaining = this.duration
this.transportInterval = setInterval(() => this.stop(), this.duration * 1000 + 100)
this.timeRemainingInterval = setInterval(() => this.startTimer(), 1000)
Tone.Transport.loopEnd = this.duration
this.noise.sync().start(0).stop(this.duration)
} else {
this.noise.sync().start(0)
}
this.loadedSamples.forEach(s => { this.loadedSamples.forEach(s => {
this.players.player(s.id).loop = true this.players.player(s.id).loop = true
this.players.player(s.id).fadeIn = s.fadeIn this.players.player(s.id).fadeIn = s.fadeIn
@@ -206,23 +218,7 @@ export default {
} else { } else {
this.players.player(s.id).toDestination() this.players.player(s.id).toDestination()
} }
})
if (this.isTimerEnabled) {
this.duration = parseInt((this.hours * 3600)) + parseInt((this.minutes * 60)) + parseInt(this.seconds)
this.noise.sync().start(0).stop(this.duration)
Tone.Transport.loopEnd = this.duration
this.timeRemaining = this.duration
this.transportInterval = setInterval(() => this.stop(), this.duration * 1000 + 100)
this.timeRemainingInterval = setInterval(() => this.startTimer(), 1000)
this.loadedSamples.forEach(s => {
this.players.player(s.id).unsync().sync().start(0).stop(this.duration)
})
} else {
this.noise.sync().start(0)
this.loadedSamples.forEach(s => {
if (s.playbackMode === 'sporadic') { if (s.playbackMode === 'sporadic') {
this.players.player(s.id).loop = false this.players.player(s.id).loop = false
@@ -235,10 +231,14 @@ export default {
} }
} else { } else {
this.players.player(s.id).loop = true this.players.player(s.id).loop = true
if (this.isTimerEnabled) {
this.players.player(s.id).unsync().sync().start(0).stop(this.duration)
} else {
this.players.player(s.id).unsync().sync().start(0) this.players.player(s.id).unsync().sync().start(0)
} }
})
} }
})
Tone.Transport.start('+0.1') Tone.Transport.start('+0.1')
}, },
@@ -344,7 +344,7 @@ export default {
} }
this.exportedProfile = this.profileItems[0] this.exportedProfile = this.profileItems[0]
this.recordedProfile = this.profileItems[0] this.recordedProfile = this.profileItems[0]
this.loadProfile() this.loadProfile(true)
} }
} }
}) })
@@ -420,8 +420,8 @@ export default {
this.errorSnackbar = true this.errorSnackbar = true
}) })
}, },
loadProfile () { loadProfile (checkForUnsavedWork) {
if (this.unsavedWork) { if (checkForUnsavedWork && this.unsavedWork) {
this.confirmSwitchProfileDialog = true this.confirmSwitchProfileDialog = true
} else { } else {
this.$http.get('/profiles/'.concat(this.selectedProfile.id)) this.$http.get('/profiles/'.concat(this.selectedProfile.id))
@@ -736,7 +736,16 @@ export default {
}).then(response => { }).then(response => {
if (response.status === 200) { if (response.status === 200) {
this.getSamples() this.getSamples()
this.loadProfile()
// Update sample if it's already loaded in current profile
const sample = this.loadedSamples.find(s => s.id === this.selectedPreviewSample.id)
if (sample) {
sample.fadeIn = this.previewSampleFadeIn
sample.loopPointsEnabled = this.previewSampleLoopPointsEnabled
sample.loopStart = this.previewSampleLoopStart
sample.loopEnd = this.previewSampleLoopEnd
}
this.closeEditSampleForm() this.closeEditSampleForm()
this.infoSnackbarText = 'Sample Saved' this.infoSnackbarText = 'Sample Saved'
this.infoSnackbar = true this.infoSnackbar = true
@@ -760,6 +769,9 @@ export default {
this.profileMoreDialog = false this.profileMoreDialog = false
}, },
startRecording () { startRecording () {
// Save current profile before recording
this.updateProfile()
this.$http.get('/profiles/'.concat(this.recordedProfile.id)) this.$http.get('/profiles/'.concat(this.recordedProfile.id))
.then(async response => { .then(async response => {
if (response.status === 200) { if (response.status === 200) {
@@ -866,7 +878,7 @@ export default {
const recording = await this.recorder.stop() const recording = await this.recorder.stop()
// Set active profile back to the selected one // Set active profile back to the selected one
this.loadProfile() this.loadProfile(false)
const url = URL.createObjectURL(recording) const url = URL.createObjectURL(recording)
const anchor = document.createElement('a') const anchor = document.createElement('a')
@@ -890,7 +902,7 @@ export default {
await this.recorder.stop() await this.recorder.stop()
// Set active profile back to the selected one // Set active profile back to the selected one
this.loadProfile() this.loadProfile(false)
clearInterval(this.recordingInterval) clearInterval(this.recordingInterval)
this.recordingDialog = false this.recordingDialog = false
@@ -898,7 +910,7 @@ export default {
}, },
discardChanges () { discardChanges () {
this.unsavedWork = false this.unsavedWork = false
this.loadProfile() this.loadProfile(true)
this.confirmSwitchProfileDialog = false this.confirmSwitchProfileDialog = false
}, },
saveChanges () { saveChanges () {