kmatheussen / radium

A graphical music editor. A next generation tracker.
http://users.notam02.no/~kjetism/radium/
GNU General Public License v2.0
844 stars 36 forks source link

swing anyone? #628

Closed coderofsalvation closed 7 years ago

coderofsalvation commented 8 years ago

What is the adviced way to apply swing/shuffle timing to incoming notes? PD / Faust note-filter? MODTrackerstyle Tempohack by changing tempo every line?

Lykdraft commented 8 years ago

Swing can be accomplished by using sublines. I made a short video a while ago about it.

https://vimeo.com/162647680 I agree that a global (or per track) swing setting would be nice, but because of Radiums ability to use a basically infinite numer of notes inbetween the "regular musical grid", a classical swing setting (which usually only uses 16th notes) is probably pretty hard to get working. (i.e.: How to handle all the notes on the sublines inbetween the "Grid", as radium not really has a "fixed" grid?)

Have a look. If it's not clear how to work with sublines, maybe Kjetil can join in to explain this better or I will make a short video about how to do that exaclty.

Best, tL.

(EDIT: To make this clear, Sublines have nothing to do with changing your tempo at all.. It is much easier that that....)

kmatheussen commented 8 years ago

I'm a little bit on thin ice here, but maybe you can also set the grid value (in the upper left of the window) to, e.g 2/3. It won't work when adding new notes with the keyboard though, but it will with the piano roll.

kmatheussen commented 8 years ago

Sorry, but I don't have any experience with swinging music, so my head is not wrapped around the concept, but if the grid idea is a good one, it's no problem fixing so that adding notes also follows grid. (That might be the natural thing to do anyway.)

Lykdraft commented 8 years ago

Well, to clarify a bit: You have to understand that basically every music usually (with straight electronic/techno being sometimes the exception) has some kind of swing applied to it. In MPC words: there is nearly never a case where you run your whole song 50% (which is 0% swing). So you usually always apply some kind of swing to at least some of your instruments, no matter what musical style you're working on, as this just sounds way way way much better and more natural.

So swing has really not much to do with "Swing" Music, but swing/groove/shuffle (or whatever you want to call it) is applied by nearly everyone that creates any kind of musical style on a daily basis since basically forever... :)

A 2/3rds grid is a completely different kind of animal... Has nothing to do with it... ;)

Best, tL.

kmatheussen commented 8 years ago

I know the concept of swing, but it's a very long time since I tried to make much music where it would be practical to add swing automatically, so my head isn't wrapped around the concept. I think the grid idea would work if you manually change the grid for the different notes, but I guess that isn't practical.

My question here is whether to

  1. Show graphically in the editor where the notes are actually placed. This can either be done using advanced grid, or automatically split lines, which you have done, just manually. A third way could be to show different heights for the lines.

or

  1. Automatically add swing behind the scene. For example by adding some settings specific for a block.

or

  1. Make it more conveniently to add swing using the classic tracker tempo hack. I actually like this way a lot, but maybe it has draw backs?

On Thu, Aug 11, 2016 at 12:09 PM, Lykdraft notifications@github.com wrote:

Well, to clarify a bit: You have to understand that basically every music usually (with straight electronic/techno being sometimes the exception) has some kind of swing applied to it. In MPC words: there is nearly never a case where you run your whole song 50% (which is 0% swing). So you usually always apply some kind of swing to at least some of your instruments, no matter what musical style you're working on, as this just sounds way way way much better and more natural.

So swing has really not much to do with "Swing" Music, but swing/groove/shuffle (or whatever you want to call it) is applied by nearly everyone that creates any kind of musical style on a daily basis since basically forever... :)

A 2/3rds grid is a completely different kind of animal... Has nothing to do with it... ;)

Best, tL.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/kmatheussen/radium/issues/628#issuecomment-239121319, or mute the thread https://github.com/notifications/unsubscribe-auth/ABF9p282ai2-JKb8ziXejoooYwpFV4B9ks5qevS8gaJpZM4JX9FJ .

Lykdraft commented 8 years ago

Ah I see, so probably I misunderstood.

  1. Show graphically in the editor where the notes are actually placed. This can either be done using advanced grid, or automatically split lines, which you have done, just manually. A third way could be to show different heights for the lines.

All of theese points sound interesting. The graphically way sounds most interesting to me on paper. Alas I don't have an exact vision of how this would work out. Auto-Split, not too sure about this. Different height of lines might visually be too confusing? But probably the best way to really see what's going on.

  1. Automatically add swing behind the scene. For example by adding some settings specific for a block.

This would be probably the easiest approach, but also the less flexible. Kind of a "master-groove" like Ableton had in earlier versions. Probably most "standart" users however would like this the most, as this is the most simple to work with. But global groove is a groove-trap in itself so to speak. (because if all instruments swing a bit different, that's actually when real groove kicks in, not when everything swings the same, but a lot of people don't get this concept.)

  1. Make it more conveniently to add swing using the classic tracker tempo hack. I actually like this way a lot, but maybe it has draw backs?

Interesting, to me thats the worst way to work with swing..:) But maybe thats just me.

Best, tL.

coderofsalvation commented 7 years ago

I added a 'swing'-slider to the default puredata 'Note events' patch (see context menu in mixerview radium)

https://drive.google.com/file/d/0B6Bbmgd8asH-OXplVHBrN3ZNQm8/view?usp=sharing

It seems to work (eventhough it needs work) for note-on and note-off events, however it seems to crash radium at some point.

@kmatheussen could you see if your radium crashes at some point (btw. i had the patterneditor send notes to pipe-machine->pd note events (the preset)->sample player).

note: uncheck 'T' for the pd instrumentscreen (bottom-left)

Crashlog

FULL VERSION 

4.0.0

OpenGL vendor: Intel Open Source Technology Center
OpenGL renderer: Mesa DRI Intel(R) Ivybridge Mobile 
OpenGL version: 3.0 Mesa 10.3.2
OpenGL flags: 107f

Running plugins: 

Running time: 334.01

0: ??:0 CRASHREPORTER_send_message_with_backtrace()
1: crashreporter_posix.c:0  crash()
2: ??:0 __restore_rt()
3: ??:0 raise()
4: ??:0 abort()
5: ??:0 __uselocale()
6: ??:0 __assert_fail()
7: ??:0 xcb_connect_to_fd()
8: ??:0 xcb_get_maximum_request_length()
9: ??:0 xcb_send_request()
10: ??:0    xcb_take_socket()
11: ??:0    _XFreeX11XCBStructure()
12: ??:0    _XFlush()
13: ??:0    _XGetRequest()
14: ??:0    XSync()
15: ??:0    glXGetDriverConfig()
16: ??:0    qt_plugin_instance()
17: ??:0    _ZN14QOpenGLContext11swapBuffersEP8QSurface()
18: Widget.cpp:974  _ZN18MyQtThreadedWidget11updateEventEv()
19: OpenGLContext.hpp:403   _ZN2vl13OpenGLContext16dispatchRunEventEv()
20: ??:0    _ZN7QThread21setTerminationEnabledEb()
21: ??:0    start_thread()
22: ??:0    __clone()

start event_pos: 59
Undo audio effect NoteEvents 1 0. Qt/Qt_MyQSlider.h:207. Function: mousePressEvent.
Undo audio effect NoteEvents 1 43. mixergui/QM_chip.cpp:1431. Function: mousePressEvent.
Undo audio effect NoteEvents 1 40. mixergui/QM_chip.cpp:1431. Function: mousePressEvent.
Undo audio effect 025. CrisisDK-Tr808 20. mixergui/QM_chip.cpp:1377. Function: mousePressEvent.
Undo audio effect 025. CrisisDK-Tr808 20. mixergui/QM_chip.cpp:1377. Function: mousePressEvent.
Undo audio effect NoteEvents 1 6. Qt/Qt_MyQSlider.h:207. Function: mousePressEvent.
Mixer connections. mixergui/QM_MixerWidget.cpp:1006. Function: mouseReleaseEvent.
keyUpPlay [ev]
     Undoing Finished
        Undoing Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
        Undoing Remove audio_patch NoteEvents 1. common/patch.cpp:454. Function: make_inactive.
     Undoing Start
undo [ev]
Remove audio_patch NoteEvents 1. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
     Undoing Finished
        Undoing Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
        Undoing Remove audio_patch NoteEvents 1. common/patch.cpp:454. Function: make_inactive.
     Undoing Start
undo [ev]
Remove audio_patch NoteEvents 1. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Mixer connections. mixergui/QM_MixerWidget.cpp:1006. Function: mouseReleaseEvent.
Mixer connections. mixergui/QM_MixerWidget.cpp:787. Function: mousepress_delete_connection.
Chip position NoteEvents 1. mixergui/QM_MixerWidget.cpp:857. Function: mousepress_create_chip.
Add audio_patch NoteEvents 1. common/patch.cpp:266. Function: PATCH_make_active_audio.
playStop [ev]
Block tempo nodes. api/api_mouse.c:813. Function: undoTemponodes.
Block tempo nodes. api/api_mouse.c:813. Function: undoTemponodes.
cursorUp [ev]
cursorUp [ev]
cursorUp [ev]
cursorUp [ev]
Block tempo nodes. api/api_mouse.c:813. Function: undoTemponodes.
Block tempo nodes. api/api_mouse.c:813. Function: undoTemponodes.
Block tempo nodes. api/api_mouse.c:813. Function: undoTemponodes.
playStop [ev]
Remove audio_patch Aux 3 Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Aux 2 Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Aux 1 Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Reverb Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Chorus Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch TAP Stereo Echo 1. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Sample Player 2. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Track. common/patch.cpp:385. Function: PATCH_replace_patch_in_song.
Remove audio_patch toploop. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Track. common/patch.cpp:385. Function: PATCH_replace_patch_in_song.
Remove audio_patch kick. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Track. common/patch.cpp:385. Function: PATCH_replace_patch_in_song.
Remove audio_patch Pipe 2. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch DJ EQ 2. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Kick1.wav. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Calf Chorus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Main Pipe. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch System Out. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Zita Reverb. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Click. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Kick3.wav. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch perc. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Track. common/patch.cpp:385. Function: PATCH_replace_patch_in_song.
Remove audio_patch 025. CrisisDK-Tr808. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
load [ev]
playStop [ev]
Remove audio_patch Chorus Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Reverb Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Aux 1 Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Aux 2 Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Aux 3 Bus. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Click. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Zita Reverb. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch System Out. common/patch.cpp:454. Function: make_inactive.
Mixer connections. audio/audio_instrument.c:718. Function: AUDIO_remove_patch.
Remove audio_patch Main Pipe. common/patch.cpp:454. Function: make_inactive.
end event_pos: 59

LINUX

/etc/os-release: PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="https://bugs.debian.org/"

/proc/version: Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04)

/proc/cpuinfo: processor    : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 1685.324
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips    : 3392.31
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 1700.066
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips    : 3392.31
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 1697.808
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 1
cpu cores   : 2
apicid      : 2
initial apicid  : 2
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips    : 3392.31
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 1700.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 1
cpu cores   : 2
apicid      : 3
initial apicid  : 3
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips    : 3392.31
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:
kmatheussen commented 7 years ago

Thank you. I'll look more at it later. Regarding the crash, this seems to be a crash caused by the gfx card driver. Upgrading the driver might fix these crashes. On my laptop, I have 10.3.3 installed, and I don't see this crash, but the newer driver, the better, probably. Even 10.3.3 is quite old I think. I put a warning for this problem into the latest version of Radium. Radium 3.9.6 is the latest version that had specific code to work around this bug, not 4.0.0.

coderofsalvation commented 7 years ago

updated script: https://drive.google.com/open?id=0B6Bbmgd8asH-OXplVHBrN3ZNQm8

changes:

Im actually very happy with Faust & PD-integration in radium. Instead of waiting for the developer to implement feature X, the community can drop preset-patches here instead.

kmatheussen commented 7 years ago

But global groove is a groove-trap in itself so to speak. (because if all instruments swing a bit different, that's actually when real groove kicks in, not when everything swings the same, but a lot of people don't get this concept.)

I'm thinking about adding a custom swing track. For instance something like this:

Example of standard 2:1 shuffle swing:

00  1          2/6 G
01              |
02             1/6
03              |
04     2       2/6
05              |
06             1/6
07              |
08     3       2/6
09              |
10             1/6
11              |
12     4       2/6
13              |
14             1/6
15              |
16  2          2/6 (automatically filled in, grayer color)
17              |  (automatically filled in, grayer color)
18             1/6 (automatically filled in, grayer color)
19              |  (automatically filled in, grayer color)
20     2       2/6 (automatically filled in, grayer color)

^   ^  ^        ^
|   |  |        |
|   |  |        + Swing
|   |  |
|   |  +  Beat
|   |
|   + Bar
|
+ Line

Commands:

G   =>   Defines global swing for this type of measure. A message will be shown if trying to define two global swing types for the same measure (not allowed).
|   =>   Same swing as the line above
x   =>   Stop repeating global or local swing

But this would force all tracks to have the same swing. I guess it's a start, but maybe later it would make sense to make it possible to assign swing types to tracks, so that you can play several swing types simultaneously in a block.

kmatheussen commented 7 years ago

Or better, every track can have a "swing text" sub track (similar to fx text, etc.), plus a block swing track (similar to BPM/LPB/etc.) that can be overridden.

Example of standard 2:1 shuffle swing:

C-3 2
--- -
D-3 1
--- -
F-3 2
--- -
G-3 1
--- -
G#3 2
--- -
B-3 1
--- -
C-3 2
--- -
    ^
    + Swing text
kmatheussen commented 7 years ago

A lot of preparation work has been done to support this now. It's coming soon. Any comments on the stuff above before I implement the GUI to support swing?

I'm planning to make a "master swing track" (one for each block), in addition to adding swing sub tracks to each normal track that can override the "master swing track".

Lykdraft commented 7 years ago

I'm planning to make a "master swing track" (one for each block), in addition to adding swing sub tracks to each normal track that can override the "master swing track".

Sounds very good. Especially the Global/Local Swing (or what you call Master/Sub) A little bit like NI Machine does it. The tables above look good as well...

kmatheussen commented 7 years ago

Done