Jump to content


+AtariAge Subscriber
  • Content Count

  • Joined

  • Last visited

Everything posted by k-Pack

  1. Thanks, looks like the program is going to be helpful. I had the microKorg hooked up and was watching the MIDI output as I edited patch parameters. I found the data sheet for the chip in the midiPlus - miniEngine USB and will try to edit patch parameters(maybe?) from MIDI Music System. Lots of plains. Right now low expectations of completion(anytime soon). If I make any changes to your program I'll let you know before I post.
  2. I got a lot of information from MIDI Association web sight. Home (midi.org)
  3. Been watching for pre2000 rack mount systems. I put a Kawai K1R in my rack about 2 years ago. Haven't had much the time to play with it.
  4. Is there any MIDI monitor software. I want to read the MIDI data stream and then display the MIDI commands as they are played. It needs to be MIDI Max compatible. Later, I think I might want to be able to read the data stream and convert control changes to Voice tracks - compatible with MIDI MUSIC Software. Anyone out there thinking this might be useful?
  5. Of course, after an afternoon of experimenting with an Arduino and KY-040 Rotary Encoder Board, the question of how to use a Rotary Encoder attached to an ATARI joystick port became an intriguing ponderance. After all, the Atari can read a trackball and mouse containing two encoders. How hard can it be to read one? For this first experiment KISS was an objective. The objective was to be able to read the input and determine if the knob was being turned in a CW direction or CCW direction. Also, the encoder has a switch that is activated when the knob is pushed in. A simple working BASIC program should yield enough information for development of more advanced methods of use. First I'll explain getting an encoder hooded up to the joystick port. Then a short explanation of how the encoder works and how it will effect the joystick port reading. This should make the example program a little easier to understand. Hook-up. I started with a bunch of KY-040 Rotary Encoder Boards for the Arduino. This board has the encoder and 3 pull down 10K resisters required by the Arduino. So my first encoder was de-soldered from the board and pins were added for insertion into the breadboard. (I just received an order of cheep EC11 encoders. They are not as beefy. They will work and no de-soldering.) The wiring is easy if you have an old joystick cable. Joystick Pin1 - Clock Pin2 - Data Pin6 - Pushbutton Pin8 - Ground for the three switches Bread boards and hookup wires were used in this first attempt. Future needs will definitely dictate further hardware improvements. The Encoder. Search the net for Rotary Encoder to gain a full explanation of how they work. Then there is this way of thinking about it….. The encoder has 2 switches that are offset to achieve a slight difference in activation time. Before the knob is rotated both switches are off. Turn the knob one click and one switch turns on before the other. Turn the knob the other way and the other switch turns on before the one switch. Take a look at these two equations. X = A - B - C X = A - C - B When the calculation is complete both equations are equal. BUT…After the first subtraction the values will be different, if B is not equal to C. If you can determine the value of X after the first subtraction you can state the direction of rotation. What if- A - the neutral position = 15 B - Clock Switch = 1 C - Data Switch = 2 The STICK(n) values of the logic table turn out to be: Clock OFF ON Data/ OFF 15 14 ON 13 12 Since only one switch can be first, the result of 14 or 13 will tell you which direction the knob was turned and the program can act accordingly. There are timing problems if the program runs slowly. (Kind of like BASIC slow) Turn the knob fast enough and you run the risk of jumping from 15 to 12 before polling for the value again (I can see a DLI routine in my future). As it happens the two rotary switches are tied to pins that control bits 1 and 2 of the Joystick port. 1 being the clock and 2 being data switch. Atari sets the joystick pins to HIGH for initial value of 15. Turning on a switch grounds the pin to LOW and the value of the bit is subtracted from 15. (It’s a reverse logic situation where switch ON = LOW.) The push knob switch is wired into the trigger pin and operates just like the trigger button and has no effect on the STICK(0) values. Example Software: 1 REM ROTARY ENCODER-PROOF OF CONCEPT 2 REM 3 REM BY Kevin Packard 5/2021 4 REM 5 REM EC11 encoder with switch, hooked 6 REM to Joystick Port1. 7 REM PIN 1 -> Clock 8 REM PIN 2 -> Data (DT) 9 REM PIN 8 -> Both ground pins 10 REM PIN 6-> Trigger 11 REM 100 LAST=15 110 SOUND 0,0,0,0 120 IF STRIG(0)=0 THEN SOUND 0,60,10,15 130 S1=STICK(0) 140 IF S1=15 THEN GOTO 170 150 IF S1=14 AND LAST=15 THEN ? "CW" 160 IF S1=13 AND LAST=15 THEN ? "CCW" 170 LAST=S1 180 GOTO 110 The program displays the direction of rotation and makes a sound when the push button is activated. There's more REM then program lines. 100 sets up neutral value of S1 110 turns off sound 120 checks trigger and makes sound if pushed 130 Gets the present value of STICK(0) - Works best if polled once/cycle. 140 S1 in neutral position?(no rotation) save some time goto line 170 150 Value change of S1 prints CW to screen 160 Value change of S1 prints CCW to screen 170 Changes last to S1 - Keep lines 150 and 160 from execution until LAST reset to 15 180 Go Back to 110 and loop until break key pressed. Also note that there is no action taken if S1 and/or LAST = 12. ROTARY01.atr What next? Does the world really need another Etch-A-Sketch program. I think not. How about a microKorg patch editor based on the MIDI control codes and operating in the Diamond GOS environment . Now that's a definite maybe.
  6. Found these Lynx related files on one of my old back-up SD cards. Most likely they were down loaded from Compuserve. Thought you may find them interesting, if you haven't read them already. Atari Gaming Gazette by STAR LINX BBS DEC 1992 Premiere Issue AGG_1292.TXT JAN 1993 Issue #2 AGG_0193.TXT FEB 1993 Issue #3 AGG_0293.TXT LYNXAL.TXT by Atari Corporation - Brief Descriptions of Atari Linx Games LYNXAL.TXT LYNREV.TXT Lynx Game Reviews by Robert Jung LYNXREV.TXT LYNXTIPS. TXT - Game tips and cheats for Lynx games LYNXTIPS.TXT
  7. A couple of days ago I grabbed the microKorg owner's manual to read on the throne. I happened to open to Page 61 - Assigning control changes(CC). It says you can assign numbers to the principal parameters. The edit menu section on the microKorg is shown with the principal parameters highlighted. You can assign the CC# or just use the defaults that are assigned to those parameters. These are listed in the Table on page 56. The Control 2 values when OSC1-WAVE = DWGS are within the table on page 57 and the names for the DWGSs are listed on page 20. (Digital Waveform Generator System(DWGS)) I thought it would be handy to have a table of the default CC# that would match up the layout on the Korg. This PDF contains a table for the SYNTH commands and parameter changes. I hope it can be of use as a scratch pad when programming control changes from the Atari. MicroKorg - CC defaults.pdf The sheet wasn't of much use for this small example Atari BASIC program. It uses CC#77 to change the OSC1-WAVE synth parameter. It will change the wave to Saw, Square, Triangle, Sine, DWGS, or Noise, after the computer menu number is entered. A CC command requires three bytes of data to be sent to the synth. The first is the command type(176) + channel-1. The second is the controller number. The last being the setpoint; 0-127 but data can be used however the synth is programmed. In this example Atari BASIC program an array is filled with the CC setpoints that will change the wave form on the microKorg(30020) and then the I/O channel 1 is opened for the M: device(32010-32030). A menu is displayed on screen. Input the number of the desired wave and the command will be sent(260). Play the microKorg keyboard and you should notice some change in the patch. (Do I have to make mention that the microKorg has to be connected to the Atari through a MidiMax compatible interface?) Changing the wave on patches does make some surprising changes to the sound. Any changes that are made will not be permanent unless you save the patch. Keep the write protect on while experimenting and you shouldn't have a problem. CC77.BAS 1 REM microKorg OSC1-Wave CC Code 77 2 REM by Kevin Packard 4/22/2020 3 REM 4 REM Some panel knob/keys can have 5 REM a CC# assigned to them. This 6 REM program can change OSC1/Wave, 7 REM which effects the patch. 8 REM 9 REM Requires MIDIMAX type interface 10 REM MicroKorg and M: device. 12 REM 100 GOSUB 30000 200 GRAPHICS 0:? 205 ? "WAVE TYPE:" 210 ? " 1. SAW":? " 2. SQUARE":? " 3. TRIANGLE":? " 4. SINE":? " 5. DWGS":? " 6. NOISE":? 215 TRAP 220 220 ? "INPUT WAVE TYPE >";:INPUT X 230 IF X<1 OR X>6 THEN 220 260 PUT #1,CMD:PUT #1,77:PUT #1,WAVE(X) 270 GOTO 200 29999 REM set up parameters 30000 GRAPHICS 0 30010 CMD=176+0:REM CC+channel-1 30020 DIM WAVE(6):WAVE(1)=0 30030 WAVE(2)=18 30040 WAVE(3)=36 30050 WAVE(4)=54 30060 WAVE(5)=90 30070 WAVE(6)=108 32010 CLOSE #1 32020 OPEN #1,13,0,"M:" 32030 XIO 40,#1,0,0,"M:" 32040 RETURN ATR contains DOS 2.5, the Autorun.sys sets up the M: device, and CC77.bas KORGCC.atr When you BREAK from the program be sure to "CLOSE #1" before trying to access the disk drive.
  8. I'm 99% sure it would. If your interface works with MIDI Music System or MIDI Track III then it should work.
  9. The last time I tried to simulate wind chimes was by outputting MIDI data through an RS-232 port on the 850 Interface(Rn:). A8 Wind Chimes - Gentle Breeze in C minor - Out of the Pack - AtariAge Forums Now that I have the Wizztronics MIDIMAX, I can hook up a MIDI synthisizer to it and output MIDI data using Atari BASIC and the MIDI device handler(M:). There were only a couple of lines in the original code that needed to be changed to open a channel to the M: device. But, I wanted the option to change the maximum random value for the velocity and delay loop times during program execution. The use of Atari paddles will hopefully help to make those adjustments for wind gusts and intensity. You decide after listening to this recording of the PC*Bells from the Yahama TG33. MidiWindChimes.mp3 The program MIDIWIND is a simple BASIC program. To use the MIDI Windchimes program: 1 Make the connections between the Atari8, MIDI interface, and synthisizer. Paddles in port 1. 2 Boot up computer with a disk with your choice of DOS and M: device handler(AUTORUN.SYS) 3 RUN "Dn:MIDIWIND.BAS" (The program will start sending MIDI data on Channel 1(change line 30010 for different channels) 4 Adjust the Paddles to change the maximum values for velocity and delay time. (the paddles are checked every cycle of the delay loop. To compensate for the jitter of the joystick reading, the joysticks values have to change by 3 before new max values are set.) This program is not optimized for your MIDI synth, its not for mine. Noteoff commands are not used so it will work best for percussion type instruments. In line 3200 the root note for the pentatonic scale is defined. Sequential notes are calculate by adding the semitones to produce a minor scale. 60 = C4, 72 = C5. 1 REM MIDI WIND CHIMES v2.0 4/7/2021 2 REM by Kevin Packard 3 REM 4 REM simulates windchimes in Cmin. 5 REM Randomly selects tone, velocity 6 REM and duration. Max VEL and DELAY 7 REM are set using PADDLE(0)&(1). 8 REM 9 REM Requires MIDIMAX type interface 10 REM paddles, MIDI Sound device, 11 REM and loaded M: device handler. 12 REM 13 REM 100 GOSUB 30000:REM set up variables 200 REM start of main loop 210 MIDINOTE=TONE(INT(RND(0)*6)+1) 220 POSITION 3,9:? #6;"MIDI NOTE = ";MIDINOTE;" " 230 VEL=INT(RND(0)*(P0*0.5))+10 240 POSITION 4,11:? #6;"VELOCITY = ";VEL;" " 250 DELAY=INT(RND(0)*P1) 260 PUT #1,CMD:PUT #1,MIDINOTE:PUT #1,VEL:REM output midi data 300 REM delay loop / read paddles 310 FOR X=0 TO DELAY 320 POSITION 1,13:? #6;"DELAY COUNT = ";DELAY-X;" " 330 IF ABS(228-PADDLE(0)-LASTP0)<3 AND ABS(228-PADDLE(1)-LASTP1)<3 THEN 390 340 P0=228-PADDLE(0):P1=228-PADDLE(1) 350 LASTP0=P0:LASTP1=P1 360 POSITION 2,17:? #6;"P0-MAX VEL =";P0;" " 370 POSITION 2,19:? #6;"P1-MAX DELAY =";P1;" " 380 POKE 77,0:REM reset atract mode 390 NEXT X 400 GOTO 200 29999 REM set up parameters 30000 GRAPHICS 17:POSITION 2,4:? #6;"MIDI WIND CHIMES" 30010 CMD=144:REM noteon command+channel-1 30020 DIM TONE(6):TONE(1)=60+12 30030 TONE(2)=TONE(1)+3 30040 TONE(3)=TONE(2)+2 30050 TONE(4)=TONE(3)+2 30060 TONE(5)=TONE(4)+3 30070 TONE(6)=TONE(5)+2 30080 P0=50:P1=P0:LASTP0=P0:LASTP1=P0 32010 CLOSE #1 32020 OPEN #1,13,0,"M:" 32030 XIO 40,#1,0,0,"M:" 32040 RETURN Program and M: device (AUTORUN.SYS) MIDIWIND.atr
  10. It has been my impression that the SIO port uses the Pokey chip for timing and that getting sound out of it while transferring data will be difficult if not next to impossible. I've experimented with the Arduino/MIDI shield that works like the MIDIJOY but uses the Cassette Motor control for timing. I got it to the point that the Atari could play one note and then used multitrack recording software to combine them. an MP3 example can be found here. A journey to Bach's Invention 1 and other miscellaneous updates - Out of the Pack - AtariAge Forums.
  11. Note: When using this method it is not advisable to use note durations shorter then ^2 clocks. The Pn,x is not resetting the notes to off when such short duration are used to turn the note on. Not sure why but I didn't notice the effect until I started to play the Organ patch.
  12. These two MP3 files are the result of experiments to program rhythm guitar and Ukulele tracks into the MIDI MUSIC SYSTEM software on the Atari 8bit. The cords were programed into voice tracks and then called when needed. The MMS files were recorded with a MIDIPLUS - miniEngine USB with reverb set to 81. Sound 24, Acoustic Guitar(Nylon) seemed to be the closest match to my ukulele. "Drunken Sailor" used only down strums and both lead and rhythm tracks used Sound 24. The Drunken Sailor.mp3 "On Top of Old Smokey" used an up-down strumming pattern and a harmonica (Sound 22) for the lead. On Top of Old Smokey.mp3 I've been wanting to try and reproduce a couple of short music tunes I used as guitar pickn' and strumn' exercises from way-back-when. After inputting the notes into MMS there seemed to be little resemblance to what I remember playing. After rethinking the problem, a different approach was required. Looking through my archived MMS files, it appears that 99.9% are files that started as AMS and converted to MMS files. I spend many an hour changing virtual instruments to make for a pleasing playback. Without much in the way of MMS examples I never considered how adding Control Change(CC)messages could influence the music. This list of MIDI CC definitions has been helpful. Not all MIDI instruments will respond to the entire list. The MIDI Implementation Cart for your instruments should have them listed. But then not all MIDI instruments come with MIDI Implementation Charts. http://www.nortonmusic.com/midi_cc.html CC command consists of 3 bytes of data. 1. Command byte - 176 + (Channel # - 1) 2. Controller number (see CC chart) 3. Setting of 0 to 127. In MMS the CC command is achieved with the Pn,x. The P is for program change, n =control number and x=setting An examination of these MMS files may help where my words are inadequate. cordtest.atr The use of the HOLD PEDAL(or sustain pedal) controller #64 makes it possible to turn on HOLD, play a quick succession of notes for the cord, pad the duration with rests, then turn off the hold. A couple of ukulele songs were inputted with the lead in voice one and the rhythm in voice two. Each was sent to separate midi channels to keep the lead notes from being effected by the CC command. The Cords were programed in voices starting at V50. The First command is to turn on the sustain - P64,127. The cord's notes are then inputted with very short durations. ^1 is the shortest duration. The manual calls this one clock value. Clock values for notes are listed on page 22 of the MMS manual. Pad the duration to the note's clocks. Finish tne Jump with RET. Where 4 string durations of ^1 = ^4 you would need R^44 to for a Quarter note. Where 4 string durations of ^3 = ^12, you would need R^12(RS) for an Eight note. Timing is everything. I prefer to keep the cord durations within the jumps as short as possible and complete the cord play time by adding rests at the calling Voice. Strum and hold ukulele "C" cord for Quarter note V1 V50 J50 Jump to voice 50 P64,127 Turn on sustain G4^2 Play notes C4^2 E4^2 C5^2 R^16 1/8note=^24 RET Return RE 2-1/8 = 1/4 P64,0 Sustain off Continue…….. A Voice had to be programed for each direction of the strum; up or down. "On Top of Old Smokey" was programed to strum down-down-up-down. It is not necessary to turn off the sustain when strumming the same cord. You will want to turn off the notes of the old cord before strumming a different one. Now, so many CCs and so little time.
  13. This is from the Diamond 3.0 GOS user manual on page 8. "Command Line Files with a COM extender are considered to be Command Line files. When executing such files you will be asked to enter various parameters. This allows various options to be passed from the DeskTop to another program. If you do not need any parameters to be entered then simply press RETURN and the program will be executed as if it were a normal APP. The command line used by Diamond is not the same as the one used by SpartaDOS, however Diamond's command line is SpartaDOS compatible when SpartaDOS is active." I don't know of any reason why the command line can not be used with the FujiNet commands but it will be some time before I can experiment. If anyone has had any experience with the Diamond command line and FujiNet COMs please consider sharing them with me/us.
  14. I have yet to input music into the MIDI MUSIC SYSTEM (MMS) software and have it correct the first play through. I can hear the error as it is played but MMS gives no indication of which measure it might be in. One solution requires an Arduino, MIDI shield with a THRU port, and numeric display. The plan was to program a MMS voice to out put a MIDI command once per measure on an unused channel and have the Arduino count the number of times the command was received. I really didn't put two much effort into figuring out the best way to accomplish this. It worked with what parts were avalible with as little time as possible. It was one of those projects not worthy of documentation until it took me longer to find my notes then to rebuild and use. Now I'll at least have this for reference. ------------------------------------------------------------------------------------------------------------- On the ATARI The MMS software was easy to program. A loop was made to repeat one measure with a couple of SOUNDn commands and channel 16 to output a 0 or 1 to toggle the input to the arduino. The below example is in 4/4 time. For this piece of music, VOICE 20 was programed with the following information. Be sure to {A}SSIGN VOICES from the main menu to the your MIDI channel of choice. Repeat X86 Sound #1 RS Sound #0 RE. RH. EndR The Sound #n command is a 2 byte command. Simple and fast. The Arduino will receive the command and will turn on a digital pin when 1 and off when 0. The REST is a 1/16 beat and gives the display enough time to register a change in pin status. The rest of the Rests make up the 4 beat measure. -------------------------------------------------------------------- The Arduino First prototype In this case the Arduino is an interface between MMS and a digital counter. Turn on pin three and the optocoupler grounds the counter plus lead. Turn off pin 3 and counter is incremented. A push button is also provided to reset the counter. The LED on pin 2 is an indicator that the Arduino is receiving the measure pulse. /* MMS Measure Counter * * Working with MIDI MUSIC SYSTEM it is often hard to know which * measure you are listening to while editing a song. An Arduino can be * programed to accept MIDI data on Channel 16 that will cause a counter * increment. A Voice channel in the MMS can be programed to output * a signal to reset or increment the display of a $1.00 step meter. * * This program will look for a midi program change command on channel * 16 (207). Then read data * 0 for off * 1 for count * */ int ledPin = 2; int countPin = 3; byte midiCommand = 0; byte midiData = 0; byte programChange = 207; //number representing channel and Command // 192(program change)+15(channel 16) void setup() { pinMode(ledPin,OUTPUT); pinMode(countPin,OUTPUT); digitalWrite(ledPin,LOW); digitalWrite(countPin,LOW); Serial.begin(31250); } void loop() { while(Serial.available()<1){}//wait for data midiCommand = Serial.read(); if (midiCommand == programChange){ // Note On - Channel while(Serial.available()<1){}//wait for data midiData = Serial.read(); switch (midiData) { case 0: // Turn off pins digitalWrite(ledPin,LOW); digitalWrite(countPin,LOW); break; case 1: // increment counter digitalWrite(countPin,HIGH); digitalWrite(ledPin,HIGH); break; } } } ------------------------------------------------------------------------------------------ The counter and display unit The counter/display is left-over from a challenge to find something in the dollar store to hack. It turned out to be a step meter. The step meter has two swiches. A sensor switch that is a weighted spring that makes contact as your hips sway and a reset button. If you have a cheep step meter, you can carefully open the case. The case holds the internal parts together and will need to reassemble it. Solder wires to replace switches with external switches and reassemble. Now you should be able to short the wires to see which does what. One pair resets the counter and the other increments the counter. Build the circuit with the Arduino, modified step meter, reset button, 2-330ohm resisters, LED and optocoupler IC. I put it on a prototype board cause I knew it would get used again (and again). The only reason you need the circuit is for the use of the step meter. You may be better off using another display method. --------------------------------------------------------------------------------------------------------------------------------------- Connect your Atari-MIDI interface MIDI Output to the MIDI Input on the Arduino shield and the Arduino Shield THRU to your synth MIDI Input. Press the reset button and start the music. As you listen to the music jot down the measure numbers when you hear something unexpected. Now you have a good starting point for searching out the cause of the discord. Find your own method for counting measures. What ever you come up with will probably be better then my old PLAY-MEASURE-1,10 and PLAY-MEASURE-10,20 and etc. (to the end of time).
  15. Found a good example for using the JUMP command in MIDI MUSIC SYSTEM. Once the notes were entered, I started trying out the patches during playback and found one that seemed to brighten an otherwise dreary day. Of course bells and strings can make any music sound like it was meant for the coming holiday's. This is FIVE PART CANON by Michael Praetorius(1571-1621). Five Part Canon.mp3 -------------------------------------------------------------------------------------- MIDI MUSIC SYSTEM (MMS) has options that can make it easier to work with then its predecessor ADVANCED MUSIC SYSTEM (AMS). The JUMP command is one of them. It works like the GOSUB in BASIC. Voices 1 to 20 are used to output to their assigned MIDI channel 1-16. Voices 21 - 99 can be used to hold sections of music or sequences that can be called from voices 1-20. You can use these sequences by inputting Jn (Jump to voice number n). Just like any subroutine, the music in voice n will play until a RET (return) is encountered. You can expect the same kind of results that might result might get from forgetting to enter a RETURN at the end of a BASIC subroutine. I like to keep it simple but… you can Jump to any one of the voices at anytime from any voice. Things can get pretty messy when you have 5 voices JUMPING around. One subroutine with and extra note can really screw up the timing. (There's a story behind that statement.) The .ATR contains the files for the cannon. Five part cannon.atr I found the music for a FIVE PART CANON by Michael Praeturius in the book "ENJOY YOUR Recorder: The Trapp Family Singers' New complete method of Instruction for the Recorder". Instead of inputting the music in each of the 5 voices, the 10 measures were programed into V21. Then Voices 1 to 5 were used to play the 5 parts. Rests were placed to assure that the music for that voice would come in at the right time. The music as represented by the printed sheet music is in the file FIVEPA21.MUS. CANNON01.MUS developed the music to the next save point. The rest in V21-measure eight was unsettling. A B4Q was put in its place. I wanted v1 to play through 1X before the other 4 voices entered. V22 was programed with 10 whole rests; then V2-5 jumped to V22 before starting. A tie was placed on the last note of music in V21. It is barely noticeable until the end where the extra quarter note is added to the last note played in V2, the last voice to stop playing. The last thing that was done to this file was to transpose the V2 up an octave, V4 down an octave, and V5 down 2 octaves to give it some depth. CANNON02.MUS started out having all the notes beginning at the same time, which made it sound very robotic. No human can play to that accuracy. A slight delay rest was added to 3 voices to make it seem a little less then perfect. V2 was delayed RZ (1/64), V3 got RZ + R^1, and V4 got a RZ+RZ delay. I hope the results are pleasing. CANNON02.MUS was saved and recorded. The Yahama TG-33's P1-13 SP*BelSt preset was used for all voices with only a slight amount of #5 delay effect from the mixer. --------------------------------------------------------------------------------- I have found many MMS music files and 99.9% seem like they may have been converted from AMS files. MMS can do so much more.
  16. Electronic music is a long standing interest that dates back to my 1970s Popular Electronic subscription. Recently I was searching the Buffalo Library's database for the next episodes of Game of Thrones when I decided to search for electronic music. One CD caught my eye with recordings from 9 BA(Before Atari). The list of LPs was much more extensive. That lead to the retrieval of my turn table from a friend, who was going to digitize his collection of LPs for the last 5 years. I have been using it to listen to more early electronic music experiments. This got me to thinking that a recording I had made a few years ago might have made it onto the album, if I hadn't been 50 years to late. Originally titled "Release the Gakken", I decided to rename it to give it a better tie-in to this Atari Age blog. Henceforth it will be known as "Caverns of Zork". Caverns of Zork.mp3 If you decide to listen to this in the dark, let me suggest that you put a new set of batteries in your lantern. About the recording: The recording was an exercise to try out a new mixer and microphone. Three tracks were recorded for this experiment. The same FX on the mixer was used on all tracks. Wish I'd written which effect setting was used but I never thought anyone would ever hear it. The first track is a recording using the Gakken SX-150 Mark II. Just kind of winged it for a few minutes. The other 2 tracks were recordings of frog rasps in front of the microphone . These sounds were made at random; except one moment I broke into a short rhythmic pattern.
  17. Ever wonder if you could output MIDI data to a MIDI synthesizer from your Diamond GOS equipped ATARI 8 bit through a MIDI MAX compatible interface? I didn't think so but I had to ask. And the answer is: YES - {video removed} I came across a MIDI device handler(M:) and blogged about the adventure of writing a test program in ATARI BASIC. I have had the time to try it out with a Diamond GOS program written in machine code using the MAC65 assembler. It seems that the handler, if loaded as an AUTORUN.SYS, will stay operational when quitting to BASIC or when running an APP. The program DMIDITST.APP loads and then sets up the menu bar with a quit command. Then it places 8 icons for the C scale. These where borrowed from a previous program. The M: device is opened for output to the MIDI interface. There is no error checking for the M: device and am not sure what will happen if it's not loaded. I did note that after running SDUMP.ACC, the program stopped working. This was most likely caused by the ACC opening the same IO channel for the printer that was opened for the M: device. Haven't run into an other glitches. On the chance you have an A8, Diamond GOS, MIDI interface and a MIDI sound module, the disk with the m: device, application, source and macro library files is attached. Diamond MIDI test.atr Create a Diamond boot disk with DOS and configuration files. Copy the AUTORUN.SYS and DMIDITST.APP to your boot disk. Hook up your synth, push in your Diamond cart, boot up the system, and load the app. I used DOS 2.5 on an xe with st mouse, Diamond GOS 3 and MIDIMAX. There shouldn't be any reason why the program sill not run under Diamond 2.0. It would be nice to hear that someone else was able to get it to run on their system.
  18. Changing presets/patches/voices/instruments/programs on your MIDI gear was rather easy in the early 80's. Having more the 128 instruments on a digital synth was unbelievable. So unbelievable that the original MIDI standard got a special command number( 192+channel #-1 ) and a 7bit number (0 - 127) to made the change. The MIDI Music System software provided the command Sn to accomplish this. Insert Sn between two notes in a voice and the patch magically changes. Then the future happened and synthesizer manufacturers added banks of 128 instruments. The MIDI controller 32 was assigned the task of controlling the least significant number and controller 0 as the most significant number to designate 128 banks of 128 banks of 128 patches. That's 128*128*128=2097152 patches. Accessing that many instrument voices in MMS requires these commands P32,LSB P0,MSB Sn It is pretty simple as far as MIDI standards are concerned. But..... it seems every manufacture displays patch codes in their own way and deriving these numbers may require a close examination of the manual. I've gone through my MIDI equipment and documented how to calculate the numbers from the front panel displays of the patch information. Your equipment will more then likely be different but you may find this of interest and I'll be able to use it as reference when next I forget. -------------------- MIDIPlus miniEngine USB- a simple midi device with MIDI standard instruments, 127 possible sounds. Three digit display shows sound number. The miniEngine is supplied with a card with the MIDI numbers and names of the patches. MMS command: Sn where n = 0 to 127. Could it be any easier? -------------------- KORG - MicroKorg - This MIDI device contains 128 user definable patches. The patches can be accessed by setting the Dial(bank select) , A/B button(bank side) and the 1-8 buttons(program numbers). These 3 settings define a 7 bit number that sets the patch. The patch displays as (A/B bank side)(Bank Select Dial)(Program button). display = (A/B) (X) (Y) n = (A=0 or B=64)+((X-1)*8))+(Y-1) MMS command: Sn ------------------ Yamaha TG33 - There are 5 banks of 64 voices. 1 - internal programable, 2- Card (card can hold 1 or 2 banks), and 2 - presets. Controller Command 00 and 32 are used to set MSB and LSB for bank. Voice Display = (bank)X.Y Name Set bank (page 104) bank Voice Mode Multi Mode (?) Internal 0 10 Card 1 1 11 Card 2 4 14 Preset 1 2 22 Preset 2 5 25 MMS commands P0,0 MSB P32, bank LSB Sn ,where n = (X-1)*8 + (Y-1) Have not worked with Multi Mode. ----------------- E-MU Proteus 2000 - The Proteus 2000 ships with 4 banks of USER programable memory and 7 banks of COMPSER presets. More programed ROMs can be added. Display: preset location, preset numbers, bank number, name (page 19) MMS command: P0,n Preset location (MSB) USER = 3 COMPSR = 4 more ROM = ? P32,n Bank (LSB) USER = 0-3 COMPSR = 0-7 Sn 0-127 ----------------- KAWAI K1r - Patches can be made as Single(a combination of 4 wave forms) or Multi(a combination of 4 samples. Changing between internal memory and external (card M8) is done on the front panel(I,i,E,e). Single = 0, Multi = 64 Capital letter = 0, Lower case = 32 (I = internal, E = external) A=0,B=8,C=16,D=24 Number = n-1 Single iB-6 = 0 + 32 + 8 + (6-1) = 45 Command S45 Multi IC-4 = 64 + 0 + 16 + (4-1) = 83 Command S83 Switching between internal and card memory during MMS play - unknown how/if it can be done. ----------------- This data is correct until I learn otherwise.
  19. I never really thought about it but a drummer has 2 hands and 2 feet; that's 4 percussion instruments that can be struck at the same time. But are they really? I'm no drummer so the best place to start programming drum patterns was using a book of drum patterns. I chose to start with 200 Drum Patterns by Rene-Pierre Bardet and a chart of the standard MIDI note number for the percussion instruments. MIDI Music System was loaded up and a drum pattern was entered. Two or three voices were used for each pattern - A, B, Break. Then three more MIDI VOICEs were needed to sequence the pattern. I've avoided entering more until now. Trying to understand a voice file data has forced a much deeper understanding of note duration and clock cycles. Notes with the standard duration can be inputted as W, H, Q, E, S ect. or you can input a "^" followed by a 192, 96, 48, 24, 12 ect. clock cycles. As it turns out the drums can be programmed with duration of 1 clock cycle. Play them with a fast tempo and the drum instruments will sound like they were struck at the same time. Of course, MIDI is serial so nothing is played at the same time. "Fast enough" is a rather loose term. The clock cycle is constant for a given note duration. A quarter note is 48 clock cycles. The tempo is used to to set the speed at which the music is played. This a clock cycle period can change from 0.03571 seconds per cycle at 35 beats per minuet to 0.00431 sec/cycle at 290 BPM. Say you want to play a base and snare drum at the start of a 1/16 note. The base and snare are played for 1 cycle and a rest for 10 cycles. That's the 12 cycles required for a sixteenth note. C2^1, D2^1, R^10 or C2^1, D2^11. I have put together a couple of drum solos. RNB1.MUS was without using the ^ duration settings. ROCK1.MUS and RANDB1.MUS were hand coded into MMS voice 51-53. Voice 1 was then programmed with a series of jumps to the patterns. Change up the tempo and hear for yourself when the delay between strikes becomes noticeable. drumtest.atr Now I have a method of programming drum patterns and an understanding of the MMS voice file format. If the M: device works under Diamond GOS I can start automating the task of programming drum patterns.
  20. Using MIDI MUSIC SYSTEM software to build music compositions seems to fit my skill set. I'm not proficient at reading music but I can translate it. My latest arrangement was a Celtic folk song for flute and drums. Music was entered into MMS and a simple drum pattern was added. It sounded terrible. Turns out that a synthesized flute doesn't need to breath and sounds very mechanical without those breaks. Selected notes were shortened and rests were inserted to maintain timing and give the illusion that a breathing person was playing the flute. Sounded much better but it was tedious work. Then I started to think I might have saved a Voice file and used a program to make the changes. Then import the voice back into MMS. Then it dawned on me that I was going to have to figure out the file structure of a voice file and what the data means. At this time I want to share what I think I know about how to create a voice file to import into MMS. Then someday someone (or myself) might write a useful program to create those files. File header and data structure: First thing that was done was to take a look at what a voice data file contained. A few notes were entered in a voice and then the voice was saved. This short program was written to list the content to the screen. Simply change the filename to match the one you wish to view. Use the cntl-1 key to stop and start scrolling. 10 TRAP 100:COUNT=0 20 OPEN #1,4,0,"D:TEMP.V01" 30 GET #1,A:? A;" "; 33 GET #1,A:? A 37 FOR X=1 TO 3 40 GET #1,A 45 COUNT=COUNT+1 50 ? (A), 56 NEXT X 60 ? :GOTO 37 100 ? "COUNT=";:? COUNT This short voice file listing demonstrates the format of the voice file. You may want to build your own voice files and check the results. 24,0 250,0,0 10,48,0 85,48,0 75,48,0 87,48,0 250,0,0 165,48,0 245,51,255 COUNT= 24 It became apparent that the first two bytes will be the number of instructions in the file. LSB - MSB format. Then the instructions are listed. At the end of the a count of the instruction sets is displayed. This should match the 16 bit number at the beginning of the file. An instruction consists of three numbers. The first designates the specific instruction and the next 2 are for any required data. I am assuming that if the data byte is not required by the instruction then MMS does not clear them to zero. That's the only explanation I have for some of numbers I have seen. The first instruction will always be a measure marker(250). Every voice has a measure marker at the beginning. Check it out. Rests and Notes Rest Rn - 0,LSB,MSB n=0 - 65535 cycles In MMS the duration of the rest is its clock value. In MMS you would most likely assign a clock value as W,H,Q,E,S, T, or Z. Their clock values are listed on page 22 of the manual. The "." and " .. " are used to adjust the number of cycles required for the additional durations. There is also the option of setting the duration by entering the clock value as ^n. Keep in mind that meter will determine the clock value in a measure and to keep all the voices synced the total clock value must remain the same for all measures in a composition. (But you don't have to.) Note instructions are between 1 (C1) and 108(G9). If a tie is used bit 7 will be set making the value above 128. To calculate: MMS note number = (MIDI note number - 23) + (128 * IF tie) The duration is set by the next two numbers much the same as for rests. The Table The rest of the instructions are to manipulate the MMS music settings or MIDI instrument. For more information check the manual. If I missed any I'll add the information if I ever find a need to use them. If the Second or Third number's has not been determined then ND has been placed in the table. In fact, it may not have a purpose. Function MMS Input Byte 1 Byte 2 Byte 3 Rest Rn 0 LSB MSB Note (C1-G9)n MIDI# 24-127 MIDI#-23 (+128 if tie) LSB MSB Tempo Tn 240 35-290 ND Sound Sn 241 0-127 ND Program (CC) Pn,x 242 Controller number Setting 0-127 Repeat REPn 243 0 = forever 1-255 ND End Repeat ENDR 244 ND ND Jump to Voice JMPn 245 1-99 ND RETURN RTN 246 ND ND Change Channel /CHn 247 1-16 ND Transpose UP TRUn 248 0-127 ND Transpose Down TRDn 248 Start +256 - n LSB * ND Transpose Zero TRZ 249 ND ND Measure Marker M 250 ND ND Tempo up TUn 251 0-127 ND Tempo down TDn 251 Start +256 -n LSB * ND Pitch Wheel High PWHn 253 ND ND Pitch Wheel Low PWLn 253 ND ND Pitch Wheel Zero PWZ 253 0 ND *= I Think ND = not determined I hope this is a good start to understanding voice files. There are going to be some revisions to this table if I find a need to write a program that will import and export MIDI MUSIC SYSTEM Voice files. That may happen If I find that the M: device driver for the MIDIMax will work with Diamond GOS. I'll incorporate the changes when they are brought to my attention.
  21. Atari 800 user - Compared to now, I guess I was a kid at 30. BASIC was my most used game cart. One puzzle to solve after another. Still haven't figured out all the rules.
  22. I'm thinking about writing some programs to help create MIDI Music System voice files. I've started to decode some of the files and found 5 header bytes then three bytes for each note. There is a lot more to figure out. I can tell this is going to take me some time and wonder if someone might have done this already or know where the information is. I've just started on this quest. I may find some information in the AMS to MMS converter programs or maybe the source code for MMS is out there.
  23. You will want configure your system to avoid using the mouse controller in the Diamond cart. The software is in post #57 and mentioned in the manual. Several programs can't determine if you want to move the cursor or mouse and will crash trying. I have posted most of the software I have written for the Diamond GOS in the blog "Diamond in the Rough". I found an old file on how to turn a CX22 trackball into a mouse and took some photos during the process. Couple of games, an RPN Calculator and some accessories. A couple I put out as shareware they are now in the public domain. Have fun with Diamond GOS.
  • Create New...