Enable realtime audio and MIDI for openSUSE 11.1 RC

Hi :slight_smile:

using Linux for audio and MIDI production isn’t fine with my hardware, that’s why I need to test several Linux distros and even this RC. Because some people have similar troubles and I’m familiar with some essentials, e.g. which versions for audio and MIDI applications are recommended for usage, I wish to have a howto, so that users can carry it over to the stable release.

I need some help to figure out, how to do some things for SUSE. I will write what to do step by step, like it should be for a howto, but at some points I hope the community can help.

OPEN A TERMINAL

KDE 4.1 SUSE menu > Applications > System > Terminal > Terminal
or push Alt + F2 and run konsole or xterm

I will start with the fundament.

— THE REALTIME KERNEL —

GETTING NEEDED SOFTWARE AND THE SOURCES

Note: Browse http://www.kernel.org/pub/linux/kernel/projects/rt/ to see what version the latest realtime preemption patch is. Don’t use patches and kernels ex 2.6.26 without verifying, if the problems for realtime audio and MIDI with kernels ex 2.6.26 are fixed. Make sure that the version of the kernel source for the vanilla kernel from http://kernel.org/pub/linux/kernel/ is suitable to the version of the patch.

spinymouse@suse11-1:~> cd /usr/src/packages/SOURCES
spinymouse@suse11-1:/usr/src/packages/SOURCES> su
suse11-1:/usr/src/packages/SOURCES # zypper install patch make gcc
suse11-1:/usr/src/packages/SOURCES # wget http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.24.7-rt23.bz2 http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.7.tar.bz2

UNPACK THE SOURCES

It’s recommended to add to the directory’s name, that will include the patched source, the patch version and a identification that points to the self compiled kernel-rt version. In this case “rt23” and “spinymouse.1”. The archive with the vanilla kernel source and the patch can be used as sources for different self compiled versions.

suse11-1:/usr/src/packages/SOURCES # bunzip2 patch-2.6.24.7-rt23.bz2
suse11-1:/usr/src/packages/SOURCES # tar xvjf linux-2.6.24.7.tar.bz2
suse11-1:/usr/src/packages/SOURCES # mv linux-2.6.24.7 linux-2.6.24.7-rt23-spinymouse.1

PATCH THE KERNEL

suse11-1:/usr/src/packages/SOURCES # cd linux-2.6.24.7-rt23-spinymouse.1
suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # patch -p1 < …/patch-2.6.24.7-rt23

CHANGE THE VERSION FOR YOUR SELF COMPILED KERNEL

suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # vim Makefile

Push i and change “EXTRAVERSION = .7-rt23” to “EXTRAVERSION = .7-rt23-spinymouse.1”

Push Esc and than type :wq and enter

KERNEL CONFIGURATION

suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # zcat /proc/config.gz > .config
suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # zypper install ncurses-devel
suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # make menuconfig

Most settings I kept unchanged, here are the settings I made especially for my hardware and those that are needed for realtime with any hardware, the copied config I used is the default for
suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # uname -r
2.6.27.7-8-default

I changed the processor family from “Generic-x86-64” to “Opteron/Athlon64/Hammer/K8” and the maximum number of CPUs from “8” to “2”, to optimize it for my hardware, yours might differ.

The preemption mode has to be set from “No Forced Preemption (Server)” to “Complete Preemption (Real-Time)” and the timer frequency from “250 Hz” to “1000 Hz”, independently of the used hardware.

It might be better to change the default CPUFreq governor from “ondemand” to “performance”.

After you’ve edited all settings “Save an Alternate Configuration File” and exit.

I’m not sure if I have forgotten to do some settings or to install any dependencies, because I got a lot of warnings like
.config:90:warning: trying to assign nonexistent symbol RT_GROUP_SCHED

COMPILE THE REALTIME KERNEL

suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # make rpm

This may take a while … after less than 35 minutes I got

suse11-1:/usr/src/packages/SOURCES/linux-2.6.24.7-rt23-spinymouse.1 # ls /usr/src/packages/RPMS/x86_64
kernel-2.6.24.7rt23spinymouse.18default-1.x86_64.rpm

TO BE CONTINUED

I’m short in time right now. I’ll continue ASAP.

Cheers,
Ralf

Hi :slight_smile:

I won’t add this to my last post, but do a new one, because this is a another chapter.

For realtime audio it’s recommended to use ALSA and JACK. Paul Davis the principal author of JACK wrote, not to use JACK versions before 0.116 any more. You can install the actual version 0.116.1 from the Packman repository. See how to add the repository at Repositories/Packman - openSUSE-Community. We don’t have to install ALSA, it’s already installed.

Another needful application is QjackCtl, the version 0.3.4 is recommended by Rui Nuno Capela, the principal author of Qjackctl. This version can also be installed from the Packman repository. With the last versions of QjackCtl it’s possible to chose alias names, when using the ALSA MIDI to JACK MIDI bridge. I can’t say anything about the possibilities to restore connections by QjackCtl, maybe there is the need to use some tools, you need to have such tools for older versions.

At this point we only will enable realtime for the basic applications, there is a tool to restore audio sessions, but this isn’t the topic now. If you just need to restore audio and MIDI connections, than jack_snapshot can do this for audio connections and Qtractor for ALSA MIDI connections. Most MIDI applications are ALSA MIDI clients, some people think they are JACK clients, because of a misunderstanding.

Qtractor is available from the Packman repository and we need to compile jack_snapshot by ourself. Maybe there isn’t the need to have jack_snapshot any more and maybe it will be in a repository for the stable release.

INSTALL BASIC APPLICATIONS

You should join the audio communities to get information about sequencers, hard disk recording and stuff like that, please use a search engine and search the web. Qtractor might not be a good choice for a stable and comfortable workstation, but for some reasons I like to test Qtractor and I suggest that you do the same ;).

The package for the kernel we compiled is in the /usr/src/packages/RPMS directory, you can find it in the sub-directory for the architecture of your SUSE install, for me it’s /x86_64 and the source package is available in the /usr/src/packages/SRPMS directory.

To enable realtime we have to edit some scripts and to install the kernel, but first we will install the needed applications.

Launch a Terminal and here we go!

spinymouse@suse11-1:~> cd /usr/src/packages/SOURCES
spinymouse@suse11-1:/usr/src/packages/SOURCES> su
suse11-1:/usr/src/packages/SOURCES # zypper install chekinstall jack qjackctl qtractor
suse11-1:/usr/src/packages/SOURCES # wget http://tapas.affenbande.org/jack_snapshot/jack_snapshot-0.0.3.tgz
suse11-1:/usr/src/packages/SOURCES # tar xvf jack_snapshot-0.0.3.tgz
suse11-1:/usr/src/packages/SOURCES # rm jack_snapshot-0.0.3.tgz
suse11-1:/usr/src/packages/SOURCES # cd jack_snapshot-0.0.3
suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # zypper install gcc-c++ libjack-devel

When I was writing this post, I had to ignore that there wasn’t the needed libjack-devel. I guess we need this package to compile jack_snapshot, the other thing is, that I guess we can’t make a RPM by using checkinstall.

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # cd …
suse11-1:/usr/src/packages/SOURCES # wget http://jackaudio.org/downloads/jack-audio-connection-kit-0.116.1.tar.gz

Libjack is in this source. I don’t have the time to go on right now. Hopefully I can continue later today, I just want let you know, that this thread is still active. Any help is welcome :).

Cheers,
Ralf

Hi :slight_smile:

I won’t add this to my last post, but do a new one, because this is a another chapter.

For realtime audio it’s recommended to use ALSA and JACK. Paul Davis the principal author of JACK wrote, not to use JACK versions before 0.116 any more. You can install the actual version 0.116.1 from the Packman repository. See how to add the repository at http://opensuse-community.org/Repositories/Packman. We don’t have to install ALSA, it’s already installed.

Another needful application is QjackCtl, the version 0.3.4 is recommended by Rui Nuno Capela, the principal author of QjackCtl. This version can also be installed from the Packman repository. With the last versions of QjackCtl it’s possible to chose alias names, when using the ALSA MIDI to JACK MIDI bridge. I can’t say anything about the possibilities to restore connections by QjackCtl, maybe there is the need to use some tools, you need to have such tools for older versions.

At this point we only will enable realtime for the basic applications, there is a tool to restore audio sessions, but this isn’t the topic now. If you just need to restore audio and MIDI connections, than jack_snapshot can do this for audio connections and Qtractor for ALSA MIDI connections. Most MIDI applications are ALSA MIDI clients, some people think they are JACK clients, because of a misunderstanding.

Qtractor is available from the Packman repository and we need to compile jack_snapshot by ourself. Maybe there isn’t the need to have jack_snapshot any more and maybe it will be in a repository for the stable release.

INSTALL BASIC APPLICATIONS

You should join the audio communities to get information about sequencers, hard disk recording and stuff like that, please use a search engine and search the web. Qtractor might not be a good choice for a stable and comfortable workstation, but for some reasons I like to test Qtractor and I suggest that you do the same ;).

The package for the kernel we compiled is in the /usr/src/packages/RPMS directory, you can find it in the sub-directory for the architecture of your SUSE install, for me it’s /x86_64 and the source package is available in the /usr/src/packages/SRPMS directory.

To enable realtime we have to edit some scripts and to install the kernel, but first we will install the needed applications.

Launch a Terminal and here we go!

spinymouse@suse11-1:~> cd /usr/src/packages/SOURCES
spinymouse@suse11-1:/usr/src/packages/SOURCES> su
suse11-1:/usr/src/packages/SOURCES # zypper install chekinstall jack qjackctl qtractor
suse11-1:/usr/src/packages/SOURCES # wget http://tapas.affenbande.org/jack_snapshot/jack_snapshot-0.0.3.tgz
suse11-1:/usr/src/packages/SOURCES # tar xvf jack_snapshot-0.0.3.tgz
suse11-1:/usr/src/packages/SOURCES # rm jack_snapshot-0.0.3.tgz
suse11-1:/usr/src/packages/SOURCES # cd jack_snapshot-0.0.3
suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # zypper install gcc-c++ libjack-devel

When I was writing this post, I had to ignore that there wasn’t the needed libjack-devel. I guess we need this package to compile jack_snapshot, the other thing is, that I guess we can’t make a RPM by using checkinstall.

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # cd …
suse11-1:/usr/src/packages/SOURCES # wget http://jackaudio.org/downloads/jack-audio-connection-kit-0.116.1.tar.gz

Libjack is in this source. I don’t have the time to go on right now. Hopefully I can continue later today, I just want let you know, that this thread is still active. Any help is welcome :).

Cheers,
Ralf

I want to keep this bug and how to solve it separated from the last post, zypper install didn’t install the correct version of jackd.

There’s a bug. We could use jack.h from the sources directory /jack, but we can remove the source.

suse11-1:/usr/src/packages/SOURCES # rm jack-audio-connection-kit-0.116.1.tar.gz
suse11-1:/usr/src/packages/SOURCES # yast2

In YaST2

Software > Software Managment > Search: jack

right-click and chose Update for libjack0
right-click and chose Update for jack
left-click to install libjack-devel

Install everything, resp. abort or skip packages that aren’t available during installation. Now we might have some dependency inconsistencies, but YaST pretend that everything is fine.

Again:

I don’t have the time to go on right now. Hopefully I can continue later today, I just want let you know, that this thread is still active. Any help is welcome :).

I want to keep this bug and how to solve it separated from the last post, zypper install didn’t install the correct version of jackd.

There’s a bug. We could use jack.h from the sources directory /jack, but we can remove the source.

suse11-1:/usr/src/packages/SOURCES # rm jack-audio-connection-kit-0.116.1.tar.gz
suse11-1:/usr/src/packages/SOURCES # yast2

In YaST2

Software > Software Managment > Search: jack

right-click and chose Update for libjack0
right-click and chose Update for jack
left-click to install libjack-devel

Install everything, resp. abort or skip packages that aren’t available during installation. Now we might have some dependency inconsistencies, but YaST pretend that everything is fine.

Again:

I don’t have the time to go on right now. Hopefully I can continue later today, I just want let you know, that this thread is still active. Any help is welcome :).

A much better way (IMHO) if your serious about Linux audio is to use JAD
Comes with a realtime kernel and a load of audio apps.

Another us Studio64 though it’s not based on openSUSE

Geoff

Hi Geoff :slight_smile:

I’m a 64 Studio user. I use audio and MIDI realtime with 64 Studio 2.1 default install Etch, 64 Studio 2.1 upgraded to Lenny and Suse 11.0. Also I use own kernels and svn and cvs versions. I’m active in some Linux audio mailing lists. I can recommend 64 Studio, this is a very good distro, but you shouldn’t use JAD. A distro that once came with an experimental DE like E17 by default and obsolete Wikis IMO is invalid.

I wish to have a howto that quickly can be changed to fit to the stable release of 11.1, so that users without knowledge about the kernel and audio community can set up a workstation.

A lot of people need actual Linux and 64 Studio 2.1 is too old, even if it’s the best multimedia distro, no cp for libs is needed because packages are bad, like it is for Suse 11.0, but anyway, Suse is more state of the art and fit better to new hardware.

Cheers,
Ralf

PS:

This time I will add this to my last post, but Iceweasel don’t show the edit button.

After installing some LADSPA for the stable Suse install, there is the need to copy the libs from /usr/local/lib/ladspa to /usr/lib64/ladspa. This is something were it’s better to use 64 Studio, also the developers for 64 Studio join developer mailing lists and avoid to use unstable releases, like the jackd 0.109 disaster, while the audio people for Suse seems to be fine with bad versions. But on the other hand, if you need some new stuff, e.g. because of some functions that the old software doesn’t support or because your hardware isn’t fine, even if it’s just the network, while audio and MIDI are fine, you better use a for audio more unstable distro like Suse.

I have the concern to get a howto for Suse 11.1 audio, that’s up to date and takes care about the versions of the used applications. Because I’m more familiar with Debian audio I need some help.

I don’t have much time and the stable release will come out soon, also I join mailing lists to do remarks about issues that only some professionals can notice, e.g. the delay for JACK transport and jitter or what is needed for some kind of usage, but missing for Linux, e.g. the aux problematic case. Nothing of this should concern this thread, excepted of some tips, e.g. that there is a first good reverb available, if you set up jconv.

I’m not sure if I’ll have the time to do this, before 11.1 will be released.

Are here some audio and MIDI users and developers? Please let me know this off-thread by a PM.

spinymouse@suse11-1:~> cd /usr/src/packages/SOURCES/jack_snapshot-0.0.3
spinymouse@suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3> su

Hopefully it will be possible to get an environment with compiler basics by YaST2 of the stable release, it’s not working for my RC version, so I cat the source.

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # cat jack_snapshot.cc
[snip]
#include <iostream>
#include <fstream>
#include <cerrno>
[snip]

YaST2 provides to search for “RPM ‘Provides’”, because zypper install libskstream-devel causes trouble, I installed the package by YaST2, also I installed libboost_iostreams_1_36_0 and boost-devel. Included files only can be listed after packages are installed and when I try to install, YaST2 often fails, anyway, the iostream header might be included to on of those devel packages.

I won’t waste time in searching for the dependencies, but go on with enabling RT. Can anybody help with the following?

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # make
g++ jack_snapshot.cc -o jack_snapshot pkg-config jack --libs
jack_snapshot.cc: In function ‘int main(int, char**)’:
jack_snapshot.cc:21: error: ‘exit’ was not declared in this scope
jack_snapshot.cc:35: error: ‘exit’ was not declared in this scope
jack_snapshot.cc:113: error: ‘strncpy’ was not declared in this scope
make: *** [jack_snapshot] Error 1

I’m writing how to go on with limits.conf etc. and I’ll post it later.

Very strange, I never had so much troubles with enabling RT and compiling, even with testings and release candidates. My favourite editors aren’t fine when they are started by root. I guess I’ve to search the forums to solve bugs and not only to pseudo-solve things for this thread.

By the way, when I started this thread, it was possible to delete and edit a post, now this isn’t possible any more, I can’t add something to my last post.

It’s possible to edit this post now.

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # yast2

Security and Users > User and Group Management > select the user for realtime audio and MIDI and left double-click > tab Details > Additional groups and add “audio” > OK > OK > close YaST2

Check if the user is member of the group “audio”.

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # id spinymouse
uid=1000(spinymouse) gid=100(users) groups=17(audio),16(dialout),33(video),100(users)

Run vim

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # vim /etc/security/limits.conf

At the empty line before “# End of file” add:

@audio - rtprio 99
@audio - memlock unlimited
@audio - nice -19

This are the settings you can find at the JACK homepage, some people might vary these settings, e.g. for the nice value, but realtime means realtime, any nice values should be esoteric.

Push i and paste the entries, push Esc and type :wq

Change to the directory with your kernel-rt and install it.

suse11-1:/usr/src/packages/SOURCES/jack_snapshot-0.0.3 # cd /usr/src/packages/RPMS/x86_64
suse11-1:/usr/src/packages/RPMS/x86_64 # rpm -iv kernel-2.6.24.7rt23spinymouse.18default-1.x86_64.rpm

Now we have to edit the menu.lst for the boot loader. Your menu.list should be in /boot/grub, my menu.lst isn’t in this place.

Once you have seen a menu.lst like the following, you’ll easy understand the concept.

suse11-1:/usr/src/packages/RPMS/x86_64 # cat /mnt/suse11.0_sata/boot/grub/menu.lst

Modified by YaST2. Last modification on Fri Dec 5 00:05:59 CET 2008

default 0
timeout 8
##YaST - generic_mbr
#gfxmenu (hd0,7)/boot/message
##YaST - activate

###Don’t change this comment - YaST2 identifier: Original name: linux###
title openSUSE 11.1 - 2.6.27.7-8
root (hd0,7)
kernel /boot/vmlinuz-2.6.27.7-8-default root=/dev/disk/by-id/ata-Maxtor_6L080P0_L24K9GLG-part8 resume=/dev/sdb7 nosplash showopts vga=0x317
initrd /boot/initrd-2.6.27.7-8-default

###Don’t change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe – openSUSE 11.1 - 2.6.27.7-8
root (hd0,7)
kernel /boot/vmlinuz-2.6.27.7-8-default root=/dev/disk/by-id/ata-Maxtor_6L080P0_L24K9GLG-part8 showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe vga=0x317
initrd /boot/initrd-2.6.27.7-8-default

title 64 Studio 2.1 Lenny
kernel (hd1,7)/boot/vmlinuz-2.6.21-1-multimedia-amd64 root=/dev/disk/by-label/studio ro nosplash vga=791
initrd (hd1,7)/boot/initrd.img-2.6.21-1-multimedia-amd64

title RT - SUSE 11.0 - 2.6.25.18-0.2-rt
kernel (hd1,5)/boot/vmlinuz
initrd (hd1,5)/boot/initrd

title RT - SUSE 11.0 - Failsafe
root (hd1,5)
kernel /boot/vmlinuz root=/dev/disk/by-id/scsi-SATA_SAMSUNG_HD321KJS0MQJ9AQ308387-part6 showopts ide=nodma apm=off acpi=off noresume edd=off x11failsafe
initrd /boot/initrd

title 64 Studio 2.1 Etch, kernel 2.6.24.7-rt17-rev01
root (hd1,12)
kernel /boot/vmlinuz-2.6.24.7-rt17-rev01 root=/dev/disk/by-label/DAW2.1 ro vga=791 splash=silent
initrd /boot/initrd.img-2.6.24.7-rt17-rev01

title 64 Studio 2.1 Etch
root (hd1,12)
kernel /boot/vmlinuz-2.6.21-1-multimedia-amd64 root=/dev/disk/by-label/DAW2.1 ro vga=791 splash=silent
initrd /boot/initrd.img-2.6.21-1-multimedia-amd64

title 64 Studio 2.1 Etch, (single-user mode)
root (hd1,12)
kernel /boot/vmlinuz-2.6.21-1-multimedia-amd64 root=/dev/disk/by-label/DAW2.1 ro vga=791 splash=silent single
initrd /boot/initrd.img-2.6.21-1-multimedia-amd64

title 64 Studio 2.1 Etch, memtest86+
root (hd1,12)
kernel /boot/memtest86+.bin

You need to copy your default entry for Suse 11.1 RC, in this example it’s

title openSUSE 11.1 - 2.6.27.7-8
root (hd0,7)
kernel /boot/vmlinuz-2.6.27.7-8-default root=/dev/disk/by-id/ata-Maxtor_6L080P0_L24K9GLG-part8 resume=/dev/sdb7 nosplash showopts vga=0x317
initrd /boot/initrd-2.6.27.7-8-default

For this copy you have to edit the title, kernel and initrd to boot the kernel-rt instead of the regular kernel. Run vim and after i edit and finish with Esc and :wq. List /boot to get information about the kernel and initrd. I can’t find an initrd for my self compiled kernel. I wrote a howto for 64 Studio to patch the same kernel-rt and it is fine, see the 64 Studio user mailing list archive. I don’t know what has to be done for Suse 11.1 RC. The new menu.lst should differ, similar to the following menu.lst, but initrd should be there and not commented out like it is for me.

Until now I didn’t change the title for the new entry, but that doesn’t matter.

suse11-1:/usr/src/packages/RPMS/x86_64 # ls /boot
backup_mbr symsets-2.6.27.7-8-default.tar.gz
boot symtypes-2.6.27.7-8-default.gz
boot.readme symvers-2.6.27.7-8-default.gz
config-2.6.24.7-rt23-spinymouse.1-8-default System.map-2.6.24.7-rt23-spinymouse.1-8-default
config-2.6.27.7-8-default System.map-2.6.27.7-8-default
grub vmlinux-2.6.27.7-8-default.gz
initrd vmlinuz
initrd-2.6.27.7-8-default vmlinuz-2.6.24.7-rt23-spinymouse.1-8-default
message vmlinuz-2.6.27.7-8-default
suse11-1:/usr/src/packages/RPMS/x86_64 # cat /mnt/suse11.0_sata/boot/grub/menu.lst

Modified by YaST2. Last modification on Fri Dec 5 00:05:59 CET 2008

default 0
timeout 8
##YaST - generic_mbr
#gfxmenu (hd0,7)/boot/message
##YaST - activate

title openSUSE 11.1 - 2.6.27.7-8
root (hd0,7)
kernel /boot/vmlinuz-2.6.24.7-rt23-spinymouse.1-8-default root=/dev/disk/by-id/ata-Maxtor_6L080P0_L24K9GLG-part8 resume=/dev/sdb7 nosplash showopts vga=0x317
#initrd /boot/initrd-2.6.24.7-rt23-spinymouse.1-8-default

###Don’t change this comment - YaST2 identifier: Original name: linux###
title openSUSE 11.1 - 2.6.27.7-8
root (hd0,7)
kernel /boot/vmlinuz-2.6.27.7-8-default root=/dev/disk/by-id/ata-Maxtor_6L080P0_L24K9GLG-part8 resume=/dev/sdb7 nosplash showopts vga=0x317
initrd /boot/initrd-2.6.27.7-8-default
[snip]

Any ideas why there is no initrd? Mkinitrd is installed.

Cheers,
Ralf