I think this schedule will do what you want. The team with the bye is the same as the week number.
F1 F2
W1 G1 (9 7) (3 8)
W1 G2 (9 3) (7 8)
W1 G3 (6 4) (2 5)
W1 G4 (4 5) (6 2)
W2 G1 (1 8) (4 9)
W2 G2 (1 4) (8 9)
W2 G3 (7 5) (3 6)
W2 G4 (5 6) (7 3)
W3 G1 (2 9) (5 1)
W3 G2 (2 5) (9 1)
W3 G3 (8 6) (4 7)
W3 G4 (6 7) (8 4)
W4 G1 (3 1) (6 2)
W4 G2 (3 6) (1 2)
W4 G3 (9 7) (5 8)
W4 G4 (7 8) (9 5)
W5 G1 (4 2) (7 3)
W5 G2 (4 7) (2 3)
W5 G3 (1 8) (6 9)
W5 G4 (8 9) (1 6)
W6 G1 (5 3) (8 4)
W6 G2 (5 8) (3 4)
W6 G3 (2 9) (7 1)
W6 G4 (9 1) (2 7)
W7 G1 (6 4) (9 5)
W7 G2 (6 9) (4 5)
W7 G3 (3 1) (8 2)
W7 G4 (1 2) (3 8)
W8 G1 (7 5) (1 6)
W8 G2 (7 1) (5 6)
W8 G3 (4 2) (9 3)
W8 G4 (2 3) (4 9)
W9 G1 (8 6) (2 7)
W9 G2 (8 2) (6 7)
W9 G3 (5 3) (1 4)
W9 G4 (3 4) (5 1)
It's cyclic in the sense that Weeks 2 to 9 can all be generated from the first week, keep adding one to the team numbers to make the next week, and in the case of team 9 loop back 1.
The games from G1 and G2 combined are one complete round robin. The games from G3 and G4 are the second round-robin.
Hope that helps.