Skip to content

Commit eecb3a5

Browse files
authored
Merge pull request #31 from carlosedp/release/v5.4.0-20250630-183018
πŸš€ Release v5.4.0 to Production
2 parents ed68f0a + 4871d3d commit eecb3a5

18 files changed

Lines changed: 1036 additions & 503 deletions

β€Ždocs/FeatureList.mdβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
- [x] Have different fade curves for fade in and fade out (linear, exponential, etc.)
2323
- [ ] Settings menu for:
2424
- [ ] Fade in/out curve type (linear, exponential, etc.)
25+
- [ ] Crossfade lengh and curve type
2526
- [ ] Truncate lenght (174 seconds by default)
2627
- [ ] Default export format
27-
- [ ] Improve splice detection with maybe a different algorithm or more advanced settings
2828
- [ ] Add detection preset slots to save sensitivity, frame size, and overlap settings
2929
- [x] Use mouse scroll to zoom in/out on the waveform
3030
- [x] Add tooltip to append audio button
@@ -33,7 +33,7 @@
3333
- [ ] Multi-level undo/redo functionality
3434
- [x] Time stretching and pitch shifting
3535
- [x] Audio effects (normalization, add/remove gain)
36-
- [ ] Crossfade between splice points with defined length and curve type
36+
- [x] Crossfade between splice points with defined length and curve type
3737
- [x] Record audio directly into the app via Wavesurfer record plugin
3838

3939
## Bugs

β€Žpackage-lock.jsonβ€Ž

Lines changed: 314 additions & 368 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackage.jsonβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"url": "https://github.com/carlosedp/morphedit/issues"
2020
},
2121
"private": true,
22-
"version": "5.3.0",
22+
"version": "5.4.0",
2323
"type": "module",
2424
"scripts": {
2525
"start": "vite",

β€Žpublic/USER_MANUAL.mdβ€Ž

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ Although primarily focused on Morphagene users, MorphEdit can also be used for g
3434

3535
- **Splice Marker Management**: Add, remove, lock, and automatically detect splice points
3636
- **Direct Splice Playback**: Play individual splice markers with keyboard shortcuts (1-0, Q-P)
37-
- **Audio Processing**: Crop, fade in/out, and concatenate multiple files
37+
- **Audio Processing**: Crop, fade in/out, crossfade, and concatenate multiple files
38+
- **Crossfade Processing**: Create smooth transitions between audio sections at splice markers
3839
- **Tempo and Pitch Processing**: Professional-grade tempo and pitch shifting with RubberBand
3940
- **Audio Normalization**: Professional-grade normalization to -1dB peak for optimal levels
4041
- **BPM Detection**: Automatic tempo detection and display for musical content
@@ -93,14 +94,15 @@ The MorphEdit interface consists of several main sections:
9394
- **BPM Display**: Shows detected BPM (tempo) of the loaded audio file
9495
- **Region Information**: Displays active crop and fade region details
9596

96-
![alt text](img/playback.png)
97+
![info bar](img/infobar.png)
9798

9899
### 3. Export and Region Controls (Middle Section)
99100

100101
- **Export Button**: Quick export in default Morphagene format
101102
- **Export Menu**: Access to multiple export formats
102103
- **Crop Region**: Create and apply crop regions
103104
- **Fade Regions**: Create fade-in and fade-out regions
105+
- **Crossfade Regions**: Create smooth transitions at splice markers
104106
- **Apply/Undo Buttons**: Process audio and revert changes
105107

106108
![alt text](img/region.png)
@@ -347,6 +349,50 @@ With fades applied:
347349

348350
![alt text](img/fades-applied.png)
349351

352+
### Crossfade Regions
353+
354+
Crossfade regions create smooth transitions between audio sections at splice markers, allowing you to blend two audio segments together seamlessly. This is especially useful for creating natural-sounding loops or transitions in Morphagene compositions.
355+
356+
![crossfade](img/crossfade.png)
357+
358+
#### Creating Crossfade Regions
359+
360+
1. **Select Splice Marker**: First, click on a splice marker to select it
361+
2. **Create Region**: Press '\' (backslash) or click the "Crossfade" button
362+
3. **Default Size**: Creates a 1-second crossfade region centered on the selected marker which can be resized
363+
4. **Visual Feedback**: Blue highlighted area shows the crossfade region
364+
5. **Curve Selection**: Choose from linear, exponential, or logarithmic curves
365+
366+
#### Crossfade Requirements
367+
368+
- **Splice Marker**: A splice marker must be selected to enable crossfade creation
369+
- **Audio Context**: Works best with audio that has content both before and after the marker
370+
- **Region Positioning**: The crossfade is automatically centered on the selected marker
371+
372+
#### Adjusting Crossfade Regions
373+
374+
1. **Resize**: Drag the handles to adjust crossfade duration
375+
2. **Move**: Drag the region to reposition (while keeping it centered on the marker)
376+
3. **Curve Type**: Use the dropdown to select different fade curves:
377+
- **Linear**: Constant crossfade rate
378+
- **Exponential**: Smooth, gradual transition
379+
- **Logarithmic**: More dramatic transition effect
380+
381+
#### Applying Crossfades
382+
383+
1. **Review Region**: Ensure crossfade boundaries are appropriate
384+
2. **Curve Selection**: Choose the desired crossfade curve type
385+
3. **Apply**: Click "Apply Crossfade" button
386+
4. **Processing**: The first half of the region fades out, the second half fades in
387+
5. **Smooth Transition**: Creates a seamless blend between the two audio sections
388+
389+
#### Best Practices
390+
391+
- **Loop Points**: Use crossfades at loop start/end points for seamless loops
392+
- **Section Transitions**: Apply crossfades between different musical sections
393+
- **Morphagene Optimization**: Create smooth granular transitions for the Morphagene
394+
- **Audio Content**: Works best with audio that has compatible harmonic or rhythmic content
395+
350396
### Audio Normalization
351397

352398
MorphEdit includes audio normalization to optimize your audio levels for consistent playback and processing.
@@ -571,18 +617,18 @@ The estimated new audio length is displayed in the dialog.
571617

572618
### Regions
573619

574-
| Key | Action | Description |
575-
| ----- | ----------- | --------------------------- |
576-
| **C** | Crop Region | Toggle crop region creation |
577-
| **[** | Fade-In | Toggle fade-in region |
578-
| **]** | Fade-Out | Toggle fade-out region |
620+
| Key | Action | Description |
621+
| ------ | ----------- | --------------------------------------------------------- |
622+
| **C** | Crop Region | Toggle crop region creation |
623+
| **[** | Fade-In | Toggle fade-in region |
624+
| **]** | Fade-Out | Toggle fade-out region |
625+
| **\\** | Crossfade | Toggle crossfade region (requires selected splice marker) |
579626

580627
### System
581628

582-
| Key | Action | Description |
583-
| ------------------ | ------ | ------------------------------------ |
584-
| **Ctrl+Z / Cmd+Z** | Undo | Undo last processing operation |
585-
| **\\** | Reset | Clear all data and reset application |
629+
| Key | Action | Description |
630+
| ------------------ | ------ | ------------------------------ |
631+
| **Ctrl+Z / Cmd+Z** | Undo | Undo last processing operation |
586632

587633
---
588634

β€Žpublic/img/crossfade.pngβ€Ž

42.4 KB
Loading

β€Žpublic/img/infobar.pngβ€Ž

95.9 KB
Loading

β€Žpublic/img/playback.pngβ€Ž

-24.6 KB
Binary file not shown.

β€Žsrc/Waveform.tsxβ€Ž

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ export interface WaveformRef extends SpliceMarkerHandlers {
7272
handleDecreaseSkipIncrement: () => void;
7373
handleFadeInRegion: () => void;
7474
handleFadeOutRegion: () => void;
75+
handleCrossfadeRegion: () => void;
7576
handleApplyCrop: () => void;
7677
handleApplyFades: () => void;
78+
handleApplyCrossfade: () => void;
7779
handleNormalize: () => void;
7880
handleTempoAndPitch: () => void;
7981
handleUndo: () => void;
@@ -1013,8 +1015,10 @@ const Waveform = forwardRef<WaveformRef, WaveformProps>(
10131015
const handleLoop = handlers.handleLoop;
10141016
const handleFadeInRegion = handlers.handleFadeInRegion;
10151017
const handleFadeOutRegion = handlers.handleFadeOutRegion;
1018+
const handleCrossfadeRegion = handlers.handleCrossfadeRegion;
10161019
const handleApplyCrop = handlers.handleApplyCrop;
10171020
const handleApplyFades = handlers.handleApplyFades;
1021+
const handleApplyCrossfade = handlers.handleApplyCrossfade;
10181022
const handleNormalize = handlers.handleNormalize;
10191023
const handleTempoAndPitch = handlers.handleTempoAndPitch;
10201024
const handleUndo = handlers.handleUndo;
@@ -1072,8 +1076,10 @@ const Waveform = forwardRef<WaveformRef, WaveformProps>(
10721076
handleDecreaseSkipIncrement,
10731077
handleFadeInRegion,
10741078
handleFadeOutRegion,
1079+
handleCrossfadeRegion,
10751080
handleApplyCrop,
10761081
handleApplyFades,
1082+
handleApplyCrossfade,
10771083
handleNormalize,
10781084
handleTempoAndPitch,
10791085
handleUndo,
@@ -1102,8 +1108,10 @@ const Waveform = forwardRef<WaveformRef, WaveformProps>(
11021108
handleDecreaseSkipIncrement,
11031109
handleFadeInRegion,
11041110
handleFadeOutRegion,
1111+
handleCrossfadeRegion,
11051112
handleApplyCrop,
11061113
handleApplyFades,
1114+
handleApplyCrossfade,
11071115
handleNormalize,
11081116
handleTempoAndPitch,
11091117
handleUndo,
@@ -1187,25 +1195,33 @@ const Waveform = forwardRef<WaveformRef, WaveformProps>(
11871195
exportAnchorEl={state.exportAnchorEl}
11881196
fadeInAnchorEl={state.fadeInAnchorEl}
11891197
fadeOutAnchorEl={state.fadeOutAnchorEl}
1198+
crossfadeAnchorEl={state.crossfadeAnchorEl}
11901199
cropMode={state.cropMode}
11911200
fadeInMode={state.fadeInMode}
11921201
fadeOutMode={state.fadeOutMode}
11931202
fadeInCurveType={state.fadeInCurveType}
11941203
fadeOutCurveType={state.fadeOutCurveType}
1204+
crossfadeMode={state.crossfadeMode}
1205+
crossfadeCurveType={state.crossfadeCurveType}
1206+
selectedSpliceMarker={!!state.selectedSpliceMarker}
11951207
canUndo={canUndo}
11961208
onExport={handleExport}
11971209
onExportSlices={handleExportSlices}
11981210
onExportFormatChange={handleExportFormatChange}
11991211
onSetExportAnchorEl={actions.setExportAnchorEl}
12001212
onSetFadeInAnchorEl={actions.setFadeInAnchorEl}
12011213
onSetFadeOutAnchorEl={actions.setFadeOutAnchorEl}
1214+
onSetCrossfadeAnchorEl={actions.setCrossfadeAnchorEl}
12021215
onNormalize={handleNormalize}
12031216
onTempoAndPitch={handleTempoAndPitch}
12041217
onCropRegion={handleCropRegion}
12051218
onApplyCrop={handleApplyCrop}
12061219
onFadeInRegion={handleFadeInRegion}
12071220
onFadeOutRegion={handleFadeOutRegion}
12081221
onApplyFades={handleApplyFades}
1222+
onCrossfadeRegion={handleCrossfadeRegion}
1223+
onApplyCrossfade={handleApplyCrossfade}
1224+
onSetCrossfadeCurveType={actions.setCrossfadeCurveType}
12091225
onUndo={handleUndo}
12101226
onSetFadeInCurveType={actions.setFadeInCurveType}
12111227
onSetFadeOutCurveType={actions.setFadeOutCurveType}

β€Žsrc/components/AudioRecorder.tsxβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,10 @@ export const AudioRecorder: React.FC<AudioRecorderProps> = ({
547547
? 'Select a microphone and click "Start Recording" to begin'
548548
: 'Click "Stop Recording" when finished to preview your audio'}
549549
</Typography>
550+
<Typography variant="caption" color="text.primary" textAlign="center">
551+
If encontering issues on mobile, try on Chrome browser for better
552+
compatibility.
553+
</Typography>
550554
</Stack>
551555
</Paper>
552556
);

β€Žsrc/components/FadeCurveSelector.tsxβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { TOOLTIP_DELAYS } from '../constants';
88
interface FadeCurveSelectorProps {
99
selectedCurve: string;
1010
onCurveChange: (curveType: string) => void;
11-
fadeType: 'in' | 'out';
11+
fadeType: 'in' | 'out' | 'crossfade';
1212
disabled?: boolean;
1313
anchorEl: HTMLElement | null;
1414
onSetAnchorEl: (element: HTMLElement | null) => void;

0 commit comments

Comments
Β (0)