File: README

package info (click to toggle)
alsadriver 0.2.0-pre8-3
  • links: PTS
  • area: main
  • in suites: slink
  • size: 2,808 kB
  • ctags: 6,550
  • sloc: ansic: 43,490; sh: 916; makefile: 759; perl: 54
file content (134 lines) | stat: -rw-r--r-- 4,629 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

              Advanced Linux Sound Architecture (ALSA) - Sequencer
              ====================================================
              http://www.inter.nl.net/users/F.K.W.van.de.Pol/alsa/


By Frank van de Pol, F.K.W.van.de.Pol@Inter.nl.net

ALSA Sequencer 
==============

This directory contains a prototype for the ALSA Sequencer. Beware that this
is *development* code. My motivation for writing this prototype is to get a
proof of concept and feasibility for this project. The eventually
(hopefully) working prototype can be used for discussing sequencer APIs.

Current status (last updated 31 Aug 1998):
=========================================

* Allows scheduling and routing of both real-time events and events with a
  midi tick timestamp. The sequencer uses tempo (us/beat) and specified PPQ
  resolution (ticks/beat) to calculate the ticks from time.

* Both user-land and kernel clients can connect, send events, receive events
  and communicate directly with the sequencer (ioctl()). Reads and writes
  for user-land clients can be batched, blocking io and select() is
  supported. Kernel clients can directly enqueue data to the priority queue
  and use a call-back for incoming data.

* A simple timer driver for the system clock (100Hz) is provided
  (snd-seq-systimer). 

* The time and song position for the queues are maintained by a software
  timer. It can be started and stopped by sending SND_SEQ_EVENT_START and
  SND_SEQ_EVENT_STOP messages to the timer port (client 0, port 0).

* Support for fixed length events and variable length events (used for
  system exclusive data)

* proc interface (/proc/asound/sequencer-*) to see what clients have
  registered, get memory status info, queue status etc.

* Muliple independent queues can be used to run different time/tempo
  independend application. (ie. multi-user sequencing)

* Included sample clients (in the test/seq/ directory):

  - readtime    : display information on the sequencer timer.

  - usertest1   : decoding of received events to text

  - usertest2   : a simple user-land driver that plays received events to
                  the MIDI output port (/dev/sndmidi00). It uses Round-Robin
                  scheduling to get reasonable performance. Tested with a
                  Gravis Ultrasound MAX card and external Yamaha XG 
                  synthesizer.
                  It supports the following events:
                    - SND_SEQ_EVENT_NOTEON
                    - SND_SEQ_EVENT_NOTEOFF
                    - SND_SEQ_EVENT_PGMCHANGE
                    - SND_SEQ_EVENT_PITCHBEND
                    - SND_SEQ_EVENT_CONTROLLER
                    - SND_SEQ_EVENT_START       (send real-time start)
                    - SND_SEQ_EVENT_STOP        (send real-time stop)
                    - SND_SEQ_EVENT_CONTINUE    (send real-time continue)
                    - SND_SEQ_EVENT_SYSEX

  - playmidi    : a player for standard midi files (SMF). It is based on the
                  readmidi library, so only type 0 midi files are supported. 
                  Output is send to client 1 (hard coded), so either
                  usertest1 or usertest2 should be started first.

  - kernel-client1 
                : a test for the kernel API, just bounces events to next
                  client

  - kernel_client_midi
                : a kernel API test which implements a MIDI driver (similar
                  like the usertest2 driver)

  - kernel_client_midi2
                : registers a MIDI driver using the midisynth mid-level
                  driver. 


Installation:
=============

- Compile the sequencer:
     (directory alsa-driver/kernel/seq) 
     $ make
- make sure ALSA is loaded
- load the sequencer (need root privileges)
     $ insmod snd-seq.o
- load the timer (need root privileges)
     $ insmod snd-seq-systimer.o

- Compile the clients:
     (directory alsa-driver/test/seq)
     $ make

- run the clients
     start our synth driver:
     $ usertest2 (preferably as root)

     and in some other session start playback of a MIDI file (make sure your
     synth gear is switched on and the faders on your mixing desk are open..)
     $ playfile pick_up_the_pieces.mid
 
- Have fun. 
     


Todo:
=====

Many things.... 

- kill some bugs
- work out client & port registration/lookup
- add system announcements
- add open on demand for midisynth
- clean events on client termination
- add synchronization
- add more clients



References on the web:
======================

ALSA:            http://alsa.jcu.cz/
ALSA Sequencer:  http://www.inter.nl.net/users/F.K.W.van.de.Pol/alsa/