Clockbox

M

MIDI MAN

..
wie schon mal in einem älteren Topic von mir geschrieben will ich nen Gate Signal umwandeln in Midi Clock.
Ich hab gedacht das das CV/Gate2Midi Projekt dafür funktioniert. dann ist mir ja eingefallen das das dann ja nur
Note On/Off ist :roll:

Jetzt müsste ich halt den Quellentext der hex. File ändern, aber von sowas hab ich ja nunmal keine Ahnung.

Was muss ich jetzt hier ändern? :D

Code:
       ; WRITTEN BY:           TOM SCARFF
       ; DATE:                 18/5/2004
       ; ITERATION:            1.0
       ; FILE SAVED AS:        cv2midi.ASM
       ; FOR:                  PIC16F877
       ; CLOCK:                4.00 MHz CRYSTAL                                        
       ; INSTRUCTION CLOCK:    1.00 MHz  T= luS
       ; PROGRAMME FUNCTION:   cv to midi
      

	

	list p=16F877           ; tells the assembler which PIC
	#include "p16F877.inc"  ; general register file


	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF 



; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.


#DEFINE   PAGE0 BCF 3,5       
#DEFINE   PAGE1 BSF 3,5  


;********************************
;      Constant Assignments
;********************************



;********************************
;  Variable Assignment Addresses
;***t****************************
                       ;      20h      Start of General purpose registers
AD_DATA 	EQU     21h
midich	equ	22h
note   equ     25h
val1    equ     26h
val2    equ     27h
value1  equ	28h


		       ;       7fh      end of data area

       ;************************************
       ;       PROGRAMME Reset Point
       ;************************************
              org     00               ; reset vector
		goto init

;*********************************************
;       Start A/D conversion Subroutine
;*********************************************
   
convert bsf ADCON0,2     ;set GO/DONE Bit
        btfsc ADCON0,2
        goto $-1
        rrf     ADRESH,W
        andlw   07Fh
        movwf   AD_DATA
        return

;******************************************
;       transmission complete subroutine
;***************+**************************

txchar   	bsf       STATUS,RP0
                   btfss TXSTA,1   ; test for end of transmission
                   goto  $-1
                   bcf   STATUS,RP0
                   return
   
;*********************************#***
;       Output MIDI note-on data
;**************************************
  
noteon  movf    midich,W 
	addlw   090h ; note-on ch. from midich
        movwf   TXREG   ; send chazacter from W
        call    txchar
   
        movf    note,W
        movwf   TXREG   ; send character from W
        call    txchar
  
        movlw	.64
        movwf   TXREG   ; send character from W
        call    txchar
        return

;*********************************#***
;       Output MIDI note-off data
;**************************************
  
noteoff movf    midich,W 
	addlw   080h ; note-off ch. from midich 
        movwf   TXREG   ; send chazacter from W
        call    txchar
   
        movf    note,W
        movwf   TXREG   ; send character from W
        call    txchar
  
        movlw	.64    
        movwf   TXREG   ; send character from W
        call    txchar
        return


;***********************************************
;       initalise software
;***********************************************
    
init    bcf     STATUS,RP0      ;page 0
        clrf    PORTA
        clrf    PORTB
        clrf    PORTC
        clrf    PORTD
        clrf    PORTE

       
	 PAGE1 
	movlw 0FFh
	movwf TRISB		;all pins inputs	
        movwf TRISA             ;all inputs
	movlw 0Eh
	movwf ADCON1	; Set porta AN0 as analogue I/P's


        movwf TRISD		;all inputs
        
        movlw 07h
        movwf TRISE
    
       
          PAGE0    
	

	; Set up USART

   	 PAGE1 
           bsf     STATUS,RP0      ; goto page 1
           movlw   b'10001111'     ; RC7 is RX input
           movwf   TRISC	   
           movlw   01h             ; 31250 baud for MIDI
           movwf   SPBRG
           movlw   b'00100000'     ; async tx 8 bit
           movwf   TXSTA
           bcf     STATUS,RP0              ; return to page 0
           movlw   b'10010000'     ; async rx 8 bit
           movwf   RCSTA
   
            bsf STATUS,RP0 ; enable weak pull-up resistors	
            movlw 07h        ; rtcc/256
            movwf OPTION_REG
            bcf STATUS,RP0

	movfw PORTC
	andlw 0Fh
	movwf midich

	goto main
;**************************************************************



main 	btfsc PORTC,7	
	goto main


	
ch0	movlw B'01000001' ; channel 0
	movwf ADCON0
	call convert
	movfw AD_DATA
	addlw .24	; shift up two octaves
	movwf note

	call noteon

	btfss PORTC,7	
	goto $-1

	call noteoff
	goto main

	end
;================================================================
 
MIDI MAN schrieb:
wie schon mal in einem älteren Topic von mir geschrieben will ich nen Gate Signal umwandeln in Midi Clock.
Ich hab gedacht das das CV/Gate2Midi Projekt dafür funktioniert. dann ist mir ja eingefallen das das dann ja nur
Note On/Off ist :roll:

Jetzt müsste ich halt den Quellentext der hex. File ändern, aber von sowas hab ich ja nunmal keine Ahnung.

Was muss ich jetzt hier ändern? :D


[/code]


Moin,
du müsstest eine ganze Menge ändern, aber erstmal zur Definition:
Du willst also Gatesignale (aus einem Sequenzer als 1/4 oder 1/8 Noten?) dazu benutzen eine Midi Clock zu generieren.
Die Midi Clock Definition ist 24 MidiClockBytes pro 1/4 Note.
Jetzt müsste die klar werden was dein Programm können muss, die zeitlichen Abstände zwischen zwei aufeinanderfolgenden Gateimpulsen messen und daraus den zeitlichen Abstand der Midi Clock Befehle berechnen und die Midi Clock Befehle senden.
Am Ende des Quellcodes ist die Hauptschleife (main) dort wird der Port C7 gepollt, da wird wohl das Gate anliegen, bei einen negativen Pegel springt er und fängt an den CV Eingang An0 zu messen und sendet ein Note on Befehl, wenn Gate wieder Pos. sendet er den Noteoff.
Dein Problem ist ein ganz anderes, aber die Senderoutine kannst du ja benutzen.

Grüße,
JuBi
 
An Deiner Stelle wuerd' ich das hier als Grundlage nehmen:
http://www.colinfraser.com/m2d/m2d.htm

Das Dingens macht (auch) sync24 zu MIDI clock, geht also schon viel eher in die Richtung.

Theoretisch muesste die .asm so geaendert werden dass der clockteiler nicht 24ppq sondern 16 (oder 8tel?) auf 96ppq wandelt (siehe: http://de.wikipedia.org/wiki/Musical_Instrument_Digital_Interface#MIDI_Clock)

Start/Stop koenntest du mit einem schalter gegen 5V manuell loesen, oder aber auch aus dem programmcode entfernen bzw. abaendern. Oder sogar die Start/Stop Eingangsleitung als Umschalter von 16tel zu 8tel hernehmen?

wat meenste?
 
dank dir, nu muss ich das nur noch für nen 16f877 ändern, und wissen was wo und wie :D
 
nix, nu hab ich die schaltung für den 16f877 schon gebaut,
ok ich könnte ja den kleinen auch nehmen, aber ich müsste immer noch das problem mit dem gate anstatt trigger klären
 

Similar threads



News

Zurück
Oben